Monorepo 和 Multirepo 在前端领域的应用

📚 前言

随着前端项目规模的增长,如何有效地管理多个相关联的项目成为了一个重要课题。Monorepo 和 Multirepo 是两种主流的代码仓库管理策略,各有优劣。本文将深入探讨这两种方案在前端领域的应用。


🎯 什么是 Monorepo 和 Multirepo?

Monorepo(单一仓库)

Monorepo 是将多个项目放在同一个 Git 仓库中管理的策略。

1
2
3
4
5
6
7
8
9
10
my-monorepo/
├── packages/
│ ├── web-app/ # 主应用
│ ├── admin-app/ # 管理后台
│ ├── mobile-app/ # 移动端应用
│ ├── shared-utils/ # 共享工具库
│ └── ui-components/ # UI 组件库
├── package.json
├── pnpm-workspace.yaml
└── turbo.json

代表案例:

  • Google(几乎所有代码都在一个仓库)
  • Meta(Facebook)
  • Babel、React、Vue 3、Next.js

Multirepo(多仓库)

Multirepo 是将每个项目放在独立的 Git 仓库中管理的策略。

1
2
3
4
5
6
organization/
├── web-app/ # 仓库 1
├── admin-app/ # 仓库 2
├── mobile-app/ # 仓库 3
├── shared-utils/ # 仓库 4
└── ui-components/ # 仓库 5

代表案例:

  • 传统企业项目
  • 独立的开源库

🆚 Monorepo vs Multirepo 对比

特性 Monorepo Multirepo
代码共享 ✅ 直接引用,无需发包 ❌ 需要发布 npm 包
原子提交 ✅ 跨项目修改一次提交 ❌ 需要多次提交和协调
依赖管理 ✅ 统一管理,避免版本冲突 ❌ 各自管理,可能版本不一致
构建效率 ✅ 增量构建,缓存优化 ❌ 每个项目独立构建
仓库大小 ❌ 仓库会越来越大 ✅ 每个仓库保持小巧
权限控制 ❌ 较难做细粒度控制 ✅ 可以独立设置权限
学习成本 ❌ 需要学习专用工具 ✅ 传统方式,无需额外学习
CI/CD 需要专门配置 各自独立,简单直接

💡 什么时候选择 Monorepo?

✅ 适合 Monorepo 的场景

  1. 多个项目高度关联

    • 前端 + 后端 + 共享类型
    • 主应用 + 管理后台 + H5
    • 组件库 + 文档站点 + 示例项目
  2. 频繁需要跨项目修改

    • 修改 API 需要同步更新多端
    • 公共组件更新需要立即生效
  3. 统一技术栈

    • 统一的 ESLint、Prettier 规则
    • 统一的构建配置
    • 统一的依赖版本
  4. 团队规模适中

    • 10-50 人的中型团队
    • 跨项目协作频繁

❌ 不适合 Monorepo 的场景

  1. 项目之间完全独立
  2. 不同团队负责不同项目,需要严格权限隔离
  3. 项目技术栈差异巨大
  4. 团队对 Monorepo 工具链不熟悉

🛠️ Monorepo 工具链

1. 包管理器

工具 Workspace 支持 特点
pnpm ⭐ ✅ 速度快、磁盘占用小、严格的依赖
yarn ✅ 成熟稳定、插件生态丰富
npm ✅ (v7+) 原生支持,无需额外配置

2. 构建工具

工具 特点 适用场景
Turborepo ⭐ 增量构建、远程缓存、简单易用 中小型项目
Nx 功能强大、可视化、插件丰富 大型企业项目
Lerna 老牌工具、版本管理 开源库管理
Rush 微软出品、适合超大规模 超大型项目

3. 推荐组合

最佳实践组合:

1
pnpm + Turborepo + Changesets
  • pnpm:包管理
  • Turborepo:任务调度和缓存
  • Changesets:版本管理和发布

🎯 总结

如何选择?

1
2
3
4
5
6
7
8
项目关联紧密?频繁跨项目修改?统一技术栈?
│
├── 是 → Monorepo
│ ├── 中小团队 → pnpm + Turborepo
│ ├── 大型企业 → pnpm + Nx
│ └── 开源库 → pnpm + Changesets
│
└── 否 → Multirepo(传统方案)

核心对比

维度 Monorepo Multirepo
代码共享 直接引用 ✅ 需发 npm 包
版本管理 统一控制 ✅ 各自独立
构建效率 增量 + 缓存 ✅ 独立构建
上手成本 需学工具链 零成本 ✅
权限隔离 较难 天然隔离 ✅

推荐工具链

职责 工具 说明
包管理 pnpm Workspace 支持、速度快、严格依赖
任务调度 Turborepo 增量构建、远程缓存、依赖分析
版本发布 Changesets 变更追踪、CHANGELOG、npm 发布

一句话结论

Monorepo 不是银弹,但当你的项目高度关联、需要频繁跨包协作时,pnpm + Turborepo + Changesets 是当前最佳实践。


📚 相关资源