👇 今日要闻
打破信息壁垒,走近全球前端。Hello 大家好,我是林语冰。
之前我们分享过 nub,它是用 Rust 为 Node 插上翅膀的一体化工具。更牛掰的是,nub 的模块安装速度甚至反超了 pnpm!
这是因为,nub 底层依赖的包管理器并不是 pnpm,而是基于 Rust 实现的 npm 替代品 aube。
时来运转,现在轮到 pnpm 即将拥有极致的原生性能了。
pnpm 之父爆料,pnpm 12 将采用 Rust 完全重写,同时官宣 pnpm 12 RC(候选版)现已发布。
本期我们就一起来瞄一下 pnpm 12 移植到 Rust 之后,除了性能飙升,它和 pnpm 11 还有哪些关键区别。
👉 pnpm 进化史
pnpm 之父改用 Rust 重写 pnpm 最早可以追溯到前几年,那时尤雨溪还不懂 Vite,ChatGPT 也不会 chat,前端生态尚未掀起“万物皆可 Rust 锈化“的全金属狂潮。
没想到短短数载却人是物非,AI 编程疯狂内卷,缩短了大型开源项目的迭代周期。举个栗子,Bun 之父只耗时 11 天,就联手 AI 把 Bun 从 Zig 移植到了 Rust,给我整得喵瞪狗呆。
今年,Rust 移植版的 pnpm 12 也在快速迭代:
- 2026-05,pnpm 12 速度全面超越旧版
- 2026-06,pnpm 12 增量支持安装、解析和链接等完整功能
- 2026-07,
pnpm自身源码的直接使用 pnpm 12 内测
就在今天,pnpm 12 候选版发布,它的 API 和 pnpm 11 大同小异。
但 pnpm 12 底层移植了 Rust 引擎,而且这个全新的主版本和 pnpm 11 会有三大不同点,下文我们展开说明。
👉 对等依赖检查的区别
pnpm 11 支持 --resolution-only 标志,用于报告对等依赖的相关问题。
举个栗子,某个 Vue 组件库对等依赖于 Vue 2 还是 Vue 3,某个 React 状态库是否对等依赖 React 19,这些都能通过该标志来检查。
虽然但是,pnpm 12 却 不再支持 --resolution-only 标志,而且会直接报错。
👇 pnpm 12 请改用 check 命令:
其实 pnpm 11 开始就新增了 check 命令,它不要求重新安装,而是直接读取锁定文件,检查对等依赖关系。
因此,pnpm 12 废弃 --resolution-only 标志之后,我们继续沿用 pnpm peers check 命令就欧了。
👉 Git 依赖解析的区别
pnpm 支持安装非 npm 注册源的模块,比如 Git 仓库安装依赖等。
举个栗子,从 GitHub 仓库安装一个工具模块 is-negative,用于判断数字是否为正数,安装示例如下:
pnpm 12 之前,解析过程会探测并确定使用 HTTPS 还是 SSH,这可能导致开发时碰巧可用的传输方式被记录下来,但在 CI(持续集成)时却因为缺失相应的密钥而出错。
因此,pnpm 12 移除了探测过程,对于 GitHub 等仓库,说明符现在代表一种 ID 标识,而不是传输方式:
- github:kevva/is-positive
- git+github.com/kevva/is-po…
- git+ssh://git@github.com/kevva/is-positive.git
上述不同传输标识现在都指向相同模块,解析方式也相同。
⚠️ 注意,如果你在旧版 pnpm 中存在解析失败的情况,请使用 pnpm update <package> 重新解析依赖。
👉 项目感知的全局模块
pnpm 12 增加了一个新功能:项目感知的全局 bin(二进制文件)。
它的作用是,全局模块会遵循本地项目的版本要求。当你在本地项目中执行相同模块不同版本的全局命令时,pnpm 能感知当前项目锁定的版本。
举个栗子,这是 pnpm 源码的 package.json 配置:
可以看到,pnpm 通过 devEngines.runtime 属性锁死了自身源码的 node 版本。
这里的 v26.7 是 Node 的最新现行版,但我们一般全局安装的 Node 会比较保守,使用更低、但更稳定的 LTS(长期支持版),目前是 v24.19。
pnpm 12 中,如果全局和本地项目的 Node 版本不同,pnpm 会感知当前项目的配置:
这样,在本地项目中运行 node 全局命令会使用当前锁定的版本,而在项目外运行则使用全局版本。
还有,pnpm 12 在 pnpm-workspace.yaml 配置文件中新增了 globalShims(全局兼容补丁),用于控制这种行为:
默认情况下,pnpm 12 对项目感知的全局 bin 只支持 node、deno 或 bun 等运行时。如果你想启用其他开发环境,可以使用 globalShims 配置。
举个栗子,对于全局和本地安装的 typescript,配置如下:
⚠️ 注意,pnpm 在安装时决定为哪些 bin(二进制文件)分配 shim(兼容补丁),因此,即使你之前全局安装过 typescript,也需要重装一遍:
之后,全局安装的 typescript 在本地项目中运行命令时,也会遵循本地项目锁死的版本。
👉 pnpm 12 现状
从 Beta 公测版开始,pnpm 12 就在十大最流行的 pnpm monorepo 仓库上进行“临床试验“,包括但不限于:
- Next:GitHub 第一全栈元框架
- Vite:GitHub 第一构建工具
- Vue:GitHub 性能第一响应式框架
更变态的是,pnpm “吃自己的狗粮“,其源码的 monorepo 仓库早已使用 pnpm 12 以身试毒:
当然,pnpm 团队还爆料,pnpm 12 性能飙升,官方公布的跑分如下:
如图所示,pnpm 12 速度全面远超旧版,直接从原来长长的灰色一条,优化成了现在短短的黄色半根。
👇 重点总结
pnpm 之父爆料,pnpm 12 将采用 Rust 完全重写,性能飙升,功能则和旧版大同小异,主要包括三大不同点:
- 对等依赖检查:废弃
--resolution-only标志,沿用pnpm peers check - Git 依赖解析:移除基于特定说明符的探测和记录过程,避免解析失败
- 项目感知的全局 bin:全局安装的
node等模块会感知本地项目,遵循本地项目锁定的版本
👍 以上就是本期《前端日报》的全部内容了,如果读完对你有所帮助,可以按赞打卡、在看推荐或转发分享。
🙏 已经关注我的粉丝们,我们下期再见啦,掰掰~~
👇 参考文献:
- 🔗 pnpm 12 官方博客:pnpm.io/blog/whats-…