纯Monorepo vs 混合式Monorepo

一、开篇:用生活场景理解两种模式

如果要同时管理 "个人博客""通用工具库""公司业务系统" 三个项目,两种模式给出了不同的 "管理方案"------

纯 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 的 "一键联动" 会更高效:

  1. 小团队 / 初创团队:没人专职维护公共库,开发博客时发现工具库缺功能,得自己改工具库再同步业务;

  2. 公共库重大更新:比如组件库从 Vue2 升到 Vue3,业务项目要跟着改引用方式,天天需要联调;

  3. 业务专属公共库:比如电商团队的 "订单工具库",只服务订单业务,业务改需求就得同步改工具库;

  4. ToB 定制需求:客户要在报表页加特殊筛选,得改公共表格组件,再同步到业务项目,周期短要求快。

而混合式 Monorepo 能兼顾:日常用 "独立仓库 + 发版" 保证稳定,遇到以上场景用 "本地关联" 临时联动,不用强行合并仓库。

四、实际操作:两种模式怎么用?

案例 1:新增 "日历组件库"

  • 纯 Monorepo
  1. 根仓库新建 packages/日历组件

  2. 博客项目直接引用 import 日历 from '@我的仓库/日历组件'

  3. 一次提交:git commit -m "新增日历组件+博客接入"

  • 混合式 Monorepo
  1. 单独建 "日历组件" 仓库,开发完发私有 npm 包(用 Verdaccio);

  2. 博客项目执行 pnpm install @我的账号/日历组件

  3. 两次提交:先提交组件库,再提交博客项目。

案例 2:修复工具库 bug(高频联动场景)

  • 纯 Monorepo
  1. packages/工具库 的 bug;

  2. 切换到博客项目验证;

  3. 一次提交搞定。

  • 混合式 Monorepo
  1. 日常:改工具库→发版 v1.0.1→博客项目 pnpm update→提交;

  2. 紧急联动:用 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 起步,团队变大分工明确后,过渡到混合式;也可以直接用混合式,兼顾稳定和灵活 ------ 核心是让模式适配你的开发节奏~

相关推荐
lihaozecq1 分钟前
Agent 开发的 skills 机制设计 - 渐进式披露
前端·agent·ai编程
安生生申5 分钟前
uni-app 连接 JDY-31 蓝牙串口模块实践
c语言·前端·javascript·stm32·单片机·嵌入式硬件·uni-app
winlife_6 分钟前
嵌入式 MCP server vs 外挂桥接进程:引擎编辑器自动化的架构取舍
架构·自动化·编辑器·游戏引擎·架构设计·mcp·编辑器自动化
Restart-AHTCM9 分钟前
LangChain学习之模型 I/O 与输出解析器 (Output Parsers)(3/8)
前端·学习·langchain
lqj_本人10 分钟前
鸿蒙PC:electron-markdownify 从普通 Electron 迁移到 OpenHarmony Electron HAP 的完整实践
前端·javascript·electron
LabVIEW开发8 小时前
LabVIEW QMH 队列消息处理架构
架构·labview·labview知识·labview功能·labview程序
代码搬运媛8 小时前
Jest 测试框架详解与实现指南
前端
counterxing9 小时前
我把 Codex 里的 Skills 做成了一个 MCP,还支持分享
前端·agent·ai编程
wangqiaowq9 小时前
windows下nginx的安装
linux·服务器·前端
rising start9 小时前
二、全面理解MySQL架构
mysql·架构