一、开篇:用生活场景理解两种模式
如果要同时管理 "个人博客""通用工具库""公司业务系统" 三个项目,两种模式给出了不同的 "管理方案"------
纯 Monorepo:"一家人住同一套大公寓"
所有项目都放进一个 Git 仓库(相当于一套大公寓),共用 "水电燃气"(工程化配置,如 ESLint、构建工具)和 "家具家电"(依赖包,如 React、Vue)。改工具库的代码,博客项目立刻能用上,不用 "搬东西"(发版、升级)。
混合式 Monorepo:"邻居住同一小区,共用健身房 + 偶尔串门借东西"
每个项目还是独立的 Git 仓库 (相当于小区里的不同住户),但都放进同一个文件夹(如 apps/,相当于小区),共用 "公共设施"(pnpm 依赖缓存、turbo 构建加速);遇到需要改工具库的情况,能临时 "串门借东西"(本地关联公共库代码),改完后再 "归位"(公共库发版、业务项目升级)。
二、核心对比:8 个维度讲透差异
| 对比维度 | 纯 Monorepo | 混合式 Monorepo |
|---|---|---|
| 1. 仓库结构 | 1 个 Git 仓库,所有项目是仓库内的子目录(如 packages/工具库、apps/博客) |
N 个独立 Git 仓库,放在同一目录下(如 apps/博客 内有自己的 .git 文件夹) |
| 2. 项目联动 | 改公共库后,业务项目实时生效,1 次提交同步所有变更 | 日常:公共库发版 + 业务项目升级;特殊场景:本地关联公共库,改完后分别提交 |
| 3. 依赖管理 | 全仓库依赖统一在根目录 package.json 管理,子项目直接引用本地目录 |
日常:各项目独立 package.json,共用 pnpm 缓存;特殊场景:pnpm link 本地关联公共库 |
| 4. 准备工作 | 需配置 "工作区"(如 pnpm workspaces),指定子项目目录 | 零配置门槛:克隆独立仓库到同一文件夹,特殊场景加 pnpm link 即可 |
| 5. 典型工具 | 工作区工具:pnpm workspaces、Lerna、Turborepo(全仓库构建) | 缓存工具 + 关联工具:pnpm(缓存 + link)、turbo(单项目加速)、Verdaccio(私有包仓库) |
| 6. 版本控制 | 所有项目共用一套版本记录,工具库升级 = 仓库整体提交 | 每个项目独立版本,公共库版本和业务项目版本分开管理 |
| 7. 团队协作 | 适合 "全栈式协作":同一批人既改业务又维护工具库 | 适合 "分工 + 灵活协作":基建组管公共库,业务组管项目,特殊场景临时联动 |
| 8. 迁移成本 | 需合并多个独立仓库代码,整理历史提交 | 直接把现有仓库放进同一目录,特殊场景加本地关联配置 |
三、关键场景:什么时候需要高频联动?
虽然大部分时候公共库很稳定,但以下 4 种情况,纯 Monorepo 的 "一键联动" 会更高效:
-
小团队 / 初创团队:没人专职维护公共库,开发博客时发现工具库缺功能,得自己改工具库再同步业务;
-
公共库重大更新:比如组件库从 Vue2 升到 Vue3,业务项目要跟着改引用方式,天天需要联调;
-
业务专属公共库:比如电商团队的 "订单工具库",只服务订单业务,业务改需求就得同步改工具库;
-
ToB 定制需求:客户要在报表页加特殊筛选,得改公共表格组件,再同步到业务项目,周期短要求快。
而混合式 Monorepo 能兼顾:日常用 "独立仓库 + 发版" 保证稳定,遇到以上场景用 "本地关联" 临时联动,不用强行合并仓库。
四、实际操作:两种模式怎么用?
案例 1:新增 "日历组件库"
- 纯 Monorepo:
-
根仓库新建
packages/日历组件; -
博客项目直接引用
import 日历 from '@我的仓库/日历组件'; -
一次提交:
git commit -m "新增日历组件+博客接入"。
- 混合式 Monorepo:
-
单独建 "日历组件" 仓库,开发完发私有 npm 包(用 Verdaccio);
-
博客项目执行
pnpm install @我的账号/日历组件; -
两次提交:先提交组件库,再提交博客项目。
案例 2:修复工具库 bug(高频联动场景)
- 纯 Monorepo:
-
改
packages/工具库的 bug; -
切换到博客项目验证;
-
一次提交搞定。
- 混合式 Monorepo:
-
日常:改工具库→发版 v1.0.1→博客项目
pnpm update→提交; -
紧急联动:用
pnpm link ../工具库本地关联→改完工具库直接验证→工具库发版 + 博客项目升级→分别提交。
四、工具选型:两种模式的 "好搭档"
纯 Monorepo 必备工具
| 工具名称 | 作用 | 简单用法 |
|---|---|---|
| pnpm workspaces | 管理全仓库依赖和子项目目录 | 根目录写 packages: ['packages/*', 'apps/*'] |
| Turborepo | 全仓库增量构建,一次启动所有项目 | turbo run dev 根目录执行 |
| Lerna | 批量给子项目发版 | lerna publish 一键升版本 |
混合式 Monorepo 常用工具
| 工具名称 | 作用 | 简单用法 |
|---|---|---|
| pnpm | 依赖缓存 + 本地关联公共库 | pnpm link ../工具库 关联;pnpm install 用缓存 |
| Verdaccio | 搭私有 npm 仓库,存公共库包 | 启动后 npm publish --registry 本地地址 |
| turbo | 加速单个项目构建启动 | 进入博客目录 turbo dev |
五、常见问题解答
Q1:纯 Monorepo 仓库会越来越大吗?
不会!根目录 .gitignore 排除 node_modules/(依赖不进仓库)、dist/(构建产物不进仓库),大文件用 Git LFS 存,体积可控。
Q2:混合式 Monorepo 能复用工具库代码吗?
当然!日常用私有 npm 包(Verdaccio)安装引用,紧急情况用 pnpm link 本地关联,两种方式都能复用。
Q3:团队变大后能切换模式吗?
-
混合式→纯 Monorepo:把所有仓库代码合并到一个新仓库,配好工作区即可;
-
纯 Monorepo→混合式:拆分需要独立的项目,初始化新仓库发私有包,其他项目安装引用。
六、选型指南:3 步选对模式
第一步:看 "联动频率"
-
每周都要改公共库 + 业务代码→纯 Monorepo;
-
半年改一次公共库,日常只开发业务→混合式 Monorepo。
第二步:看 "团队分工"
-
3-5 人小团队,一人多岗→纯 Monorepo;
-
10 人以上,基建组和业务组分工明确→混合式 Monorepo。
第三步:看 "灵活度需求"
-
想少配置,快速启动→混合式 Monorepo(克隆仓库就能用);
-
愿意花 10 分钟配工作区,换长期高效→纯 Monorepo。
七、总结:没有 "最优",只有 "适配"
-
纯 Monorepo 是 "高效联动派":适合高频改公共库、小团队协作,用 "一次提交" 省时间;
-
混合式 Monorepo 是 "稳定灵活派":适合分工明确、公共库稳定的场景,日常稳定 + 紧急联动两不误。
不用纠结 "必须选哪种",小团队可以先从纯 Monorepo 起步,团队变大分工明确后,过渡到混合式;也可以直接用混合式,兼顾稳定和灵活 ------ 核心是让模式适配你的开发节奏~