现代前端工程为什么越来越离不开Mono

随着前端工程日益复杂,某些业务或者工具库通常涉及到很多个仓库,那么时间一长,多个仓库开发弊端日益显露,由此出现了一种新的项目管理方式——Monorepo。本文主要以Monorepo的概念、MultiRepo的弊端、Monorepo的收益以及Monorepo的落地这几个角度来认识和学习一下Monorepo,文末会有思考题,欢迎大家来踊跃讨论。

什么是Monorepo?

Monorepo其实不是一个新的概念,在软件工程领域,它已经有着十多年的历史了。概念上很好理解,就是把多个项目放在一个仓库里面,相对立的是传统的MultiRepo模式,即每个项目对应一个单独的仓库来分散管理。

现代的前端工程已经越来越离不开Monorepo了,无论是业务代码还是工具库,越来越多的项目已经采用Monorepo的方式来进行开发。Google宁愿把所有的代码都放在一个Monorepo工程下面,Vue3、Yarn、Npm7等等知名开源项目的源码也是采用Monorepo的方式来进行管理的。

一般Monorepo的目录如下所示,在packages存放多个子项目,并且每个子项目都有自己的package.json:

├──packages

├──pkg1

├──package.json

├──pkg2

├──package.json├──package.json

那Monorepo究竟有什么魔力,让大家如此推崇,落地如此之广呢?

MultiRepo之痛

要想知道Monorepo的优势,首先得弄清楚之前的开发方式有什么痛点。

之前传统的方式MultiRepo当中,每个项目都对应单独的一个代码仓库。我之前也是用这种方式开发的,是真真切切地感受到了这种方式带来的诸多弊端。现在就和大家一一分享一下。

1.代码复用

在维护多个项目的时候,有一些逻辑很有可能会被多次用到,比如一些基础的组件、工具函数,或者一些配置,你可能会想:要不把代码直接copy过来,多省事儿!但有个问题是,如果这些代码出现bug、或者需要做一些调整的时候,就得修改多份,维护成本越来越高。

那如何来解决这个问题呢?比较好的方式是将公共的逻辑代码抽取出来,作为一个npm包进行发布,一旦需要改动,只需要改动一份代码,然后publish就行了。

但这真的就完美解决了么?我举个例子,比如你引入了1.1.0版本的A包,某个工具函数出现问题了,你需要做这些事情:

去修改一个工具函数的代码发布1.1.1版本的新包项目中安装新版本的A。

可能只是改了一行代码,需要走这么多流程。然而开发阶段是很难保证不出bug的,如果有个按钮需要改个样式,又需要把上面的流程重新走一遍......停下来想想,这些重复的步骤真的是必须的吗?我们只是想复用一下代码,为什么每次修改代码都这么复杂?

上述的问题其实是MultiRepo普遍存在的问题,因为不同的仓库工作区的割裂,导致复用代码的成本很高,开发调试的流程繁琐,甚至在基础库频繁改动的情况下让人感到很抓狂,体验很差。

2.版本管理

在MultiRepo的开发方式下,依赖包的版本管理有时候是一个特别玄学的问题。比如说刚开始一个工具包版本是v1.0.0,有诸多项目都依赖于这个工具包,但在某个时刻,这个工具包发了一个breakchange版本,和原来版本的API完全不兼容。而事实上有些项目并没有升级这个依赖,导致一些莫名的报错。

当项目多了之后,很容易出现这种依赖更新不及时的情况。这又是一个痛点。

3.项目基建

由于在MultiRepo当中,各个项目的工作流是割裂的,因此每个项目需要单独配置开发环境、配置CI流程、配置部署发布流程等等,甚至每个项目都有自己单独的一套脚手架工具。

其实,很容易发现这些项目里的很多基建的逻辑都是重复的,如果是10个项目,就需要维护10份基建的流程,逻辑重复不说,各个项目间存在构建、部署和发布的规范不能统一的情况,这样维护起来就更加麻烦了。

Monorepo的收益

说清楚MultiRepo的痛点之后,相信你也大概能理解为什么要诞生Monorepo这个技术了。现在就来细致地分析一下Monorepo到底给现代的前端工程带来了哪些收益。

首先是工作流的一致性,由于所有的项目放在一个仓库当中,复用起来非常方便,如果有依赖的代码变动,那么用到这个依赖的项目当中会立马感知到。并且所有的项目都是使用最新的代码,不会产生其它项目版本更新不及时的情况。

其次是项目基建成本的降低,所有项目复用一套标准的工具和规范,无需切换开发环境,如果有新的项目接入,也可以直接复用已有的基建流程,比如CI流程、构建和发布流程。这样只需要很少的人来维护所有项目的基建,维护成本也大大减低。

再者,团队协作也更加容易,一方面大家都在一个仓库开发,能够方便地共享和复用代码,方便检索项目源码,另一方面,git


转载请注明:http://www.aierlanlan.com/cyrz/409.html