Skip to content
扫码开始移动端阅读

别再纠结了!一文看透 Monorepo 与 MultiRepo 的爱恨情仇

1342
需要≈
6.71
分钟
JavaScript
架构
pnpm

还在为一个项目开十个仓库?还在为公共组件改个 bug 就要发布 N 个包而抓狂?

兄弟,你可能需要了解一下 Monorepo 了。当然,如果你觉得管理一个巨型仓库像是在维护一颗随时会爆炸的核弹,那么 MultiRepo 或许才是你的真爱。

核心差异

Monorepo(单体仓库)将所有关联代码聚合成一个仓库;MultiRepo(多仓库)则将各项目拆分至独立仓库。

一、核心区别:从存储到协作的全维度 PK

两者的差异贯穿代码存储、依赖管理、协作流程等全链路。废话不多说,先看对比表:

对比维度Monorepo (基于 pnpm)MultiRepo (传统模式)
代码存储所有项目(Web、小程序、公共库)都在 1 个仓库,按目录划分。每个项目独立成仓,仓库数量随项目线性增长。
依赖管理硬链接机制,全局存储、全量共享。版本统一,没冗余。各项目独立安装。容易出现“你用 v3,我用 v4”的版本碎片化。
跨项目修改修改公共组件,子项目实时生效。一键构建,一次提交。修改、测试、发布、更新、再测试。同步成本高到离谱。
版本发布批量协调,关联功能同步发布。告别版本断层。各发各的,全靠手动协调。容易出现“部分更新”的尴尬。
磁盘占用极低(3 个项目约 80MB)。极高(3 个项目约 450MB)。

1.1 依赖管理:谁更省空间?

Monorepo(基于 pnpm)流程:

MultiRepo 流程:

1.2 跨项目修改:谁更丝滑?

Monorepo 修改流程:

MultiRepo 修改流程:

二、Monorepo(单体仓库):真香还是真累?

2.1 为什么大家都说“真香”?

  • 依赖共享的神器:基于 pnpm 的硬链接,3 个项目能省下近 80% 的磁盘空间。更重要的是,通过 pnpm-workspace.yaml 统一版本,再也不会遇到“本地好使,上线崩了”的版本兼容坑。
  • 协作效率直接起飞:修改一个 packages/utils 里的函数,所有 apps 下的项目瞬间同步。以前要搞半天的跨项目联调,现在只要 1 分钟。
  • 规范统一,新人救星:一套 ESLint、Prettier、Vite 配置全家桶。新人进来只需克隆一个仓库,半天就能上手,再也不用在十几个仓库之间反复横跳。
  • 增量构建,拒绝摸鱼:配合 Turborepo,只构建改动过的部分。以前全量构建要 10 分钟,现在可能只要 3 分钟。

2.2 它的“坑”在哪?

  • 仓库体积会“膨胀”:代码多了确实慢。不过 pnpm 支持稀疏检出,只拉你需要的目录,能缓解不少。
  • 权限管理略显蛋疼:虽然可以通过 GitLab 的目录权限来搞,但配置起来确实比直接给仓库权限麻烦一点。
  • 学习成本:得学会 pnpm workspacefilterchangesets 这一套工具链。初次搭建可能得掉两根头发。

三、MultiRepo(多仓库):老牌选手的尊严

3.1 它的优点依然能打

  • 轻量、纯粹:一个仓库就干一件事,简单直接。不需要什么复杂的 Workspace 配置。
  • 权限隔离非常完美:A 团队看 A 仓库,B 团队看 B 仓库,互不干扰,安全感爆棚。
  • 风险隔离:一个仓库的 CI/CD 挂了,不会影响其他项目的发布。

3.2 它的硬伤也挺疼

  • 依赖冗余,版本地狱:随着项目变多,维护成本呈指数级增长。排查一个 lodash 版本不一致导致的 bug,可能会让你怀疑人生。
  • 重复劳动:每个项目都要配置一遍规范,每个项目都要配置一遍 CI/CD。生命苦短,为什么要浪费在这些重复的事情上?

四、总结:我到底该怎么选?

别听那些大厂吹什么 Monorepo 才是未来,适合你的才是最好的

建议选 Monorepo 的场景

  1. 关联性极强:多个项目共享大量的公共组件、工具函数或类型定义。
  2. 全栈开发:前端、后端、管理后台都在一套逻辑下。
  3. 追求极致效率:团队厌倦了频繁的包发布和版本更新。

建议选 MultiRepo 的场景

  1. 项目之间基本没关系:比如一个做商城,一个做官网,八竿子打不着。
  2. 团队权限极其敏感:不同团队之间绝对不能互相看代码。
  3. 快速原型开发:就是个临时的小活,没必要搞那套复杂的架构。