引言
大家好啊,我是前端拿破轮。😁
作为一名前端开发工程师,git 是我们每天要打交道的东西。我们利用 git 进行分布式的代码管理和版本控制,也让多人协作开发变得更为快捷。
最近在做毕业设计,计划设计一个无人自习室的管理系统 ,包括App用户端 ,Web商家管理端 以及服务端 。也就是说,拿破轮要向着全栈工程师迈进了。😏😏😏
在技术选型上,我决定以React + TypeScript + Nest.js 作为核心技术栈,利用React Native 的跨平台能力来开发 App 用户端,利用 React 开发商家Web系统,利用 Nest.js来开发服务端。
然而当我正在做起来,我才发现很多令人不爽的地方。
重复配置基建
首先就是如果按照传统的模式 ,我们创建3个仓库 ,分别用来存储 App 用户端和 Web 端以及服务端的代码。但是我这三个项目的模块的核心语言都是 TypeScript,所以像tsconfig.json,eslint.config.js,prettier.config.js等很多的配置在三个项目中是通用 的。由于我将他们放在三个不同的 git 仓库中,我需要在每一个仓库中都进行一次重复的配置工作 。😵💫😵💫😵💫此外,一些和技术栈无关的项目配置比如commitlint,husky,cspell等也都需要进行重复配置。
代码重用困难
而且更麻烦的是,由于我这三个模块之间其实是紧密关联的,比如 App 用户端和 Web 端很多的接口都是通用的,DTO(Data Transfer Object)也一样,目前的分仓库做法导致我要在 App 端,Web端和服务端定义很多重复的类型声明文件 来约束DTO。而且这种重复的方式还很容易出现不一致 的问题,当DTO等公用模块修改时,需要在每个仓库中都进行修改,导致了很多重复的工作量。
那么有没有什么样的技术来解决上述问题呢?答案就是我们接下来要展开阐述的monorepo。
什么是monorepo
monorepo全称Monolithic Repository,字面意思是 "整体式的仓库" ,指的是单个 git 仓库中包含多个项目 ,可以进行统一管理。与之相对应的就是multirepo,即Multiple Repository,就是我们过去通常使用的不同的项目存储在不同的 git 仓库中,在多个仓库中分别进行管理。如下图所示:

使用monorepo,能够很好地解决上述问题:
- 三个模块只有一个 git 仓库,所以基建只用搭一次。
- 利用
pnpm等工具的workspace能力直接软链接 最新的公用模块,不用再写重复代码,也避免了不一致的问题。
但是monorepo也不是完全没有缺点:
- 仓库大,克隆,拉取,
CI/CD资源消耗高。 - 难以进行权限控制,拉取仓库后所有代码都可以看见。
所以monorepo比较适合整体代码量不是特别巨大,模块之间耦合紧密,希望统一开发规范,测试和构建按流程 的项目。比如说拿破轮上面提到的毕业设计的场景,App 端和 Web端以及服务端之间有很多公用的模块和功能,耦合比较紧密,而且整个项目代码量不会特别大,所以比较适合采用monorepo进行管理。但是比如说你们公司有一个电商业务,又有一个小游戏的业务,两者分马牛不相及,如果采用monrepo可能会适得其反。
说了这么多,那具体怎么搭建一个
monorepo的项目呢?🧐🧐🧐具体的搭建项目过程,咱们下篇接着聊。
关注本专栏Monorepo项目搭建,带你从0到1搭建一个monorepo项目,快来订阅吧!🤩🤩🤩
总结
好了,这篇文章就到这里啦,如果对您有所帮助,欢迎点赞,收藏,分享👍👍👍。您的认可是我更新的最大动力。由于笔者水平有限,难免有疏漏不足之处,欢迎各位大佬评论区指正。
往期推荐✨✨✨
我是前端拿破轮,关注我,一起学习前端知识,咱们下期见!