skip to content
logo

Search

Turborepo

Turborepo 优雅的 Monorepo 解决方案

Turborepo 是一款旨在简化 monorepo 开发的现代工具。在本文中,我们将深入探讨 Turborepo 是什么、如何使用它、何时使用它、它的优缺点,并提供实际示例来帮助您入门。

Turborepo 是什么?

Turborepo 是 Vercel 开发的适用于 JavaScript 和 TypeScript monorepos 的高性能构建系统。它通过缓存任务、并行构建和确保增量构建来优化工作流程。这可以显著加快构建、测试和部署速度。

monorepos 的挑战

monorepo 本质上就是一个存放多个项目或软件包代码的单一存储库。例如,一个 monorepo 可能包含一个前端应用程序、一个后端服务和一个共享库,所有这些都由它们一起管理。这种设置有助于简化依赖关系并使共享代码更容易,但它也可能带来一些挑战:

  • 构建时间长:随着存储库的增长,构建或测试每个包可能会变得耗时。
  • 复杂的工作流程:确保构建、检查或测试等任务高效运行可能需要仔细规划。
  • 难以扩展:每个工作区都有自己的测试套件、自己的 linting 和自己的构建过程。单个 monorepo 可能有数千个任务要执行。
  • 依赖耦合:共享代码的更新可能会无意中影响多个项目。

这就是 Turborepo 之类的工具发挥作用的地方,它可以解决这些挑战并实现高效的 monorepo 工作流程。

主要特点

  • 缓存:缓存任务结果(例如,构建输出)以避免重新运行未改变的工作。
  • 并行执行:跨包同时运行任务,最大限度地利用机器资源。
  • 增量构建:仅重建已更改的包,从而节省时间和资源。
  • 与框架无关:与任何 JavaScript 或 TypeScript 项目兼容(React、Next.js、Node.js)。
  • 远程缓存:跨 CI 管道和开发人员共享构建工件,从而改善协作。

Turborepo 可以逐步采用,您只需几分钟即可将其添加到任何存储库。它使用您已经编写的 package.json 脚本、您已经声明的依赖项以及单个 turbo.json 文件。您可以将它与任何包管理器一起使用,例如 npm 、 yarn 或 pnpm ,因为 Turborepo 依赖于 npm 生态系统的约定。

何时应使用 Turborepo?

如果符合以下条件,Turborepo 是极佳的选择:

  • 您正在使用具有多个相互依赖的包的 monorepo。
  • 您希望通过减少冗余构建和测试来加速 CI/CD 管道。
  • 您的团队经常跨项目共享可重复使用的组件、库或工具。
  • 您正在寻找一个可扩展的解决方案来管理不断增长的项目。

它在以下场景中特别有用:

  • 大型 Monorepos:通过缓存和并行化任务来减少构建和测试时间。
  • 频繁开发工作流程:优化开发过程中的构建、lint 和测试等任务。
  • CI/CD 管道:通过避免重复工作来加快管道速度。
  • 跨包依赖关系:确保任务按正确的顺序执行,并且仅在必要时执行。

然而,它可能并不适用于:

  • 单一存储库项目。
  • 不熟悉 monorepo 工作流程的团队。
  • Monorepos 包含非 JavaScript 项目。

Turborepo 的好处

1. 性能

Turborepo 的缓存和并行化大大减少了构建时间,提供了更快的反馈循环和更好的开发人员体验。

2. 开发者体验

通过最少的配置和直观的调试,Turborepo 简化了复杂的工作流程。

3. 与现代工具的集成

与 TypeScript、Yarn、npm、pnpm 以及 Next.js 等框架无缝协作。

4. 优化 CI/CD

通过共享缓存输出来加速管道,减少团队之间的重复工作。

Turborepo 的缺点

1. 学习曲线

对于不熟悉 monorepos 的团队,采用 Turborepo 可能需要时间来了解其配置和工作流程。

2. 资源开销

设置远程缓存基础设施(例如,Vercel 的远程缓存)可能需要额外的成本或精力。

3. 缓存管理

大型缓存会消耗磁盘空间,需要定期清理。