零、灵魂拷问--你为什么要搜索 pnpm、Monorepo?
快速分流,高效解决🤩好奇的学习者和😉聪明的伸手党的要求。
🔗 阅读路线图:
- 【😉聪明的伸手党】想直接获取开箱即用模板?👉 点击空投到模版 GitHub 仓库
- 【🤩好奇的学习者】想系统学习Monorepo?继续往下看▼
🤔 你为什么想了解 Monorepo?
- 因为 Cool,看到大厂都在用,想让自己项目看起来更"专业"?
- 受够了在多仓库之间反复横跳,想统一管理?
- 每次联调都像在玩真人版大家来找茬,急需解决方案?
- 听说能提升构建速度,想给CI/CD流水线装火箭引擎?
(如果中了任意一条,请系好安全带继续阅读🚀)
一、Monorepo入门手册(人类友好版)
1.1 什么是 Monorepo?
想象把公司所有部门装进一个智能办公楼:
- 🏢 分层管理:每层独立部门(项目)但共享水电(工具链)
- 🚪 任意穿梭:法务部随时调用财务部的Excel模版(共享代码)
- 🛗 智能电梯:自动识别人员轨迹(依赖追踪)
- 🧯 统一消防:一处着火全员预警(全局代码检查)
1.2 为什么要用 Monorepo?
- 🚀 依赖共享:公共依赖安装一次,省下的时间够看三集《猫和老鼠》
- 🧩 组件复用:跨项目共享UI组件,像乐高一样随心组合
- 🔍 上帝视角:所有代码尽收眼底,再也不用玩仓库捉迷藏
- ⚡ 统一构建:一条咒语启动所有项目,比泡面还快
- 🛠 规范统一:共享配置就像复制粘贴,但比Ctrl+C/V优雅100倍
- ⏳ 时间刺客:减少70%重复安装依赖时间
- 🕵️ 量子纠缠:修改公共代码立即全局生效
- 📊 数据透析:可视化整个代码宇宙的依赖关系
- 🚧 安全围栏:通过工作区隔离实现"沙盒开发"
二、手把手搭建pnpm Monorepo(含防秃指南)
2.1 环境准备
确保装备齐全:
- Node.js ≥20(建议用 fnm 管理多个 Node 版本,极其方便!)
- pnpm ≥9(npm的涡轮增压版)
# 安装宇宙最快包管理器
npm install -g pnpm@latest --registry=https://registry.npmmirror.com
2.2 初始化项目
mkdir quick-mono && cd quick-mono
pnpm init # 这会生成你的后悔药(package.json)
2.3 配置workspace
创建pnpm-workspace.yaml
(魔法阵核心):
packages:
- 'packages/**' # 组件库藏宝阁
- 'apps/*' # 应用城堡
推荐目录结构(强迫症治愈版),举例如下:
(每个目录的子目录也有讲究的规范化建议,具体可以前往模板仓库👉 quick-mono查看。)
├── apps/
│ ├── web-app/ # 用户大厅(React)
│ └── admin-app/ # 管理密室(Vue)
├── packages/
│ ├── utils/ # 工具百宝箱
│ └── ui-components # UI魔法商店
└── package.json # 魔法契约
2.4 创建示例项目
这里选择 vite 进行快速创建项目(React 和 Vue 模板)。当然了,你可以选择自己细化的任意技术栈,连撸天又撸地的 JQuery 也可以。
# 创建前端双雄
pnpm create vite apps/web-app --template react-ts
pnpm create vite apps/admin-app --template vue
# 创建共享宝库
mkdir -p packages/utils && cd $_ && pnpm init --name @quick-mono/utils
mkdir -p packages/ui-components && cd $_ && pnpm init --name @quick-mono/ui
2.5 配置依赖共享
在项目 web-app 的 package.json 手动添加魔法咒语,举例:
{
"dependencies": {
"@quick-mono/utils": "workspace:*", // 本地星号通配符
"@quick-mono/ui": "workspace:*" // 比异地恋稳定100倍
}
}
一键安装所有依赖(告别npm install马拉松):
pnpm install # 速度快的像有人按了快进键⏩
三、接入Turbo加速构建(速度与激情版)
3.1 安装Turbo
pnpm add turbo --global # 全局安装涡轮增压器
pnpm add turbo -D -w # 给项目装上氮气加速
3.2 配置turbo.json(超速秘籍)
{
"pipeline": {
"build": {
"dependsOn": ["^build"], // 依赖拓扑排序
"outputs": ["dist/**"], // 构建产物路径
"cache": true // 开启记忆魔法
},
"dev": {
"cache": false // 开发模式关闭缓存
}
}
}
3.3 配置脚本命令
全局package.json添加:
{
"scripts": {
"build": "turbo run build", // 一键构建全家桶
"dev": "turbo run dev --parallel" // 并行启动像开了影分身
}
}
3.4 体验量子速读式构建
首次构建(假装在加载):
pnpm build # 这可能是你最后一次看到完整构建进度条
看我本地运行的效果,6.16s 完事。
修改后构建(真实速度):
pnpm build # Turbo的缓存让构建像开了写轮眼👁
再 build 一把,196ms 光速完事。
四、常见问题区(FAQ)
❓ Q1:Monorepo会导致仓库体积爆炸吗? 💡 通过pnpm
硬链接+turbo
缓存,实际磁盘占用比分开存储更少。就像把100个相同水杯放进魔法收纳盒,实际只占1个杯子的空间
❓ Q2:现有项目迁移会秃头吗? 💡 推荐渐进式迁移: 1️⃣ 用git subtree
把公共代码提成子模块 2️⃣ 在Monorepo中创建legacy
目录存放旧项目 3️⃣ 新功能都用Monorepo开发,逐步替换
❓ Q3:如何控制权限边界?
💡 可用这些组合拳:
- 🛡
workspace:
协议限定内部依赖 - 🔐 通过
changesets
管理包版本 - 📦 使用
private: true
标记私有包
❓ Q4: Monorepo适合个人项目吗? 💡 就像问"单人公寓需要厨房吗"——小项目用多仓库像用菜刀切牛排,Monorepo就是你的瑞士军刀,即使一个人也值得优雅!
❓ Q5: 我知道你还有很多问号? 💡 比如:我要怎么构建某个packages/xxx包呀?我要来回切换目录执行构建脚本吗?等等等等,评论区见吧。😉😉不是难事,就留给大家探讨探讨啦~~~
🚀 开箱即用模板:quick-mono ✨ 包含已配置好的常用目录结构,克隆即用,保证比安装微信还简单!
🎁 毕业礼物
经过20+次秃头调试,我准备了开箱即用的Monorepo终极模板仓库: 👉 quick-mono
为了方便大家学习,我本着一切从简的原则,模板仓库不会过分魔改,因为越简单越容易学习嘛~😁😁😁
模板功能清单:
- ✅ 预制React+Vue双核心
- ✅ 集成Turbo
- 🗒 Vitest测试套件(doing)
- 🗒 配置好husky+lint-staged (doing)
- 🗒 自带CHANGELOG生成器 (doing)
- 🗒 TypeScript全家桶配置(doing)
欢迎点击GitHub右上角✨Star按钮,一起学习👉 quick-mono