pnpm 11 发布:纯 ES6 模块时代开启,供应链安全全面升级

by JeariCk 2 min read
包管理工具pnpm

2026年5月,它发了第11个主版本。改动不小——分发格式切成纯 ES6 模块,发布流程不再依赖 npm CLI,供应链安全默认拉满。如果你还在用 v10,这次升级值得看看。

包管理工具pnpm
包管理工具pnpm

纯 ES6 模块分发,Node.js 22 起步

v11 最显眼的变化是自己先变成纯 ESM 了。不再提供 CommonJS 分发包,同时要求至少 Node.js 22 起步,砍掉了对 18、19、20、21 的支持。

门槛不算高——Node.js 22 在 2025 年就是 LTS 了。但如果你的 CI 镜像还在跑 Node.js 20 甚至更老的版本,升级之前得先同步更新一下 Node.js。

另外,独立可执行文件要求 glibc 2.27+。还在用 CentOS 7 那类老镜像的话,需要留个心眼。


供应链安全不再是选项,是默认

这大概是新版最重要的变化,也说明 package manager 在 Node.js 生态里的角色在变。

新包强制延迟 24 小时

npm 攻击的套路大家都熟:攻击者劫持维护者账号,发一个带后门的版本,等 CI 自动拉取。Mini Shai-Hulud 那类供应链攻击就是这么干的——用 preinstall 钩子下载 Bun 运行时,执行混淆后的凭据窃取脚本,目标直指开发者环境和 CI/CD 密钥。

v11 的应对很直接:新发布的包默认延迟 24 小时才能被解析安装。`minimumReleaseAge` 默认 1440 分钟。不管攻击者多快发布恶意版本,你有整整一天缓冲窗口等社区发现并清理掉问题包。

如果急着要某个刚发布的安全修复,可以用 `pnpm audit –fix` 自动加白名单绕过。或者在配置里设 `minimumReleaseAge: 0` 完全退出。

阻断非标准依赖来源

`blockExoticSubdeps` 现在默认开了。所谓 exotic subdeps,就是从 Git 仓库、tarball URL 这类来源解析的传递依赖。这些来源不受 npm 注册表管控,经常被用来藏私货。默认阻断相当于给依赖图加了一道安检。

统一的构建脚本控制

v11 用 `allowBuilds` 统一替换了之前分散的五个配置项。一个 map 就能精细控制哪些包能执行构建脚本:

“`yaml

# pnpm-workspace.yaml

allowBuilds:

  electron: true

  core-js: false

  esbuild: false

“`

生命周期脚本一直是 npm 攻击里被滥用最多的路径。这套新模型不能替代代码审查,但至少让管控更清晰,团队一眼能看到哪些包有执行权限。


原生发布流程:告别 npm CLI

从项目诞生那天起,publish 底层一直在调 `npm publish`。v11 把这个问题解决了——publish、login、logout、view、deprecate、unpublish、dist-tag、version 全用原生实现。

少一层依赖,就少一个攻击面。以前 npm CLI 的 bug 会影响用户,现在发布流程完全自己掌控。OTP 环境变量也从 `NPM_CONFIG_OTP` 改成了 `PNPM_CONFIG_OTP`,Web 认证支持扫码登录。


SQLite 存储索引与性能提升

v11 的 Store 架构升到了 v11。最大改动是把原来数百万个 JSON 文件合并到单个 SQLite 数据库。WAL 模式支持并发访问,包的 manifest 信息直接存入索引,省了安装时反复读 package.json 的开销。

其他优化:

– 用 undici 替代 node-fetch 处理 HTTP,支持双栈连接

– 已知大小的 tarball 下载预分配内存,避免重复拷贝

– 元数据缓存改 NDJSON 格式,配合 If-Modified-Since 做条件请求

– CAS 文件直接写入内容寻址路径,省去临时文件加重命名——冷安装减少约 3 万次 rename 调用

– 全局虚拟存储启用后,约 95% 的包在 Node.js 升级或架构变更时无需重新导入

一个数据点:有缓存和 lockfile 的 warm install 场景下,只要 2.3 秒。


全局安装隔离

`pnpm add -g` 的行为变了。每个全局包现在都有独立的目录、package.json、node_modules 和 lockfile,互相不干扰。之前因为 peer 依赖冲突导致全局工具罢工的情况,应该会少很多。

全局安装的二进制文件放 `PNPM_HOME/bin` 子目录下,不再直接丢进 `PNPM_HOME`,shell 补全也更干净。


SBOM 生成与审计升级

v11 加了一个企业场景的命令:`pnpm sbom`,能生成 CycloneDX 1.7 或 SPDX 2.3 格式的软件物料清单。项目要过合规审计的话很实用。

audit有两个更新:

1. `pnpm audit –fix=update`:不再靠加 overrides 修漏洞,直接在 lockfile 里更新到修复版本。

2. 切到 GHSA 过滤:npm 注册表废弃了旧的 CVE 审计端点,改用 GHSA。迁移时要把原有的 CVE 条目换成对应的 GHSA。


配置体系重构

v11 清理了配置体系:`.npmrc` 只管鉴权和注册表设置,特有的配置全移到 `pnpm-workspace.yaml` 或新的 `config.yaml`。`npm_config_*` 也被 `pnpm_config_*` 取代。

嫌迁移麻烦的话,官方提供了 `pnpm-v10-to-v11` codemod,大部分配置变更可以自动处理。


接下来:v12 与 Rust 安装引擎

团队已经在开发下一代引擎 [Pacquet](https://github.com/pnpm/pacquet),基于 Rust 重写,预计 v12 落地。第一阶段聚焦 fetch 和 link,后续再覆盖依赖解析。

官方放的 benchmark 有点意思:lockfile-only 的无缓存安装场景,Rust 引擎 3.1 秒,v11 要 4.7 秒。Warm install 更夸张——902 毫秒对 2.3 秒。还没到生产就绪,但方向很清楚了。


总结

v11 的核心变动:

安全:供应链保护从可选变成默认,延迟新包、阻断非标准依赖、统一构建脚本控制。

自主:告别 npm CLI 依赖,发布流程原生实现。

性能:SQLite 替换 JSON 索引,undici 替换 node-fetch,存储架构重写。

清理:纯 ESM、Node.js 22 起步、配置体系重构。

不只是版本号加一。新项目建议直接上 v11;现有项目看完 Breaking Changes 清单再迁移——大部分改动 codemod 能自动处理,最需要关注的是 Node.js 版本和配置迁移。

下一站 v12 的 Rust 引擎。package manager 之间的竞争,越来越有意思了。

*参考来源:*

[官方发布说明 — 11.0]

[v11 Adds Supply Chain Protection Defaults – Socket]

[v11 Release Candidate: ESM Distribution, Supply Chain Defaults – InfoQ]

📖 推荐阅读

看完工程化的内容,也看看这些跟前端工程师以及AI有关的文章,你可能会感兴趣:

React Compiler 1.0 来了:以后useMemo 和 useCallback 可以删了?

React 19 与 Vue 3.6:同一个2026年,两种不同的前端哲学

本地运行开源大模型指南:从Ollama到DeepSeek,手把手搭建你的私人AI

Dify是什么,程序员值得了解的开源AI应用开发平台

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注