📘 啥是Monorepo啊?
✍️ 作者:桑榆
🕓 更新时间:2025-10-25
🧠 关键词:Monorepo
最近突发奇想,想写一套组件库,到时候打包成一个 npm 包,供我的其他项目使用,那成就感满满啊? 但是查阅一下,写一套组件库,需要考虑很多问题,比如:
- 组件库的目录结构
- 组件库的代码规范
- 组件库的文档编写
- 组件库的发布流程
到时候还得单元测试,确保组件的质量。 那我就想,能不能把这些问题都解决掉,只需要维护一个仓库,就可以了? 于是找到了Monorepo的概念,它的意思是在一个仓库中管理多个项目。
举个例子:
| 模式 | 仓库结构 | 举例 |
|---|---|---|
| Multirepo(多仓库) | 每个项目一个独立仓库 | 前端仓库、后端仓库、工具仓库分开 |
| Monorepo(单仓库) | 所有项目放在一个仓库 | 一个仓库里包含前端、后端、工具、包等所有代码 |
就像是: •Multirepo:每个成员自己住一栋小房子。 •Monorepo:大家都住进了同一栋大别墅,不同房间(子项目)各自干活。
🧱 二、Monorepo 的核心思想
“共享代码、统一管理、独立开发、集中构建”
Monorepo 不是把代码全堆一起,而是通过工具和结构把它组织成一套清晰的工程体系。 通常会有类似结构:
/my-company
├── apps/
│ ├── web/
│ ├── mobile/
│ └── admin/
├── packages/
│ ├── ui/
│ ├── utils/
│ └── api/
├── tools/
└── tsconfig.json这里: • apps/ 放最终运行的应用; • packages/ 放公共组件或工具; • tools/ 放脚本、CI 配置等; • 整个仓库用统一的构建和测试系统管理。
⚙️ 三、Monorepo 常用工具
Monorepo 通常配合一些“管理工具”使用,例如:
| 工具 | 语言/生态 | 特点 |
|---|---|---|
| Nx | JavaScript/TypeScript | 智能依赖图、缓存机制、构建优化 |
| Turborepo | JavaScript/TypeScript | 快速并行构建、远程缓存 |
| Lerna | JavaScript/TypeScript | 早期经典方案,管理多包发布 |
| Bazel | 多语言 | Google 内部使用,强大但配置复杂 |
| Rush | JavaScript/TypeScript | 微软支持,适合大型团队 |
这些工具可以:
- 只构建有改动的包;
- 管理跨项目依赖;
- 控制不同包的版本;
- 自动发布。
Monorepo有什么优点:
✅ 统一依赖版本
所有项目使用同一套依赖库,不会出现 “A 用 React17,B 用 React18” 的问题。
✅ 共享代码更方便
公共工具包直接 import 使用,不需要单独发布 npm 包。
✅ 整体一致性强
代码规范、测试、CI/CD 流程可以统一。
✅ 协作更高效
改动一个公共模块,所有依赖它的项目都能立即测试验证。
woc,有点牛逼,那monrepo总有点缺点吧。
是的当然会有。缺点就是
❌ 仓库体积大
随着项目增多,clone 和安装依赖时间会变长。
❌ 构建复杂度提升
需要构建工具智能地识别“哪些项目受影响”,否则构建时间会爆炸。
❌ 权限控制不够细粒度
所有团队都能看到整个仓库的代码,不适合完全独立的业务组。
