T

TurboRepo 为何将成为 2022 年的第一大趋势

2025-05-27

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 的基本原则是永远不会重新计算以前已经完成的工作

为此,它会根据turbopackage.json 中的配置从构建管道生成依赖关系图,依次执行每个任务,并对输入进行指纹识别/缓存每个任务的输出。

当第二次运行时,如果发现与指纹匹配的工作,它会从缓存中恢复,并重播日志

如何使用 TurboRepo

主 CLI 表面积出奇的小:

  • npx create-turbo@latest turbo-demodocs使用应用程序( 、web)和包(设计系统和共享配置(eslint、tsconfig))搭建 monorepo
  • turbo run build一次性构建所有应用,但重要的是,当您再次运行此命令时,第二次构建将在 100 毫秒内完成,因为所有内容都已缓存。您可以添加一系列参数来修改执行的操作turbo run和输出。
  • turbo prune --scope=<target>为目标包生成带有修剪锁文件的稀疏/部分 monorepo。
  • 远程缓存命令:turbo loginturbo 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
      }
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

这有助于 Turbo 为您的构建创建有向无环图,然后它可以反向遍历构建过程并检查其缓存。您甚至可以使用--graph标志通过 Graphviz 可视化您的构建图。

图片描述

之前尝试过可视化工具,在我看来这是一个有趣的演示,但实际上并没有那么有用🤷‍♂️)

另一件需要了解的重要事情是,你可以同时运行所有这些任务,并且 Turbo 将尽可能地并行化:

turbo run build test lint
Enter fullscreen mode Exit fullscreen mode

为了了解并行运行的内容并调试构建管道,您甚至可以让 Turbo 输出带有--profile标志的配置文件来检查 Chrome DevTools 中的跟踪!

图片描述

远程缓存

远程缓存目前仍处于测试阶段,但它将成为 TurboRepo 规模化发展的关键。通常情况下,缓存是在本地生成和检查的,因此,如果您要审查同事编写的代码,也必须在本地进行构建。

听起来效率低下?我们可以解决这个问题。

远程缓存共享全局缓存(其安全性与哈希值的安全性相当),将 TurboRepo 从“单人”体验转变为“多人合作”模式。用户很容易产生共鸣的比喻是,这基本上就是“目录dist版的 Dropbox”。

这就是 Vercel 的支持所在——他们在 TurboRepo 构建中提供免费的远程缓存——你仍然需要创建一个 Vercel 帐户,他们以后可能会收取费用——但无论你的应用是否在 Vercel 上构建或托管,这都有效。这对所有相关人员来说都是一个绝妙的举措!所有 TurboRepo 用户都可以获得免费的加速,Vercel 则获得大量注册用户(以及网络效应)以及潜在的未来收入来源。

使用方法非常简单:

npx turbo login # login to Vercel
npx turbo link
Enter fullscreen mode Exit fullscreen mode

就是这样!再简单不过了,而且还提供免费加速。

未来

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做了更详细的描述,并提供了代码示例和更多用例想法!

在此 Twitter 上分享!

文章来源:https://dev.to/swyx/why-turborepo-will-be-the-first-big-trend-of-2022-4gfj
PREV
15+ 你可能不知道的实用 Web 开发工具
NEXT
为什么 Webdevs 一直试图消灭 REST?