pnpm 12 正式发布,用 Rust 重写了整个工具本体,但官方特意强调:这不是一次“升级”,而是一次刻意做出来的“非迁移”。命令、参数、配置项、锁文件格式全部照抄 pnpm 11,你几乎感觉不到脚下的引擎已经换了。真正值得琢磨的,不是“换成 Rust 有多快”,而是 pnpm 借着这次重写,把项目工具链的控制权又往自己手里收了一截。
稳定是真的,但兼容是刻意做出来的
pnpm 12 已经是稳定版,但 npm 上的 latest 标签仍然指向 pnpm 11,要装新版本得用 pnpm self-update next-12——专门开了个 next-12 标签。Homebrew、winget、Scoop、Chocolatey 这些主流分发渠道,目前都还没跟上。
官方把它定义成“重写”而不是“迁移”:pnpm 11 的命令、flag、配置项、锁文件格式全部继续可用,两套文档同时维护。不过“继续可用”不等于“行为完全不变”,真正动了刀的地方集中在几处:
- Git 依赖的解析方式变了.GitHub、GitLab、Bitbucket 上的仓库,不管你写
owner/repo还是git+ssh://,现在统一走该平台的 HTTPS 规范地址解析,锁文件不再记录 SSH URL——要用 SSH 拉私有仓库,得在机器层面配置 git 自己的 URL 重写规则。 - `pnpm-workspace.yaml` 里的拼写错误,以前会被悄悄吞掉,现在会报错或警告,并提示最接近的正确写法。
engineStrict的判定粒度变细:只要一个不兼容的包能通过常规依赖链路到达,就会失败,不再因为它挂在 optionalDependencies 底下就被放过。
循环依赖锁文件:更快更小,但别套用到别的项目
pnpm 12 把循环依赖的“断环点”固定下来:同一组循环依赖包,不管从哪个方向走进循环、不管 importer 顺序怎么排,断开的位置都是同一个。这意味着锁文件第一次变成了依赖图的纯函数——重复安装、重新排序都能生成字节级相同的锁文件,pnpm 11 做不到这一点。
官方给出的基准很具体:在循环依赖密集的大型 workspace 里,peer 依赖解析速度提升 2-3 倍,内存占用降低约 25%,锁文件体积也明显变小。
- 提醒.这组数字只测过“循环依赖密集”的大型 workspace,不能当成 pnpm 12 整体提速的证据,普通项目大概率感觉不到差别。
旧锁文件不用重新生成,--frozen-lockfile 照常吃得下;只有真正触发重新解析的那一次安装,会把循环依赖包的 peer 变体重新编号一次。
从装包工具到工具链管家
这次真正有增量的地方,不在 Rust,而在 pnpm 把手伸向了它以前不管的领域。
全局安装的 node、deno、bun,现在会自动跟着当前项目锁定的版本切换,不用装插件、不用敲 use 之类的命令——新设置叫 globalShims。稳定版 Node.js 切换是静默的(会验证官方签名),但换成预发布版、Deno、Bun,第一次都会弹一句“信任这个项目吗”,之后就记住。
更进一步,pnpm 现在能替你装别的包管理器:npm、Yarn Classic、Yarn Berry、Yarn 6、Bun,全部走可信注册表校验签名。pnx yarn@4 install 能直接跑一次 Yarn Berry;pnpm shim add yarn 能让 yarn 命令自动跟随项目锁定的版本。一个用 Yarn 构建的仓库,克隆到只装了 pnpm 的机器上,也能顺利跑起来。
registry revisions(同版本号发布补丁包)、批量审批发布、audit.ignorePrune,这几项其实 pnpm 11.25 已经先上过车,不是 pnpm 12 独占的新东西。
Rust 重写这件事,本身没有制造出一个更快的 pnpm,它制造的是一个更确定的 pnpm。官方反复强调“重写不是迁移”,说的是同一件事:不想让用户为一次内部换血付出行为改变的代价。这份克制,值得认。
但更该盯住的是另一条线:全局 Node/Deno/Bun 跟随项目切换、pnpm 亲自安装其他包管理器、registry revisions 决定哪个版本的代码真正跑在你机器上——这些加在一起,pnpm 已经不只是“帮你装依赖的工具”,而是在往项目工具链的守门人这个位置上走。这条路走得越远,越像早年 npm 想把 registry、CLI、账号体系全部攥在自己手里的那套逻辑,只是这次姿态更谨慎。
远程 side-effects cache 目前还只是概念验证,只支持 Linux glibc x64/arm64,一失败就退回本地构建——离能规模化用在生产 CI 里,还差得远。
兼容性是让出去的,控制权是收回来的。
维护大型 monorepo 的团队,这次最该做的不是急着升级,是先看清自己的 workspace 有没有踩在“循环依赖密集”这条基准线上;踩不上,Rust 重写对你来说更多是一份安心,不是提速。
