使用 Nx 高效运行任务:并行执行、任务管道与缓存加速实战指南

📅 发布时间:2026/9/10 7:39:06
使用 Nx 高效运行任务:并行执行、任务管道与缓存加速实战指南
使用 Nx 高效运行任务并行执行、任务管道与缓存加速实战指南【免费下载链接】nxThe Monorepo Platform that amplifies both developers and AI agents. Nx optimizes your builds, scales your CI, and fixes failed PRs automatically. Ship in half the time.项目地址: https://gitcode.com/GitHub_Trending/nx/nx导读本指南基于 Nx 官方课程 Explore Nx 中的第二课系统讲解 Nx 任务运行器的核心能力并行运行多个项目的多个目标target、通过任务管道task pipeline保证任务按依赖顺序执行、只对受变更影响的项目affected执行任务以及借助缓存加速任务执行。读完本文你将掌握如何在 monorepo 中定义任务、使用run-many与affected命令、配置dependsOn任务依赖并理解 Nx 底层任务图task graph的调度原理。Nx 任务运行器能做什么无论你的 monorepo 中只有一个项目还是上百个项目Nx 都提供了一套强大的任务运行器task runner它允许你轻松地并行运行多个项目的多个目标通过定义任务管道让任务按照正确的顺序执行只运行受某个变更影响的项目上的任务借助缓存显著加速任务执行避免相同输入下的重复计算。任务执行的速度提升与缓存机制相互配合缓存负责相同输入不重复执行而并行调度与依赖排序则负责不同任务高效地并发推进。两者结合可以让开发者在本地与 CI 中都获得接近即时的任务反馈。任务的三种定义来源Nx 中的任务task并非只能手写配置它可以从三个来源自动聚合现有package.json中的 scripts、项目级project.json中的 targets以及 Nx 插件从工具配置文件如vite.config.ts、.eslintrc.json、Jest 配置中**推断inferred**出来的任务。Nx 会合并这三个来源来确定某个项目可运行的任务集合。关键是Nx 按文件的当前实际内容读取配置因此即使工作区没有添加任何任务配置也能直接通过 Nx 运行现有脚本。方式一复用 package.json 的 scripts无需任何额外配置Nx 可以直接运行package.json中的脚本// libs/mylib/package.json { name: mylib, scripts: { build: tsc -p tsconfig.lib.json, test: jest } }方式二在 project.json 中定义 targets每个项目目录下的project.json提供了更精细的控制既可以直接指定 shell 命令也可以使用 Nx executor执行器// libs/mylib/project.json { root: libs/mylib, targets: { build: { command: tsc -p tsconfig.lib.json }, test: { executor: nx/jest:jest, options: { /* ... */ } } } }command字段用于直接执行命令行语句executor字段则指向某个 Nx 插件提供的执行器如nx/jest:jest执行器会内置更丰富的缓存输入输出定义与日志处理。方式三由 Nx 插件自动推断Nx 插件能够检测项目的工具配置文件例如vite.config.ts或.eslintrc.json并自动配置可运行的任务同时带上 Nx 缓存能力。例如nx/jest插件会自动为使用 Jest 的项目创建一个test任务。任务名称可以在nx.json中统一配置// nx.json { plugins: [ { plugin: nx/vite/plugin, options: { buildTargetName: build, testTargetName: test, serveTargetName: serve, previewTargetName: preview, serveStaticTargetName: serve-static } }, { plugin: nx/eslint/plugin, options: { targetName: lint } }, { plugin: nx/jest/plugin, options: { targetName: test } } ] }这种推断任务inferred tasks机制的意义在于项目可以只保留自己工具链的原始配置文件Nx 通过插件自动识别并接入统一的执行、排序与缓存体系无需为每个项目手工维护重复的任务定义。运行任务命令行语法与常用命令Nx 运行任务的通用语法为nx target project形式。在 Nx 21 中任务输出会显示在交互式终端 UI 中你可以主动选择查看哪个任务的输出、在任务列表中搜索并排显示多个任务的输出。运行单个任务为header项目运行test任务npx nx test header用 run-many 运行多个项目的任务run-many命令用于在多个项目上运行同一类任务。几个典型用法运行仓库中所有项目的build任务npx nx run-many -t build同时运行所有项目的build、lint和test任务npx nx run-many -t build lint test只对header和footer两个项目运行build、lint、testnpx nx run-many -t build lint test -p header footer从源码实现看run-many命令在 packages/nx/src/command-line/run-many/command-object.ts 中被描述为 Run target for multiple listed projects.其核心流程run-many.ts是先通过createProjectGraphAsync构建项目图再用projectsToRun筛选出目标项目集合最后交给runCommand统一执行。项目筛选逻辑支持按名称精确匹配、通配符模式如proj*以及标签过滤如tag:api这些行为在 run-many.spec.ts 中有对应的单元测试覆盖。Nx 会将这些任务并行化调度并依据项目间的依赖关系与任务管道配置确保任务以正确的顺序执行。控制并行度默认情况下Nx 最多同时运行 3 个任务。可以通过命令行参数动态调整npx nx build myapp --parallel5也可以基于逻辑 CPU 数量的百分比来设置并行度npx nx build myapp --parallel50%还可以在nx.json中修改全局默认值// nx.json { parallel: 5 }只运行受 PR 影响的项目affected使用affected命令可以只对当前变更如 PR 中修改的代码所影响的项目运行任务npx nx affected -t test这一能力与项目图配合Nx 通过 git 变更集计算出受影响项目集合再结合affectedProjectIds生成对应的任务图从而在 CI 中避免对未变更项目重复执行构建与测试。定义任务管道dependsOn 与 ^ 前缀项目之间常常存在任务依赖。例如运行app项目的build之前需要先构建它依赖的header项目。Nx 可以自动检测项目之间的依赖关系即项目图 project graph。考虑这样一个依赖链myreactapp依赖feat-products而feat-products又依赖shared-ui。项目图中记录的依赖为myreactapp → feat-products → shared-ui类型均为static。但是你还需要告诉 Nx对于哪些 target这种先后顺序是重要的。下面的配置告诉 Nx在运行某个项目的build目标之前需要先在该项目依赖的所有项目上运行build// nx.json { targetDefaults: { build: { dependsOn: [^build] } } }这里的^build中的脱字符^含义是在项目依赖上运行该 target——即^build表示依赖项目的 build而不带^的build则指当前项目自身的 build。因此执行nx build myreactapp时Nx 会先执行shared-ui与feat-products的build最后再执行myreactapp的build。更复杂的依赖规则可以用数组组合表达。例如在 task-pipeline-configuration.mdoc 中展示了同时包含^依赖与同项目依赖的配置// nx.json { targetDefaults: { build: { dependsOn: [^build, prebuild], }, test: { dependsOn: [build], }, }, }执行nx test myproj时Nx 会按如下顺序构建任务图将myproj:test加入任务图因为test依赖build加入myproj:build因为build依赖prebuild加入myproj:prebuild^build条目为myproj依赖的所有项目分别加入build任务每个任务在其依赖完成后再开始执行。值得注意的是Nx 并不会等所有 build 全部完成后才开始所有 test它会在满足图约束的前提下让相互独立的任务并行运行。任务依赖既可以在nx.json中作为全工作区的共享规则targetDefaults定义也可以在某一个项目的project.json或package.json的nx.targets段中单独配置以便覆盖默认行为。用 targetDefaults 减少重复配置targetDefaults的价值不止于定义依赖。它还可以统一声明某类 target 的缓存输入输出inputs/outputs避免在每个项目的project.json里重复书写。例如本仓库的根 nx.json 中就有这样的实际用法{ targetDefaults: { build: { dependsOn: [^build, typecheck, build-base], inputs: [production, ^production], cache: true } } }通过targetDefaults工作区内所有名为build的目标都会自动获得统一的依赖顺序、缓存输入定义与缓存开关实现一处配置处处生效。运行根级任务root-level tasks有些任务面向整个代码库而不是某一个项目例如生成全站文档。为了让这类任务也能享受 Nx 的缓存与管道能力可以把它们定义在根目录的package.json或project.json中。在根package.json中定义// package.json { name: myorg, scripts: { docs: node ./generateDocsSite.js }, nx: {} }注意package.json上的nx: {}属性它用于告知 Nx 这是一个根级项目。该属性也可以展开用来指定缓存输入inputs与输出outputs。如果希望继续用 npm或 pnpm/yarn来触发脚本但又想让任务走 Nx 的缓存可以使用nx exec// package.json { name: myorg, scripts: { docs: nx exec -- node ./generateDocsSite.js }, nx: {} }在根project.json中定义同样可行// project.json { name: myorg, targets: { docs: { command: node ./generateDocsSite.js } } }两种方式定义好后统一用下面的命令调用npx nx docs底层原理从项目图到任务图把上面所有内容串起来可以看到 Nx 任务执行的完整链路项目图project graphNx 通过扫描源码导入关系与配置文件构建出项目之间的依赖图这是哪些项目受变更影响affected与项目间任务先后顺序^target判断的基础任务图task graph结合targetDefaults/project.json中的dependsOn规则Nx 把项目图展开为具体的任务节点与依赖边。例如仓库根 nx.json 中build的dependsOn: [^build, ...]会在执行任一项目构建前自动排队其依赖项目的构建任务并行调度任务图就绪后Nx 依据parallel配置默认 3可用--parallel或nx.json的parallel字段调整在满足依赖约束的前提下同时执行尽可能多的独立任务缓存命中每个任务执行前Nx 根据inputs计算哈希若命中缓存则直接恢复outputs跳过实际执行。这条链路意味着你只需声明任务与依赖规则调度、排序、并行与去重执行全部交由 Nx 完成无需编写任何编排脚本。总结定义任务有三种途径package.jsonscripts、project.jsontargets、Nx 插件推断三者可共存且互不冲突运行任务使用nx target project语法批量场景用run-many -t ... [-p ...]变更场景用nx affected -t ...控制顺序通过dependsOn含^target跨项目依赖声明任务管道可在nx.json的targetDefaults中全局配置控制并行度通过--parallelN数字或百分比或nx.json的parallel字段根级任务在根package.json配合nx: {}或根project.json中定义依然享受缓存能力。掌握了任务运行器你便可以在 monorepo 中实现只构建受影响的部分、按依赖顺序并行执行、相同输入绝不重复运行的高效工作流——这正是 Nx 让大型仓库开发与 CI 提速的核心所在。【免费下载链接】nxThe Monorepo Platform that amplifies both developers and AI agents. Nx optimizes your builds, scales your CI, and fixes failed PRs automatically. Ship in half the time.项目地址: https://gitcode.com/GitHub_Trending/nx/nx创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考