Turborepo
面向 JavaScript 与 TypeScript Monorepo 的高性能构建系统,通过任务图、并行调度和缓存减少重复工作。
项目概述
Turborepo 复用现有 package.json Scripts 和包管理器 Workspace,以 turbo.json 描述跨包任务依赖,并在本地、团队和 CI 之间缓存可复现的输出。
Turborepo 是 Vercel 维护的 MIT 开源 Monorepo 构建系统,核心 CLI 采用 Rust 实现。它不会取代 npm、pnpm、Yarn、Bun 等包管理器,也不会替代 Vite、Next.js、tsc 或测试框架;它读取 Workspace 与 Lockfile 形成 Package Graph,再根据 turbo.json 和各包现有 Scripts 构建 Task Graph,决定任务的依赖顺序、并行执行、输入哈希、输出缓存与日志重放。Turborepo 可渐进加入现有仓库,本地缓存无需账号;需要让开发者和 CI 共享结果时,再连接 Vercel Remote Cache 或实现兼容的 Remote Cache API。
主要特点
Turborepo 围绕任务依赖和内容哈希,只执行真正需要运行的工作,并复用已经验证过的结果。
Package Graph
根据包管理器 Workspace、各包 package.json 和 Lockfile 识别内部依赖,让任务调度理解应用与共享包之间的真实关系。
Task Graph
通过 dependsOn、`^build` 和同包任务关系表达执行顺序,自动并行运行互不依赖的工作。
内容寻址缓存
根据源码、依赖、Lockfile、环境变量、配置和命令生成 Hash,命中后恢复输出文件并重放日志,不重复执行任务。
本地与远程缓存
本地缓存开箱即用;Remote Cache 可让开发机和 CI 共享构建结果,也可通过兼容 API 连接其他缓存服务。
最大化并行调度
任务图会在满足依赖后尽快使用可用 CPU 核心,避免按包串行执行 Build、Lint 或 Test。
Filter 与 Affected
可按包名、目录、依赖关系和 Git 范围选择任务,只检查某个应用、它的依赖或本次变更真正影响的包。
环境变量哈希
env、globalEnv 与 Framework Inference 把构建相关变量纳入缓存 Key,Strict Mode 还会限制任务可读取的环境变量。
Persistent 与 Watch 任务
Dev Server 可标记为 Persistent 且禁用缓存,`turbo watch` 能在依赖包变化后重新运行相关任务。
Prune 部分仓库
`turbo prune` 为目标应用生成只含所需内部包、源码和裁剪 Lockfile 的局部 Monorepo,适合 Docker 分层构建。
包级任务配置
根 turbo.json 提供默认任务,包内 turbo.json 可扩展根配置,为特殊应用调整 Inputs、Outputs 或依赖关系。
任务检查与图数据
Dry Run、Summary 和 Query 能展示任务 Hash、Inputs、Outputs、依赖和受影响包,帮助解释缓存未命中。
Boundaries 与代码生成
实验性的 Boundaries 可检查跨包导入和未声明依赖,`turbo gen` 则能运行 Generator 创建包或统一修改仓库。
适用场景
当多个应用与共享包需要统一 Build、Lint、Test、Typecheck 和发布流水线时,Turborepo 能减少等待和脚本重复。
多个 Web 应用共享组件
将站点、管理后台、文档和设计系统放入一个 Workspace,共享 UI、配置和类型,同时独立构建与部署。
Next.js Monorepo
协调多个 Next.js 应用、内部包和生成任务,并正确缓存 `.next` 输出及其环境变量依赖。
Vite 与组件库仓库
多个 Vite 应用可复用 TypeScript、ESLint、Storybook 和组件包,由任务图先构建依赖再构建应用。
大型 CI 流水线
Remote Cache、Affected Filter 和并行任务可以减少 Pull Request 中重复的 Build、Lint、Test 与 Typecheck。
多包 SDK 与工具链
核心库、框架适配器、CLI 和示例可以共享测试与发布准备任务,并按依赖顺序构建。
渐进合并多个仓库
先保留每个项目现有 Scripts,再逐步抽取共享包、统一配置和缓存,不需要一次改写所有构建工具。
Docker 单应用部署
`turbo prune --docker` 生成目标应用需要的最小 Workspace 和 Lockfile,改善依赖安装层的缓存命中。
优点与注意事项
技术选型不仅要看能力,也要理解它带来的团队成本。
主要优点
Turborepo 擅长的地方
- 直接复用 package.json Scripts,接入现有仓库的改造范围较小
- 根据 Package Graph 和 Task Graph 自动安排依赖顺序与并行度
- 本地缓存无需账号即可减少重复 Build、Lint、Test 和 Typecheck
- Remote Cache 可以跨开发者、CI 和部署环境共享确定性产物
- Filter、Affected 和 Dry Run 便于大型仓库只执行必要任务
- 环境变量哈希与 Strict Mode 降低错误缓存构建配置的风险
- Prune 能为 Docker 与单应用部署生成更小的局部 Monorepo
- 不绑定具体框架,可同时编排 Next.js、Vite、Node.js 与自定义工具
需要注意
采用前应考虑的问题
Workspace 发现、依赖安装、Lockfile 和版本解析仍由 npm、pnpm、Yarn 或 Bun 负责,仓库必须先有正确的包边界。
Turborepo 只编排 Scripts;Vite、Next.js、tsc、Vitest 等工具仍需在每个包中正确配置并能独立运行。
相同 Inputs 若可能产生不同 Outputs,例如读取时间、网络或未声明配置,缓存就不可信,应关闭缓存或补齐输入。
遗漏 Outputs 会只缓存日志而不恢复产物,包含过多目录则会增加上传、下载和磁盘占用,需按工具实际输出配置。
影响构建的变量必须进入 env 或 globalEnv;Loose Mode 虽方便,却可能把预览环境产物误用于生产。
共享缓存包含构建产物和日志,应控制 Token、团队权限、保留策略与服务可用性,并评估是否启用 Artifact Signature。
把所有 Lint、Test 都写成依赖上游同名任务可能造成不必要等待,应根据任务是否真的消费上游输出建图。
长期运行的 Server 应设置 persistent: true 和 cache: false;多个 Persistent 任务之间的依赖也有专门限制。
浅克隆、错误的基准分支或 CI 中缺少历史会影响变更计算,流水线应显式配置 Fetch Depth 和比较范围。
它生成局部 Monorepo,而非最终可执行产物;还需要包管理器安装、框架 Build 和容器多阶段构建。
跨包导入检查和 Tag 规则适合辅助治理,但在成为稳定能力前不应作为唯一架构保护措施。
应把 turbo 精确安装在仓库 Dev Dependencies,通过 package Scripts 调用,避免全局 CLI 与配置版本不匹配。
快速开始
下面从官方 Starter 或现有 Workspace 开始,配置任务图、缓存输出、环境变量、Filter、Remote Cache 和 Docker Prune。
bashnpx create-turbo@latest my-monorepo
cd my-monorepo
npm install
npm run devbashnpm install --save-dev --save-exact turbo
# 确保根 package.json 已声明 Workspaces
npx turbo --versionjson{
"name": "acme-monorepo",
"private": true,
"workspaces": [
"apps/*",
"packages/*"
],
"scripts": {
"build": "turbo run build",
"dev": "turbo run dev",
"lint": "turbo run lint",
"typecheck": "turbo run typecheck"
},
"devDependencies": {
"turbo": "2.10.7"
}
}json{
"$schema": "https://turborepo.com/schema.json",
"tasks": {
"build": {
"dependsOn": ["^build"],
"outputs": [
"dist/**",
".next/**",
"!.next/cache/**"
],
"env": ["NEXT_PUBLIC_API_URL"]
},
"lint": {
"dependsOn": ["^lint"]
},
"typecheck": {
"dependsOn": ["^typecheck"]
},
"dev": {
"cache": false,
"persistent": true
}
}
}bash# 只构建 Web 应用及其依赖
npx turbo run build --filter=web...
# 只检查本次 Git 变更影响的包
npx turbo run lint test --affected
# 先查看任务图、Inputs 和 Hash,不真正执行
npx turbo run build --dry=jsonbash# Vercel Remote Cache
npx turbo login
npx turbo link
# 之后开发机与 CI 可共享确定性任务结果
npx turbo run buildbashnpx turbo prune web --docker
# out/json 用于安装依赖层
# out/full 包含目标应用和所需内部包源码bashnpm run lint
npm run typecheck
npm test
npm run build下一步:先确保每个包的 Scripts 可独立运行,再让 Turborepo 负责编排。任何会改变任务结果的文件、环境变量或命令参数都必须进入哈希,否则缓存命中可能恢复错误产物。
类似项目
Next.js、Vite 与 TypeScript 是常见的 Monorepo 工作负载;Nx、Lage 和 moon 则代表功能范围与设计取向不同的任务编排方案。
Next.js
基于 React 的全栈 Web 框架,覆盖渲染、路由和部署。
查看项目Vite
新一代前端构建工具,提供快速开发服务器和优化构建。
查看项目TypeScript
为 JavaScript 添加类型语法,提升大型项目的开发体验。
查看项目Nx
功能完整的 Monorepo 平台,提供任务图、缓存、Generator、Plugin、迁移与架构约束。
访问官网Lage
Microsoft 维护的 JavaScript Monorepo 任务运行器,提供增量构建、缓存与流水线调度。
访问官网moon
面向多语言 Monorepo 的任务运行器和仓库管理工具,强调工具链与项目约束。
访问官网Turborepo vs Nx
Turborepo 与 Nx 都通过项目图、任务图和缓存加速 Monorepo。Turborepo 更贴近 package.json Scripts 和 npm Workspace 约定;Nx 提供更完整的 Plugin、Generator、迁移与架构治理平台。
| 比较维度 | Turborepo | Nx |
|---|---|---|
| 核心定位 | 轻量、高性能的 Monorepo 构建编排与缓存 | 完整的 Monorepo 开发平台 |
| 任务来源 | 主要复用各包 package.json Scripts | 可推断任务,也支持 Project 配置与 Plugin |
| 项目图 | 基于 Workspace、package.json 与 Lockfile | Project Graph 结合 Plugin 分析框架和配置 |
| 缓存 | 本地与 Remote Cache,围绕任务 Hash 和 Outputs | 本地与 Nx Cloud,提供分布式执行等扩展能力 |
| 代码生成 | turbo gen 提供 Repository Generator | 成熟 Generator、Executor、Migration 与 Plugin API |
| 架构约束 | Boundaries 能力仍处于实验阶段 | Tag、Module Boundary 和 Project 约束更成熟 |
| 框架集成 | 框架无关,强调复用已有命令 | React、Angular、Node 等官方与社区 Plugin 丰富 |
| 配置与学习 | turbo.json 较小,渐进接入容易 | 概念和能力更多,治理空间也更大 |
| 团队平台能力 | Remote Cache、Summary 与常见 CI 集成 | Nx Cloud 覆盖 Cache、分布式任务与 CI 编排 |
| 更适合 | 已有 npm Workspace、希望快速获得任务缓存的前端团队 | 需要生成器、迁移、架构治理和大型企业平台能力的团队 |
如果仓库已经用 package.json Scripts 表达清晰任务,团队希望以较小改造获得并行执行、缓存和 Filter,Turborepo 通常更直接;如果需要统一生成项目、自动迁移框架版本、强制架构边界或管理超大型多团队仓库,Nx 的平台能力更完整。选型时应使用真实仓库比较冷启动、缓存命中、受影响任务和 CI 维护成本,而不只比较简单 Demo 的执行时间。
资料核验
版本、维护信息与本页采用的官方资料来源。
本页依据 Turborepo 官方 Introduction、Caching、Remote Caching、Task Configuration、Environment Variables、Run、Prune 与 Boundaries 文档,以及 npm Registry 和官方源码仓库整理。Boundaries 等实验能力可能变化,采用时应继续核对当前文档。
官方仓库未归档,核验时最近可见的代码活动日期为 2026 年 7 月 29 日。该状态表示项目近期仍有公开维护活动,不代表固定发布频率或长期支持承诺。