你以为 pnpm 快靠的是硬链接,今天 pnpm 12 用 Rust 把这件事彻底翻了
写过前端的人都以为 pnpm 快靠的是它的硬链接机制。今天 pnpm 12 用 Rust 把这件事彻底翻了——缓存预热的重复安装从 472ms 压到 15ms,Vercel 1670 个包的工作区安装时间中位数缩短 90.5%。
pnpm 12 在 2026 年 9 月第二周正式发布。它的核心变化一句话就能说清:把 TypeScript + Node.js 的执行引擎整体换成了 Rust 二进制,但把命令、参数、锁文件格式和 node_modules 布局完整保留了下来。
你不需要改任何脚本,不需要重新学习任何 flag,不需要碰 CI 配置——引擎换了,车还是同一辆。
数据:最震撼的是那一个数字
pnpm 官方在发布当天给出了一组 benchmark,最抓眼球的是这一个:
缓存、锁文件、node_modules 全部预热好的状态下,重复安装从 472ms 降到 15ms
这不是 20% 的优化,是 31 倍。
再看其他数字:
- 全新安装(冷启动):8.2s → 5s,提升 39%
- Vercel 21 个项目组成的 Turborepo 工作区,1670 个包,六种场景下安装时间中位数缩短 64.4% ~ 90.5%
- 空闲 CPU 使用率降低 5 倍
- 内存使用最多减少 35%
但这组数字里藏着一个反直觉的 trade-off:第一次未命中缓存的冷启动反而慢了 11.1%。原因是 Rust 编译出来的二进制产物比 TypeScript 直译版大,导致 Corepack 下载、解压、启动的链路变重了。不过一旦第一次跑完,后续每次热启动都快 74.7%。
为什么 Rust 带来了这个量级的提速
光说”Rust 比 JS 快”是废话,背后有两条具体原因。
第一条:没有 GC 停顿。 JavaScript/Node.js 在运行时需要垃圾回收,而 GC 的”世界停顿”(stop-the-world)在 I/O 密集型的包管理器场景里是致命的——每次安装都要处理成千上万个文件,GC 随时可能喊停。Rust 没有 GC,内存布局是确定的,同样的任务只要硬件撑得住就是纯线性执行。
第二条:并行度更高。 pnpm 的内容寻址存储(content-addressable store)需要大量文件 stat、hardlink、symlink 操作。Node.js 的异步 I/O 在这类场景里受制于事件循环的单线程调度,而 Rust 的 async 任务调度器(基于 Tokio)可以更精细地控制并发度,依赖树越复杂越能拉开差距。
你可能需要改一个 CI 命令
升级代价极低,但有一个坑值得提前检查:
pnpm 12 移除了 pnpm install --resolution-only,替换为 pnpm peers check。如果你在 CI 里用了这个 flag,更新它——这是目前已知最容易触发 CI 失败的 breaking change。
其他需要注意的:
- GitHub / GitLab / Bitbucket 托管的 Git 依赖默认走规范 HTTPS 路径,原有 SSH 配置需通过 Git URL 重写适配
pnpm-workspace.yaml里未知的 key 以前被静默忽略,现在会报 warning- Linux 安装现在优先尝试硬链接(hardlink),再 fallback 到 reflink
怎么升级
# 方式一:用 corepack
corepack prepare pnpm@12.3.4 --activate
corepack enable pnpm
pnpm --version # 确认变成 12.x
# 方式二:直接升级现有 pnpm
pnpm self-update next-12
目前 npm 的 latest 标签仍指向 pnpm 11,等各包管理器平台(Homebrew、winget、Scoop、Chocolatey)完成跟进后再统一切也行。
更大的图景
pnpm 12 不是孤例。2026 年 9 月,JavaScript 工具链的核心层正在经历一轮系统性 Rust 化:Rolldown 1.0 成为 Vite 8 的默认引擎(生产构建 10-30x 提速),pnpm 12 重写了包管理器本身,Oxc 全家桶(parser / linter / formatter / minifier)覆盖了代码质量检查全链路。
npm 生态的核心基础设施,从构建到安装到代码检查,在一个月内全部换了底层。这不是某个工具的升级,是整个生态在向 Rust 统一——不是因为”Rust 更好”这种情怀,而是因为当性能瓶颈撞上真实项目规模,Rust 的工程特性是唯一解。
下一步:如果你的项目跑的是 monorepo,现在就是升级 pnpm 12 的窗口期——CI 里的 frozen lockfile 命令一行不改,只有那个 --resolution-only 要提前查一下。
评论区
登录后可评论。