Skip to content

📘 啥是Monorepo啊?

✍️ 作者:桑榆
🕓 更新时间:2025-10-25
🧠 关键词:Monorepo


最近突发奇想,想写一套组件库,到时候打包成一个 npm 包,供我的其他项目使用,那成就感满满啊? 但是查阅一下,写一套组件库,需要考虑很多问题,比如:

  1. 组件库的目录结构
  2. 组件库的代码规范
  3. 组件库的文档编写
  4. 组件库的发布流程

到时候还得单元测试,确保组件的质量。 那我就想,能不能把这些问题都解决掉,只需要维护一个仓库,就可以了? 于是找到了Monorepo的概念,它的意思是在一个仓库中管理多个项目

举个例子:

模式仓库结构举例
Multirepo(多仓库)每个项目一个独立仓库前端仓库、后端仓库、工具仓库分开
Monorepo(单仓库)所有项目放在一个仓库一个仓库里包含前端、后端、工具、包等所有代码

就像是: •Multirepo:每个成员自己住一栋小房子。 •Monorepo:大家都住进了同一栋大别墅,不同房间(子项目)各自干活。

🧱 二、Monorepo 的核心思想

“共享代码、统一管理、独立开发、集中构建”

Monorepo 不是把代码全堆一起,而是通过工具和结构把它组织成一套清晰的工程体系。 通常会有类似结构:

text
/my-company
├── apps/
│    ├── web/
│    ├── mobile/
│    └── admin/
├── packages/
│    ├── ui/
│    ├── utils/
│    └── api/
├── tools/
└── tsconfig.json

这里: • apps/ 放最终运行的应用; • packages/ 放公共组件或工具; • tools/ 放脚本、CI 配置等; • 整个仓库用统一的构建和测试系统管理。

⚙️ 三、Monorepo 常用工具

Monorepo 通常配合一些“管理工具”使用,例如:

工具语言/生态特点
NxJavaScript/TypeScript智能依赖图、缓存机制、构建优化
TurborepoJavaScript/TypeScript快速并行构建、远程缓存
LernaJavaScript/TypeScript早期经典方案,管理多包发布
Bazel多语言Google 内部使用,强大但配置复杂
RushJavaScript/TypeScript微软支持,适合大型团队

这些工具可以:

  • 只构建有改动的包;
  • 管理跨项目依赖;
  • 控制不同包的版本;
  • 自动发布。

Monorepo有什么优点:

  1. 统一依赖版本

    所有项目使用同一套依赖库,不会出现 “A 用 React17,B 用 React18” 的问题。

  2. 共享代码更方便

    公共工具包直接 import 使用,不需要单独发布 npm 包。

  3. 整体一致性强

    代码规范、测试、CI/CD 流程可以统一。

  4. 协作更高效

    改动一个公共模块,所有依赖它的项目都能立即测试验证。

woc,有点牛逼,那monrepo总有点缺点吧。

是的当然会有。缺点就是

  1. 仓库体积大

    随着项目增多,clone 和安装依赖时间会变长。

  2. 构建复杂度提升

    需要构建工具智能地识别“哪些项目受影响”,否则构建时间会爆炸。

  3. 权限控制不够细粒度

    所有团队都能看到整个仓库的代码,不适合完全独立的业务组。