🧩 Nx

一句话定性

Nx(Nrwl 出品)是 Monorepo 工具光谱里最重的那一端:它不只是个缓存编排器,而是一个企业级 Monorepo 平台——项目依赖图分析、受影响检测(affected)、计算缓存(本地 + remote)、代码生成器(generators)、插件生态(全家桶)、强约束(module boundaries)一应俱全。它的取舍很明确:用更高的学习成本和更强的约束,换大型企业 Monorepo 所需的一致性、可治理性和规模化能力。与 Lerna与Turborepo 的 Turborepo 形成”重 vs 轻”的经典对照。

前置

Nx 解决的同样是 Monorepo与workspaces构建放大痛点,与 Turborepo 共享”增量 + 缓存 + 依赖图”的共识基石。区别在广度与约束——见本篇第三、五节的对照。


一、它是什么 & 出现的时代

NxNrwl(两位前 Google/Angular 团队成员创立)推出,起步于 Angular 生态,后扩展为框架无关的通用 Monorepo 平台。它生长于 2018-2023 工程化时代——企业级前端 Monorepo 规模急剧膨胀、对”治理”的需求超过对”轻量”的需求的时期。

与 Bazel 的精神血缘

Nx 的设计深受 Google Bazel 影响。Bazel 是 Google 内部的封闭式、可复现构建系统,以精确依赖图 + 远程缓存 + 远程执行著称,但配置极重、上手陡峭。Nx 可以理解为**“前端友好版的 Bazel 理念”**:保留依赖图与远程缓存的精髓,大幅降低门槛、深度贴合 JS/TS 生态。Bazel 是本专题里的重型参照,不单独建文件。

一个关键的生态事实:Nrwl 后来接手了停滞的 Lerna(见 Lerna与Turborepo)——于是”老牌 Lerna”和”重型 Nx”如今同属一家,Lerna 可借用 Nx 的缓存引擎。


二、为什么会出现(解决上一代什么痛点)

当 Monorepo 大到需要"治理"而不只是"构建"

Turborepo 解决了”改一个包别重建全部”。但超大型企业 Monorepo 的痛点不止于此:

  • 我改的这个包,到底影响了哪些应用?谁会被波及?(影响分析)
  • 几百个包的依赖关系一团乱麻,有没有人偷偷制造了循环依赖 / 跨层非法引用?(架构治理)
  • 每个团队新建包都从头抄配置,风格不一致、容易出错。(脚手架一致性)
  • CI 能不能只跑”受这次改动影响的”那部分测试和构建?(affected)

这些是规模化治理问题,超出了”任务缓存”的范畴。Nx 的出发点:Monorepo 不只是构建快,还要可分析、可生成、可约束、可治理。


三、核心机制 & 为什么(在企业)流行

① 项目依赖图(project graph)— 一切的基础

Nx 静态分析 import/依赖,构建出整个仓库的项目依赖图(可 nx graph 可视化)。这张图是 affected、缓存、约束的共同地基。

② affected(受影响检测)— 最具标志性的能力

git 对比:这次改动碰了哪些文件/包?
        ▼
在【项目依赖图】上向上追溯:谁(直接 + 间接)依赖了这些包?
        ▼
得到"受影响集合"(affected projects)
        ▼
nx affected -t test/build/lint
   ──► 只对受影响的项目跑任务,其余全部跳过
        ▼
CI 时间 ∝ 改动的影响范围,而非仓库大小

affected 与缓存的区别

  • 计算缓存回答:“这个任务之前算过吗?算过就别重算。”
  • affected 回答:“这次改动根本不需要碰哪些任务?连考虑都不用考虑。” 两者叠加,把”全仓跑一遍”压缩到极致。

③ 计算缓存(本地 + Nx Cloud remote cache)

与 Turborepo 同理:基于输入 hash 的内容寻址缓存,命中即还原产物;Nx Cloud 提供团队级 remote cache 与分布式任务执行(DTE)——把 CI 任务拆散到多台机器并行,这是比 Turborepo 更进一步的规模化能力。

④ 代码生成器(generators)+ 插件生态(全家桶)

这是 Nx 与 Turborepo 最大的气质差异

  • generators:nx generate 按模板生成新库/组件/应用,保证全仓脚手架一致
  • 插件生态:为 React/Angular/Vue/Vite/Webpack/Jest/Cypress 等提供官方集成插件,开箱即用。
  • executors:把构建/测试/部署等任务标准化、可配置化。 这套”全家桶”让 Nx 不只是编排器,而是一个有主张(opinionated)的开发平台

⑤ 模块边界约束(module boundaries)

通过 tags + lint 规则,强制”哪些包可以依赖哪些包”(如:feature 层不能被 util 层依赖、app 不能跨域引用)。把架构规则变成可自动检查的代码 —— 这是大型团队治理的刚需。

为什么企业选 Nx:大型组织要的是一致性 + 可治理 + 规模化,而不是”零配置轻量”。Nx 的全家桶、affected、强约束、Nx Cloud 分布式执行,正中企业级 Monorepo 的核心诉求。


四、带来的新问题 / 副作用

重,是它的力量也是它的负担

  • 学习曲线陡:概念多(graph / executors / generators / targets / tags / plugins),上手成本远高于 Turborepo。
  • 侵入性 / 锁定感:Nx 倾向于”接管”整个工作流,深度采用后迁出成本高;有主张意味着要按它的方式做事。
  • 配置与抽象层厚:插件/executor 抽象在边缘场景可能”挡路”,调试需穿透多层抽象。
  • Nx Cloud 的依赖:remote cache / 分布式执行的最佳体验绑定 Nx Cloud(托管或自建),引入外部依赖与潜在成本。
  • 对小项目过度:小型 Monorepo 用 Nx 属于”杀鸡用牛刀”,Turborepo 更合适。

五、为什么会衰落 / 现状

Nx 没有衰落,而是坐稳了”重型企业级 Monorepo 平台”的生态位

现状(2026)与取舍光谱

维度Turborepo(轻)Nx(重)
定位任务编排 + 缓存企业级 Monorepo 平台
核心卖点增量构建 + remote cache依赖图 + affected + 缓存 + 生成器 + 约束
配置/上手极轻,近零配置接管重,概念多,学习曲线陡
代码生成有(generators)
架构约束有(module boundaries)
分布式 CI 执行无(仅缓存)有(Nx Cloud DTE)
适合中小 Monorepo、Next.js 生态大型企业、多团队、强治理
哲学UNIX 式”做好一件事”集成式”全家桶平台”
  • 取舍一句话:Turbo 轻量专注缓存,Nx 功能全但重。 选 Nx 是接受”更高门槛 + 更强约束”换”一致性 + 可治理 + 规模化”。
  • 生态合流:Nrwl 同时握有 Nx 与 Lerna(见 Lerna与Turborepo),Lerna 可复用 Nx 缓存引擎——重型阵营进一步整合。
  • 共识不变:无论选 Turbo 还是 Nx,“增量 + 缓存 + 依赖图”已是 Monorepo 编排的行业共识。

六、对后续技术的影响(因果链)

[[Monorepo与workspaces]] 构建放大 + 大型企业的【治理】需求
        │
        ├── 重型参照:Bazel(Google)── 精确依赖图 + 远程缓存 + 远程执行(但极重)
        │
        ▼
Nx(Nrwl):前端友好版的 Bazel 理念
        │  ① 项目依赖图 ── 一切的基础
        │  ② affected ── 只动受影响的项目(CI ∝ 影响范围)
        │  ③ 计算缓存 + Nx Cloud(remote cache + 分布式执行)
        │  ④ generators + 插件全家桶 ── 脚手架一致性
        │  ⑤ module boundaries ── 把架构规则变成可检查的代码
        │
        ├──► Nrwl 接手 Lerna(2022)── 重型阵营整合 ──► [[Lerna与Turborepo]]
        │
        └──► 与 Turborepo 形成"重 vs 轻"取舍光谱
                │  Turbo:轻量专注缓存 / Nx:全家桶 + 强约束
                ▼
        Monorepo 工具共识固化:增量 + 缓存 + 依赖图
                │  企业级再叠加:affected + 治理 + 分布式执行

历史地位

Nx 标记了 Monorepo 工具演化的”成熟期”:当问题从”构建快不快”升级到”几百个包、几十个团队怎么治理”,工具的命题也从缓存扩展到平台。它和 Turborepo 共同定义了今天 Monorepo 工具的取舍坐标系——轻量缓存 ⟷ 重型治理。这对张力,本质仍是本专题贯穿始终的那一个:共享(同一棵树、同一套约束、同一个缓存)带来效率,也带来耦合与门槛;工具的全部艺术,就是在”共享的便利”和”隔离的可控”之间,为不同规模的团队找到那个平衡点。


🔗 相关:包生态与Monorepo演进史 | Lerna与Turborepo | Monorepo与workspaces | npm-registry与包生态 | npm-Yarn-pnpm-包管理 | Vite | Webpack | TypeScript | 2018-2023 工程化时代