目前云音乐内有多个RN收银台场景分布在不同的工程,比如页面收银台,浮层收银台,个性收银台等,后续可能还会有别的收银台场景。

那在开发过程中存在的问题就是每个收银台的核心逻辑如商品展示、支付方式展示、下单购买等逻辑都大致相同,而每次有修改或者新增需求的时候都需要开发多次,重复代码较多效率低下。

虽然可以通过发npm包的形式复用代码,但是有些组件和代码块不太好抽成包,还会带来调试麻烦,发版等问题。所以为了提高代码复用,提高开发效率,我们希望能够在一个仓库内包含多个工程,也就是Monorepo形式。

Monorepo 什么是Monorepo Monorepo是一种将多个项目的代码集中在同一个仓库中的软件开发策略,与之对立的是传统的MultiRepo策略,即每个项目在一个单独的仓库进行管理。 Monorepo vs MultiRepo 目前像社区内一些著名的开源项目Babel、React和Vue等都是用这种策略来管理代码。

Monorepo解决的问题 要想知道Monorepo解决了哪些问题与其优势,我们先来看下MultiRepo存在的问题。

当我们在MultiRepo下两个工程之前需要复用一些代码时,往往会采用抽成npm包的形式。但当npm包有改动时我们需要做以下事情:

修改npm包代码,通过npm link与两个工程调试 调试完成后发布新版本 两个工程升级npm包新版本,再进行发布 整个流程可以看出还是比较繁琐的,那如果是在Monorepo下我们可以将公共部分抽成一个workspace,我们的两个工程分别也是workspace可以直接引用公共workspace的代码,工具会帮我们管理这些依赖关系,开发过程中调试起来也非常方便,而且不涉及到发包,版本依赖等,公共部分代码改动完成后两个工程部署即可。

从上述可以看出Monorepo主要有代码复用容易、调试方便和简化依赖管理等优点,这也是我们选择这个方案的原因。

当然Monorepo也有一些缺点,比如:仓库体积大、工程权限不好控制等。所以不管是Monorepo还是MultiRepo都不是完美的方案,只要能解决当下的问题就是好方案。