turbo vs nx vs lerna
JavaScript 单体仓库(Monorepo)工具选型对比
turbonxlerna类似的npm包:

JavaScript 单体仓库(Monorepo)工具选型对比

lernanxturbo 都是用于管理 JavaScript/TypeScript 单体仓库的构建工具,旨在提升大型项目中多个包或应用的开发效率、构建性能和依赖管理能力。它们都支持任务编排、增量构建和依赖图分析,但在设计理念、功能集成度和使用方式上有显著差异。lerna 是最早的 monorepo 工具之一,专注于包版本管理和发布;nx 提供完整的工程化平台,内置智能缓存、依赖图可视化和多种框架支持;turbo 则以极致的构建速度为核心,通过远程缓存和任务并行化优化 CI/CD 流程。

npm下载趋势

3 年

GitHub Stars 排名

统计详情

npm包名称
下载量
Stars
大小
Issues
发布时间
License
turbo11,189,67230,07642.2 kB658 天前MIT
nx9,651,61428,42415.1 MB47619 分钟前MIT
lerna2,085,36936,0888.95 MB31014 天前MIT

Lerna vs Nx vs Turbo:单体仓库工具深度对比

在现代前端工程中,单体仓库(monorepo)已成为管理多个相互关联包或应用的标准实践。lernanxturbo 是当前主流的三大工具,但它们解决的问题、适用场景和底层机制大不相同。本文从真实开发视角出发,深入比较三者的核心能力。

📦 核心定位:包管理器 vs 工程平台 vs 构建加速器

lerna 最初是为 npm 包发布而设计的,核心功能是 版本管理和发布流程自动化。它假设你已有一个基于 Yarn 或 npm workspaces 的 monorepo,并在此基础上添加 lerna versionlerna publish 等命令。

// lerna.json
{
  "version": "independent",
  "packages": ["packages/*"]
}

nx 是一个 全功能工程平台,不仅处理任务执行,还提供依赖图分析、代码生成、测试覆盖率报告、影响范围计算(affected projects)等一整套开发工作流。它自带构建系统(可集成 Webpack、Vite 等),也支持非 JavaScript 项目。

// nx.json
{
  "targetDefaults": {
    "build": {
      "dependsOn": ["^build"],
      "inputs": ["production", "^production"]
    }
  }
}

turbo 本质上是一个 高性能任务调度器,不关心你的构建工具是什么(Webpack、Vite、esbuild 都可以),只负责 并行执行任务 + 智能缓存结果。它的配置极其简洁,重点在于定义任务之间的依赖关系。

// turbo.json
{
  "pipeline": {
    "build": {
      "dependsOn": ["^build"],
      "outputs": ["dist/**"]
    },
    "test": {
      "dependsOn": ["build"],
      "outputs": []
    }
  }
}

⚙️ 任务执行与缓存机制

任务依赖定义

三者都支持通过 ^ 表示“依赖于其他包的同名任务”,但语法和能力不同。

lerna 使用命令行参数指定依赖,功能较弱:

# lerna: 手动指定哪些包要运行
lerna run build --scope=app-web --include-dependencies

nxproject.jsonpackage.json 中为每个项目定义 targets,并支持复杂的依赖链:

// apps/web/project.json
{
  "targets": {
    "build": {
      "executor": "@nx/vite:build",
      "dependsOn": ["^build"]
    }
  }
}

turbo 在全局 turbo.json 中声明 pipeline,简洁直观:

// turbo.json
{
  "pipeline": {
    "build": {
      "dependsOn": ["^build"],
      "outputs": [".next/**", "!./node_modules/**"]
    }
  }
}

缓存策略

lerna 没有内置缓存机制。每次运行 lerna run 都会重新执行所有匹配的任务,即使输入未变。这是它在大型项目中性能较差的主要原因。

nx 提供 本地 + 远程缓存,基于任务输入(源码、配置、环境变量等)生成哈希值。只有输入变化时才重新执行任务。

# nx: 自动跳过未变更项目的任务
nx build app-web
# 如果 app-web 及其依赖未变,直接命中缓存

turbo 同样基于输入哈希实现缓存,且原生支持 Vercel Remote Cache,团队成员可共享缓存结果。

# turbo: 自动复用缓存
npx turbo run build
# 输出类似:cache hit, saved 12.3s

🧩 依赖图与影响分析

当修改一个共享库时,如何知道哪些应用会受影响?这是 monorepo 工具的关键能力。

lerna 无法自动分析依赖关系。你必须手动指定 --scope--ignore,容易出错。

nx 内置强大的依赖图引擎,可通过命令查看影响范围:

# nx: 查看受最近提交影响的项目
nx affected:apps
nx affected:build

# 可视化依赖图
nx graph

turbo 也支持影响分析,但需配合 Git 使用:

# turbo: 构建自上次提交以来变更过的项目及其依赖
npx turbo run build --filter="[HEAD]"

🛠️ 开发体验与生态系统

lerna 几乎不提供额外工具。你需要自己配置 ESLint、TypeScript、测试框架等。适合“最小干预”哲学的团队。

nx 提供 插件化生态系统@nx/react, @nx/node, @nx/express 等),每个插件包含预设的构建器、代码生成器和最佳实践配置。例如:

# nx: 自动生成带测试和 Storybook 的 React 组件
nx g @nx/react:component --name=Button --project=ui-lib

turbo 保持 零侵入性,不强制任何项目结构或工具链。你只需在 package.json 中定义 scripts,然后用 turbo run 替代 npm run

// package.json
{
  "scripts": {
    "build": "vite build",
    "dev": "vite"
  }
}

🌐 远程缓存与 CI 集成

lerna 无远程缓存支持。

nx 支持自建远程缓存(通过 nx-cloud 或开源方案),但配置较复杂。

turbo 原生集成 Vercel Remote Caching,只需设置环境变量即可启用:

# CI 环境中
TURBO_TOKEN=xxx TURBO_TEAM=yyy npx turbo run build

对于使用 Vercel 的团队,这是巨大优势。

📊 总结:关键能力对比

能力lernanxturbo
版本发布管理✅ 强项❌ 不支持❌ 不支持
智能缓存(本地)❌ 无✅ 强大✅ 极快
远程缓存❌ 无✅(需配置)✅(Vercel 原生)
依赖图可视化❌ 无✅ 内置❌ 无
影响范围分析❌ 手动✅ 精准✅(基于 Git)
多框架支持⚠️ 仅限 npm 包✅ 全面✅ 任意
学习成本✅ 低❌ 高✅ 极低
侵入性✅ 低❌ 高✅ 零侵入

💡 如何选择?

  • lerna:如果你只维护一组 npm 包,且主要痛点是 版本发布和 changelog 生成,不需要复杂的任务缓存或依赖分析。
  • nx:如果你的 monorepo 包含 多个应用 + 共享库 + 后端服务,需要统一的工程规范、代码生成、依赖可视化和深度缓存,愿意接受一定学习成本。
  • turbo:如果你已有 monorepo 结构,但 构建太慢,希望用最小改动获得 极速缓存和并行执行,尤其团队使用 Vercel 时。

重要提示lerna 目前仍处于维护状态(截至 2024 年),但官方推荐新项目考虑 nxturbo。对于全新项目,除非你明确只需要发布功能,否则不建议首选 lerna

最终,工具只是手段。选择那个能让你团队 写更少配置、跑更快构建、花更少时间调试依赖问题 的方案,才是真正的生产力提升。

如何选择: turbo vs nx vs lerna

  • turbo:

    如果你的核心诉求是最大化本地和 CI 环境的构建速度,且愿意采用基于任务管道(pipeline)的声明式配置方式,turbo 能提供极低的学习成本和出色的性能表现。它特别适合已有 monorepo 结构但缺乏高效缓存机制的团队,或者希望快速集成远程缓存(如 Vercel Remote Caching)的项目。

  • nx:

    如果你的团队正在构建包含多个前端应用、后端服务和共享库的大型工程体系,需要深度的依赖分析、智能缓存、可视化依赖图、代码生成器(schematics)以及跨技术栈(React、Angular、Node.js 等)的一致性开发体验,那么 nx 是最全面的选择。它适合对工程规范性和长期可维护性有高要求的团队。

  • lerna:

    如果你的项目是一个传统的 npm 包集合(如 UI 组件库、工具函数库),主要需求是版本发布(versioning)和 changelog 管理,并且希望保持轻量、不引入额外架构约束,那么 lerna 仍然是一个可靠选择。但它在任务执行、缓存和依赖分析方面能力有限,不适合复杂应用型 monorepo。

turbo的README

Turborepo

Turborepo is a high-performance build system for JavaScript and TypeScript codebases, written in Rust.

Getting Started

Visit https://turborepo.dev to get started with Turborepo.

Contributing

See CONTRIBUTING.md for more information.

Community

The Turborepo community can be found on GitHub Discussions, where you can ask questions, voice ideas, and share your projects.

To chat with other community members, you can join Vercel Community's #turborepo tag.

Our Code of Conduct applies to all Turborepo community channels.

Who is using Turborepo?

Turborepo is used by the world's leading companies. Check out the Turborepo Showcase to learn more.

Updates

Follow @turborepo on X for project updates.

Security

If you believe you have found a security vulnerability in Turborepo, we encourage you to responsibly disclose this and not open a public issue. We will investigate all legitimate reports. Email security@vercel.com to disclose any security vulnerabilities.

https://vercel.com/security