我用 Turborepo 搭了个 Monorepo 脚手架,开发体验直接起飞!

先叠个甲,这是一个入门级的模板,旨在帮助第一次接触monorepo的小伙伴做到快速了解和上手的目的

几年前,我也觉得 Monorepo 是个"神坑"。一个仓库里塞好几个项目,想想都头大:node_modules 得多大?项目之间怎么联调?构建起来不得慢死?每次一想到这些,我就默默地 git init 了新仓库...

但随着项目越做越多,问题也来了:

  • 一个公共的 Button 组件,在 A 项目改了样式,忘了同步给 B 项目。
  • 一段好不容易封装好的工具函数,CV (复制粘贴) 到了三个地方,结果发现有个 bug,得改三遍。
  • 每个项目都得配一遍 ESLintTypeScriptVite,简直是"配置地狱"。

够了!我不想再当"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 buildturbo 会直接跳过没受影响的 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 的逻辑就通了:当它发现 app2build 任务命中缓存(因为没改动),它就会聪明地把依赖 builddeploy 任务也一起跳过。这才是真正的增量部署!

这不只是个脚手架,更是一套工作流

我们还把 lint-stagedsimple-git-hooks 集成了进去。当你 git commit 的时候,它会自动只对你这次修改的文件进行 lint 检查和修复。

你不需要关心它是怎么实现的,你只需要知道,从你提交代码的那一刻起,代码质量就已经有了第一层保障。

来吧,一起"起飞"

说了这么多,不如亲自上手体验一下。

记住最重要的原则:所有命令,都在根目录执行!

  1. git clone <your-repo-url>
  2. pnpm install
  3. pnpm dev

然后你就可以看到所有 apps 都跑起来了。去 packages/ui 里改个组件试试,再看看 turbo 是不是真的只重新构建了依赖它的那个 app


搭建 Monorepo 从来都不是目的,提升开发效率和代码质量才是。这个入门套件是我们团队迈出的一小步,它为我们节省了大量在配置和重复劳动上浪费的时间。

我们把它开源出来,希望能帮助更多和我们一样,曾经在多项目管理中挣扎的团队。

如果它对你有用,请不要吝啬你的 Star ⭐!这会是我们持续更新的最大动力!

最后,链接再发一次eq1024/trs: 基于 pnpm 和 Turborepo 的高性能 Monorepo 项目入门套件

相关推荐
Asort2 小时前
JavaScript 从零开始(五):运算符和表达式——从零开始掌握算术、比较与逻辑运算
前端·javascript
一枚前端小能手2 小时前
🚀 缓存用错了网站更慢?前端缓存策略的5个致命误区
前端·javascript
艾小码2 小时前
为什么你的页面会闪烁?useLayoutEffect和useEffect的区别藏在这里!
前端·javascript·react.js
艾小码2 小时前
告别Vue混入的坑!Composition API让我效率翻倍的3个秘密
前端·javascript·vue.js
南雨北斗2 小时前
VS Code 中手动和直接运行TS代码
前端
小高0072 小时前
🔍说说对React的理解?有哪些特性?
前端·javascript·react.js
Samsong2 小时前
JavaScript逆向之反制无限debugger陷阱
前端·javascript
Lotzinfly2 小时前
8 个经过实战检验的 Promise 奇淫技巧你需要掌握😏😏😏
前端·javascript·面试