先叠个甲,这是一个入门级的模板,旨在帮助第一次接触monorepo的小伙伴做到快速了解和上手的目的
几年前,我也觉得 Monorepo 是个"神坑"。一个仓库里塞好几个项目,想想都头大:node_modules
得多大?项目之间怎么联调?构建起来不得慢死?每次一想到这些,我就默默地 git init
了新仓库...
但随着项目越做越多,问题也来了:
- 一个公共的
Button
组件,在 A 项目改了样式,忘了同步给 B 项目。 - 一段好不容易封装好的工具函数,CV (复制粘贴) 到了三个地方,结果发现有个 bug,得改三遍。
- 每个项目都得配一遍
ESLint
、TypeScript
、Vite
,简直是"配置地狱"。
够了!我不想再当"CV 工程师"和"配置搬运工"了!
痛定思痛,我们团队决定重新拥抱 Monorepo,并把这几年踩过的坑、总结的经验,浓缩成了一个开箱即用的 Turborepo 入门套件。
先上链接,求个 Star ⭐ :eq1024/trs: 基于 pnpm 和 Turborepo 的高性能 Monorepo 项目入门套件
今天,我就想跟大家聊聊,我们是怎么从"手工作坊"进化到"现代化工厂"的,以及这个套件是怎么让我们的开发体验直接起飞的。
告别混乱,我们只做了几件"小事"
1. 用 pnpm 把 node_modules
"瘦身"
这是第一步,也是最爽的一步。如果你还在用 npm
或者 yarn
,那你一定懂 node_modules
的痛。一个项目动辄几百兆,几个项目下来,硬盘直接报红。
换上 pnpm
之后,世界都清净了。它利用硬链接机制,所有项目的依赖都从一个全局的 store 里"借",同一个版本的包在磁盘上只存一份。不仅省空间,安装速度还快得飞起。
2. 用 Turborepo 给 CI/CD 装上"涡轮增压"
Turborepo
是这套方案的灵魂。它最牛的地方在于两点:远程缓存 和任务编排。
说人话就是:
- 它记得你干过什么 :你改了
packages/ui
里的一个组件,turbo
知道只有apps/app1
依赖了它。所以当你运行pnpm build
,turbo
会直接跳过没受影响的apps/app2
,甚至如果团队其他人已经构建过同样的代码,它能直接从云端把构建产物下载下来,连你自己的电脑都不用转。 - 它知道该先干什么,后干什么 :你告诉它,
deploy
(部署) 任务依赖build
(构建) 任务。它就绝对不会在build
完成前去执行deploy
。
这种感觉就像你有了一个聪明的项目管家,你只管写代码,剩下的他都帮你安排得明明白白。

3. 把"重复劳动"变成"共享积木"
我们把所有能共享的东西,都抽成了 packages
:
@trs/ui
: 共享的 Vue 组件库。@trs/utils
: 共享的工具函数。@trs/fetch
: 统一封装的fetch
请求。@trs/lint
: 全项目统一的ESLint
规则。@trs/config
: 共享的配置项。
从此,再也没有"这个函数 A 项目有,B 项目没有"的尴尬了。所有轮子都成了标准件,维护起来那叫一个省心。
划重点:一个让"增量部署"生效的"神秘"配置
这部分必须单独拿出来讲,因为这是我们当初踩得最深的一个坑,希望能帮你少走弯路。
场景还原 :我只改了 app1
的代码,然后信心满满地执行增量部署命令 pnpm deploy:prod --filter="...[HEAD~1]"
。我以为只有 app1
会被部署,结果 app2
也跟着凑热闹!
破案过程 :翻遍了文档,查烂了 issue
,最后发现问题出在 turbo.json
里一个看似无辜的配置:
json
// turbo.json (错误示范)
"deploy:prod": {
"cache": false // 就是这个家伙!
}
"cache": false
的本意是告诉 turbo
:"部署这个动作别缓存结果"。听起来没毛病对吧?但它的副作用是,它会让 turbo
忽略 --filter
的筛选,强制在所有匹配的项目里都跑一遍这个任务。
正确姿势:
json
// turbo.json (正确配置)
"deploy:prod": {
"dependsOn": ["build:prod"]
}
划重点 :直接删掉 "cache": false
!然后用 dependsOn
告诉 turbo
部署任务依赖构建任务。
这样 turbo
的逻辑就通了:当它发现 app2
的 build
任务命中缓存(因为没改动),它就会聪明地把依赖 build
的 deploy
任务也一起跳过。这才是真正的增量部署!
这不只是个脚手架,更是一套工作流
我们还把 lint-staged
和 simple-git-hooks
集成了进去。当你 git commit
的时候,它会自动只对你这次修改的文件进行 lint
检查和修复。
你不需要关心它是怎么实现的,你只需要知道,从你提交代码的那一刻起,代码质量就已经有了第一层保障。
来吧,一起"起飞"
说了这么多,不如亲自上手体验一下。
记住最重要的原则:所有命令,都在根目录执行!
git clone <your-repo-url>
pnpm install
pnpm dev
然后你就可以看到所有 apps
都跑起来了。去 packages/ui
里改个组件试试,再看看 turbo
是不是真的只重新构建了依赖它的那个 app
。
搭建 Monorepo 从来都不是目的,提升开发效率和代码质量才是。这个入门套件是我们团队迈出的一小步,它为我们节省了大量在配置和重复劳动上浪费的时间。
我们把它开源出来,希望能帮助更多和我们一样,曾经在多项目管理中挣扎的团队。
如果它对你有用,请不要吝啬你的 Star ⭐!这会是我们持续更新的最大动力!
最后,链接再发一次 :eq1024/trs: 基于 pnpm 和 Turborepo 的高性能 Monorepo 项目入门套件