Monorepo 2026:pnpm catalogs / Nx 21 / Turborepo 2.6 / Moon 2 / Vite+ vp
影响力:**pnpm 11 workspace catalogs(
catalog:协议)**已成事实标准;Nx 21 + AI / MCP 走”AI-native monorepo”;Turborepo Boundaries 替代 Nx tags 成主流;Moon 2.0 “Phobos” + Vite+vp是新兴选项。 干活密度:🟢 干活级
🔥 影响力卡片
- pnpm 9.5(2024)首发 catalogs,pnpm 10/11 成熟(strict / preferred / manual 三模式)
- Moon 2.0 “Phobos” = 2026-02-18(Rust polyglot,远程缓存自带 server)
- Nx 21:Terminal UI(多任务并行 TUI)+ Self-Healing CI(失败任务自动 PR 修复)+ Nx MCP Server
- Turborepo 2.6+ Boundaries(experimental,但 2026 主流路线)
- Vite+ Alpha(2026-03-13)
vpCLI 一统 Vite + Vitest + Rolldown + tsdown + Oxlint + Oxfmt
🎯 为什么必读
monorepo 选型在 2024 已经是 Turborepo vs Nx 二元;2026 多了几个变量:catalog 协议进入 ecosystem 层(影响 package manager 选择)、AI 集成进入 task runner 层(Nx MCP 是首创)、统一工具链层(Vite+ 试图替代 Turborepo)。
如果你 2026 年内会做 monorepo 选型或现有 monorepo 升级,这一篇能省你 2-3 周的对比时间。
一句话总结
2026 monorepo 默认配比 = pnpm 11 + workspace catalogs + Turborepo 2.6 / Nx 21 + changesets + Knip。
💎 金句墙
★ “
catalog:is the de facto standard now.” “catalog:已是事实标准。” —— 译者点评:pnpm 9.5 引入,pnpm 10/11 成熟。Bun / Yarn 跟进讨论,npm 暂未原生支持。但实战中”用 pnpm 就开 catalogs”已经成为新项目默认习惯,因为它解决了 monorepo 内 react/ts 等核心库版本漂移这个老问题
★ “Lerna is dead — Long Live Lerna.” “Lerna 已死 — Lerna 万岁。” —— Nx 团队博客标题。译者点评:这话讲了 Lerna 现状 — 由 Nrwl 接手维护,定位收窄到 OSS 多包发布,app monorepo 应用场景已被 Turbo/Nx 取代
📋 核心精读
1. pnpm workspace catalogs 实战
# pnpm-workspace.yaml
packages:
- apps/*
- packages/*
catalog:
react: ^19.0.0
react-dom: ^19.0.0
typescript: ^5.6.0
zod: ^4.0.0
catalogs:
react18:
react: ^18.3.0
react-dom: ^18.3.0
// apps/web/package.json
{
"dependencies": {
"react": "catalog:", // 用默认 catalog
"react-dom": "catalog:",
"typescript": "catalog:"
}
}
// packages/legacy/package.json
{
"dependencies": {
"react": "catalog:react18" // 用命名 catalog
}
}
🟢 译者点评:catalog: 是 monorepo 内”统一升级”的最简方案。修一处 pnpm-workspace.yaml,所有 workspace 同步升 React。比 npm overrides 更精确(catalogs 只在 workspace 内,不跨包提升)。
2. Turborepo 2.6 + Boundaries
// turbo.json
{
"$schema": "https://turbo.build/schema.json",
"tasks": {
"build": { "dependsOn": ["^build"], "outputs": ["dist/**"] },
"test": { "dependsOn": ["build"] }
},
"boundaries": {
"tags": {
"internal": {
"dependencies": { "deny": ["public"] }
}
}
}
}
turbo run build --filter=...^ # 受影响的包及其依赖
turbo watch dev # 持续监听
🟢 译者点评:Boundaries 仍 experimental,但 2026 是替代 Nx tags / eslint-plugin-boundaries 的主流路线。它检查跨 package 引用 + 未在 dependencies 声明的 import,把”架构守卫”做成 task runner 一等公民。
3. Nx 21 AI 集成
# 创建
npx create-nx-workspace@latest
# AI / MCP
nx mcp --start # 启动 Nx MCP server
# 然后在 Cursor / Claude Code / VS Code 加 mcp config 指向它
# Self-Healing CI
nx-cloud configure --self-healing # 失败任务自动 PR 修复
🟢 译者点评:Nx 21 把 LLM 直接接到 project graph。LLM 通过 MCP 直读 task config / dependency,不再瞎猜。这是 monorepo 工具向 AI agent friendly 进化的第一个实战案例。
4. Moon 2.0 “Phobos”(Rust polyglot)
# .moon/workspace.yml
projects:
- apps/*
- packages/*
# apps/web/moon.yml
type: application
language: typescript
tasks:
build:
command: 'next build'
deps: ['^:build']
inputs: ['src/**', 'next.config.ts']
moon run :build # 跑所有 :build
moon ci # CI 模式
🟢 译者点评:Moon 是”polyglot 派”代表(JS/TS/Rust/Go/Ruby 一个 monorepo 跑通)。Rust 写的 task runner,远程缓存自带 server,适合”嫌 Nx 太重 / 嫌 Turbo 太轻”的中型团队。
5. Vite+ vp CLI(Alpha)
vp create # 交互式建 monorepo
vp dev # Vite dev server
vp build # Rolldown
vp test # Vitest
vp lint # Oxlint
vp run # 自动 task graph + caching
🟢 译者点评:Vite+ 试图整体替代 Turborepo(在 Vite/Vitest 项目里)。仍 Alpha,生产慎用,但 side project 完全可以试。
6. changesets + Knip 配套
# changesets 多包发布
npx @changesets/cli init
pnpm changeset
pnpm changeset version
pnpm changeset publish
# Knip(取代 depcheck,2026 默认)
npx knip
npx knip --fix
🟢 译者点评:Knip 是 2026 default。取代 depcheck,monorepo 一等公民,识别 workspace 间依赖。“找出未用 export / 未用 deps”这一类老问题终于有了好工具。
🟢 译者总评
- 新项目默认:pnpm 11 + workspace catalogs + Turborepo 2.6 + changesets + Knip(最稳)
- 企业 / Angular / 大库:pnpm + Nx 21(深 AI 集成)
- 多语言 polyglot:Moon 2.0 或 Bazel + rules_js
- 新栈试水:Vite+
vp(Alpha) - 存量 Lerna 项目:Lerna 8 已是 Nx-powered,可以平滑迁
- 不要选:Yarn 4 PnP 在新项目仍是非主流(除非有 constraints 强约束需求);npm workspaces 严肃场景不够
- 配套读:TypeScript 7 的
isolatedDeclarations在 monorepo 里收益最大