TurboRepo 为何将成为 2022 年的第一大趋势
TurboRepo 最近被Vercel 收购,我观看了 Jared Palmer 的精彩介绍演示,以了解它到底为何如此受欢迎:
对于那些太忙而无法看完整个内容的人,这里有一些简短的笔记,最后是个人反思。
TLDR
以主题形式查看此帖子的 TLDR:
为什么选择 Monorepos
您可以参考其他来源关于Monorepos 的定义(2022 年编辑:Nrwl 刚刚推出了https://monorepo.tools/,其中包含他们的观点和比较),但我们将花一些时间来介绍为什么它们是一个值得的目标:
- 您可以在一次原子提交中轻松跨多个应用程序(例如和)进行横切代码更改
/frontend
/backend
- 您可以轻松地搜索所有项目
- 您将希望在整个公司范围内标准化许多环境问题的单一事实来源,例如:
- 依赖管理(重要的依赖在一个
package.json
) - 共享包的代码重用(例如
/design-system
或/common-utils
或/schema
) - 配置(ESlint、TSconfig 等)
- 测试(从单元到端到端)
- 依赖管理(重要的依赖在一个
- 对于库作者来说,发布相互依赖的包也更加容易。
主要的 JS 生态系统工具(例如 React、Jest、pnpm、Next.js 和 Yarn 本身)已转向 Monorepos,小型初创公司和大型公司(例如 FB 和Google)也纷纷转向 Monorepos 。
TurboRepo 的起源
TurboRepo 的起源故事始于Nate Moore 在 TSDX 上提出的这个长期未解决的问题:
作为 TSDX 的早期志愿者,我刻意回避了这个问题,因为我从未在拥有大型 monorepo 的公司工作过,并且认为应该通过专用工具(例如)来解决yarn workspace
,而当时这种工具本身才刚刚开始流行。
为了解决这个问题,Jared 尝试将 Lerna 提取到 monorepo 工具中,并在研究 Facebook 和 Google 等大型 monorepo 商店如何运行任务时发现,他们的许多先进技术尚未进入更大的 JS 生态系统。
因此,TurboRepo 有三个目标:
- 制作一个 monorepo 工具,尽可能多地利用这些先进技术,并且无需任何配置
- 使其易于逐步采用(例如从 Lerna 迁移时)
- 确保它可扩展(例如 API 设计和架构选择足够灵活)
Jared 在这个帖子中讲述了 TurboRepo 的完整故事:
TurboRepo 的作用
TurboRepo 的基本原则是永远不会重新计算以前已经完成的工作。
为此,它会根据turbo
package.json 中的配置从构建管道生成依赖关系图,依次执行每个任务,并对输入进行指纹识别/缓存每个任务的输出。
当第二次运行时,如果发现与指纹匹配的工作,它会从缓存中恢复,并重播日志。
如何使用 TurboRepo
主 CLI 表面积出奇的小:
npx create-turbo@latest turbo-demo
docs
使用应用程序( 、web
)和包(设计系统和共享配置(eslint、tsconfig))搭建 monorepoturbo run build
一次性构建所有应用,但重要的是,当您再次运行此命令时,第二次构建将在 100 毫秒内完成,因为所有内容都已缓存。您可以添加一系列参数来修改执行的操作turbo run
和输出。turbo prune --scope=<target>
为目标包生成带有修剪锁文件的稀疏/部分 monorepo。- 远程缓存命令:
turbo login
和turbo link
(稍后解释)
配置turbo
键
TurboRepo 使用一个特殊的键,package.json
称为turbo
(文档在这里),并且在这里定义了构建任务之间的拓扑关系(以及在何处对缓存工件进行指纹识别):
{
"turbo": {
"baseBranch": "origin/main",
"pipeline": {
"build": {
"dependsOn": ["^build"],
"outputs": [".next/**"]
},
"test": {
"dependsOn": ["^build"],
"outputs": []
},
"lint": {
"outputs": []
},
"dev": {
"cache": false
}
}
}
}
这有助于 Turbo 为您的构建创建有向无环图,然后它可以反向遍历构建过程并检查其缓存。您甚至可以使用该--graph
标志通过 Graphviz 可视化您的构建图。
(之前尝试过可视化工具,在我看来这是一个有趣的演示,但实际上并没有那么有用🤷♂️)
另一件需要了解的重要事情是,你可以同时运行所有这些任务,并且 Turbo 将尽可能地并行化:
turbo run build test lint
为了了解并行运行的内容并调试构建管道,您甚至可以让 Turbo 输出带有--profile
标志的配置文件来检查 Chrome DevTools 中的跟踪!
远程缓存
远程缓存目前仍处于测试阶段,但它将成为 TurboRepo 规模化发展的关键。通常情况下,缓存是在本地生成和检查的,因此,如果您要审查同事编写的代码,也必须在本地进行构建。
听起来效率低下?我们可以解决这个问题。
远程缓存共享全局缓存(其安全性与哈希值的安全性相当),将 TurboRepo 从“单人”体验转变为“多人合作”模式。用户很容易产生共鸣的比喻是,这基本上就是“目录dist
版的 Dropbox”。
这就是 Vercel 的支持所在——他们在 TurboRepo 构建中提供免费的远程缓存——你仍然需要创建一个 Vercel 帐户,他们以后可能会收取费用——但无论你的应用是否在 Vercel 上构建或托管,这都有效。这对所有相关人员来说都是一个绝妙的举措!所有 TurboRepo 用户都可以获得免费的加速,Vercel 则获得大量注册用户(以及网络效应)以及潜在的未来收入来源。
使用方法非常简单:
npx turbo login # login to Vercel
npx turbo link
就是这样!再简单不过了,而且还提供免费加速。
未来
Jared 在直播结束时对 TurboRepo 路线图发表了一些评论
- 遥测
- 在其他进程中分片并行任务(目前,TurboRepo 像 Node 一样在同一个单线程进程中运行并行任务 - 为了真正利用完全并发,它应该将工作分配给其他进程。我参与的项目Temporal未来可能会成为一个有趣的工具)
- 预设(称为“Turbo Season 2”)
- 较小的特征
- 像 npm 这样的公共/私人安全模型
- 更智能的手表模式
- 可能还会有企业功能。
您也可以在 TurboRepo GitHub 社区上对功能创意进行投票。
Nx 怎么样?
TurboRepo 经常被拿来与 Nx 进行比较,因此我非常感谢 Victor Savin(Nx 的创建者)在 Nx 文档中写了一页,详细说明了他所看到的与 Turborepo 的区别。
他还对 Nx 和 TurboRepo 进行了基准测试,您可以尝试一下:
个人收获
TurboRepo 对 JS 社区来说意义重大,不仅因为它解决了构建速度问题(这总是受到大众的欢迎),而且因为它是一个定义明确的抽象,通过声明式构建管道、出色的调试/分析选项和出色的文档,带来了很多开箱即用的价值。
TurboRepo 的 74% 代码都是用 Go 编写的,它是系统核心、脚本 Shell理论的一个很好的例子,证明了“JS 中的 JS 工具”时代已经结束,因为对热路径速度的需求超过了贡献者学习曲线的担忧。
JS 社区中的许多人(包括我本人)都听说过 Monorepo 的好处,但却因为缺乏能够直接解决这个问题的优秀工具而裹足不前。虽然市面上有很多Monorepo 工具可以解决这个问题的各个方面,但我认为 TurboRepo 将引领新一波 Monorepo 工具的潮流,得益于 Jared 和 Vercel 团队的大力支持和出色的开发者营销,它将在 JavaScript 的“第三纪元”中脱颖而出。
后续:Nx 聊天
我与 Nx 创始人进行了后续聊天,以进一步了解他们对 Monorepo Tooling 的看法:
进一步阅读
Robin Wieruch 对Monorepos做了更详细的描述,并提供了代码示例和更多用例想法!
文章来源:https://dev.to/swyx/why-turborepo-will-be-the-first-big-trend-of-2022-4gfj