写过前端的都以为 pnpm 快是因为它用了硬链接,今天 pnpm 12 用 Rust 把这件事从根上翻了

配了八年 pnpm,每次装完依赖都跟同事吹「pnpm 就是快」。结果 2026 年 8 月 26 日 pnpm 12 发布,所有人都傻了——这个快不是优化出来的,是把整个 CLI 重写了一遍换来的。

核心数据:pnpm 12 热安装从 472ms 压到了 15ms,空闲 CPU 使用率降低 5 倍,内存使用最多减少 35%。

这不是小版本迭代。pnpm 12 是 Zoltan Kochan 从 JavaScript/TypeScript 到 Rust 的完整重写。Linear 真实项目验证:生产构建从 46 秒降到 6 秒。Vercel 在大型 monorepo 上测试,中位数安装时间减少 64% 到 90%。


改动大吗?不大。

pnpm 12 设计目标就一条:升级不应该像迁移

v11 的几乎所有命令、标志和锁文件格式都沿用了下来。你不需要改任何命令,不需要改任何配置。pnpm install 还是 pnpm installpnpm add 还是 pnpm add,底层已经换成 Rust 重写了。

唯一不同的几件事(官方列在 What’s different in pnpm 12):

  • pnpm install --resolution-only 这个标志被删了
  • Git 依赖的 URL 解析改成了走标准 HTTPS 而不是 SSH
  • 不认识的 workspace 配置现在会报警并失败

锁文件格式没变,现有的 pnpm-lock.yaml 继续用。monorepo 里不用改一行 yaml。


里面到底变了什么?

循环依赖的锁文件做了规范化处理。以前循环依赖的锁文件记录方式不一致,peer 解析要跑很多遍。pnpm 12 对循环依赖图做了 canonical 化,peer 解析快 2-3 倍,内存占用减少约 25%。

热安装速度质变。热安装(warm install,指缓存已存在的情况)从 472ms 压到 15ms,差了 31 倍。这个场景是 monorepo 日常:每次 git checkout 切分支之后跑 pnpm install,绝大多数情况下依赖已经在缓存里了。15ms 几乎感觉不到等待。

新增了几个新能力

  • pnpm init --pin 固定最新 pnpm 版本,防止团队里有人装错
  • 项目级的全局 bin 目录(node_modules/.bin 只属于当前项目,不会再冲突)
  • pnpm pipeline 命令:用 CI 同样的方式跑 workspace 里的任务
  • pnpm provisioning:pnpm 可以代为管理 npm / Yarn / Bun 的安装

pnpm 12.4 还开始支持在同一个 workspace 里装 Rust crates 和 Python 包,和 npm 包放在一起。


为什么不早点做?

pnpm 一直是 JavaScript 写的。它的 Hard Links + Symlinks 节省磁盘空间的思路是聪明的工程设计,但本质上还是 Node.js。

问题出在 JavaScript 运行时本身:Node.js 有 GC,每次 GC 暂停都会打断正在做的 I/O 操作。pnpm 装包是文件系统密集操作——创建目录、写文件、link 文件——GC 一暂停,整条流水线就卡一下。这个卡顿不大,单次装包可能只多几毫秒,但 monorepo 里可能有几百个包,累积下来就明显了。

Rust 没有 GC。Rust 的内存布局是确定的,做文件 I/O 的时候不会有任何不可预期的停顿。这是 pnpm 能把热安装压到 15ms 的底层原因。


整个工具链都在变

pnpm 12 不是孤例。2026 年 9 月整个 npm 生态的工具链都在 Rust 化:

  • Vite 8:默认引擎换成 Rolldown(Rust),Linear 实测生产构建 46 秒 → 6 秒
  • pnpm 12:刚发的 Rust 重写版,热安装 472ms → 15ms
  • Oxc:Parser + Linter + Formatter 全家桶,比 ESLint 快 40 倍
  • Bun:2026 年完成 Zig → Rust 重写(Anthropic 收购后)
  • Rspack 2.x:字节跳动出品,Rust 写的 Webpack 替代

每一条工具链都在从 JavaScript 切换到 Rust。原因是同一个:GC 停顿在构建场景里不可接受,而 Rust 能给出确定性的执行时间。


怎么升级?

现在 latest 还指向 pnpm 11,要装 pnpm 12 需要:

pnpm self-update next-12

或者用 Corepack:

corepack prepare pnpm@next-12 --activate

装完验证版本:

pnpm --version
# 12.x.x

建议先在 CI 里跑一遍,确保没有 break。有些 GitHub Actions 里的 actions/checkout + pnpm install 组合如果用了 SSH URL 拉 git 依赖,会因为 HTTPS 改道而失败,需要在 .npmrc 里显式配置 git+https:// 而不是 git@


pnpm 12 是个信号:JavaScript 工具链的 Rust 化不是未来,是已经发生的事实。Vite 默认跑 Rolldown,pnpm 默认跑 Rust CLI,下一个该轮到谁?

评论区

0 条评论

登录后可评论。

阿柯·前端架构 10 阅读