在现代前端项目日益复杂的今天,我们越来越多地面对一个场景:多个项目共享逻辑、组件和依赖,而维护和构建效率却在不断拉垮。这种情况下,传统项目结构的痛点就显现无遗。
从我亲身实践来看,选择 pnpm + TurboRepo 构建 Monorepo 架构,是我过去两年里提升团队协作效率最重要的一次架构升级。构建速度快、依赖清晰、协作高效,让我们实现了从“手动复制粘贴”到“模块化协同开发”的飞跃。
🧠 为什么选择 Monorepo?
Monorepo 并不新鲜,但它解决了多个项目协作的核心问题:
- 多个包共享公共模块(UI库、工具函数、hooks等)
- 可集中管理依赖版本,避免版本地狱
- 能够跨项目统一 CI/CD 流程与测试
在实际项目中,最典型的 Monorepo 应用如:
apps/
:前台 Web 应用、后台管理系统、小程序等多个前端入口packages/
:通用组件库、接口 SDK、工具函数库、hooks 集合等
🚀 为什么是 pnpm + TurboRepo?
✅ pnpm 的优势
- 真正的多项目间硬链接复用依赖,磁盘占用极小,安装速度极快
- Workspace 支持一流,天然适配 Monorepo
- 锁文件小,结构清晰,冲突少
✅ TurboRepo 的优势
- 原生支持 pnpm workspace,0 配置即可启动
- 基于任务缓存(remote/local)+依赖图调度实现构建加速
- 支持按任务分项目并发执行(如只构建有变动的包)
- 可以集成 Vercel Remote Cache,实现多端构建缓存同步
📁 项目结构示意
my-monorepo/
├── apps/
│ ├── web/ # 用户前台
│ └── admin/ # 后台管理系统
│
├── packages/
│ ├── ui/ # 通用组件库
│ ├── utils/ # 工具函数库
│ └── api-sdk/ # 请求 SDK
│
├── turbo.json # TurboRepo 配置
└── pnpm-workspace.yaml # pnpm workspace 配置
⚙️ 快速配置步骤
1. 初始化项目
mkdir my-monorepo && cd my-monorepo
pnpm init -y
pnpm add -D turbo
2. 创建配置文件
pnpm-workspace.yaml
packages:- "apps/*"- "packages/*"
turbo.json
{"pipeline": {"build": {"dependsOn": ["^build"],"outputs": ["dist/**"]},"dev": {"cache": false}}
}
3. 创建子项目
mkdir -p apps/web && cd apps/web
pnpm init -y
pnpm add react react-dom
pnpm add -D typescript vite
然后在每个子项目中配置 build
, dev
脚本。例如:
"scripts": {"dev": "vite","build": "vite build"
}
4. 启动并行任务
在根目录执行:
pnpm turbo run build --filter=web
TurboRepo 会自动分析依赖关系,并只构建有变更的项目。
⚡ 实际提效体现
- 项目构建时间从分钟级缩短到秒级(得益于缓存)
- 新成员克隆项目后
pnpm install
一次即可启动所有子项目 - 模块更新后自动触发对应子项目重新构建,无需手动清理缓存或强制 rebuild
- 多人协作中避免因版本不一致导致的问题
🧩 常见问题 & 解决方案
Q1: 每次构建还是很慢?
确保配置了
outputs
字段,Turbo 才能启用缓存。
Q2: 如何发布单个包?
搭配
changesets
实现包版本自动管理 + 发布
Q3: 和 Lerna 比呢?
Turbo 更轻量现代,结合 pnpm 更高效。Lerna 已经不再主推。
🧠 总结
pnpm + TurboRepo 是当前构建高效前端多项目体系的黄金组合。
它不仅能提升构建效率,更重要的是:
让多项目协作真正“像一个项目一样自然”地流动起来。
如果你还在为多个项目构建时间长、依赖管理混乱、协作不顺发愁,不妨试试这套组合。相信我,用了它,你很难再回去。