🚀 2025年的 pnpm
2025 年对于 pnpm 来说是具有变革意义的一年。 虽然我们的主要重点是重新定义软件包管理的安全模型,但我们也显著提高了性能和开发者体验。
从默认阻止生命周期脚本到引入全局虚拟存储,以下回顾一下 2025 年发布的主要功能。
使用方法
根据 下载统计 pnpm 的下载量是 2024 年的 2 倍!

首页重新设计
你可能已经注意到,我们重新设计了主页! 此次重新设计得益于我们最主要的赞助商 Bit.cloud。
新的主页现在使用 Bit 组件 构建,其中很多工作都是使用 Bit 的 AI 代理 Hope AI 完成的。https://bit.cloud/pnpm/website 我们现在甚至有了自己的设计系统。
我在 Bit 公司全职从事依赖管理工作。 在底层,Bit 使用 pnpm 进行安装。
在 JSNation 上的演讲
今年对我个人而言是一个巨大的里程碑,因为我第一次在大型国际会议——6 月在阿姆斯特丹举行的 JSNation 会议上进行了现场演讲。 我要感谢 JSNation 团队给予我这个绝佳的机会!

令我惊喜的是,pnpm 在社区中如此知名,而且有那么多人在工作中使用它!
功能亮点
现在,让我们深入了解一下 pnpm v10 在 2025 年期间发布的最重大变化。
默认安全
今年最重要的变化是 pnpm 转向“默认安全”。 在 pnpm v10.0 中,我们不再隐式信任已安装的软件包。
阻止生命周期脚本 (v10.0)
多年来,pnpm install 意味着信任整个依赖树来执行任意代码。 在 v10 版本中,我们关闭了此功能。 pnpm 默认情况下不再运行 preinstall 或 postinstall 脚本,从而消除了一类巨大的供应链攻击途径。
为了完善此控制,我们在 v10.26 中引入了 allowBuilds,用更灵活的配置取代了之前的 onlyBuiltDependencies:
allowBuilds:
esbuild: true
# 仅允许特定版本
nx@21.6.4: true
纵深防御(v10.16 和 v10.21)
我们并没有止步于剧本。 我们增加了多层防御措施,在恶意软件到达你的磁盘之前就将其拦截:
minimumReleaseAge: 阻止“零日”版本(例如,发布时间不足 24 小时的软件包),让社区有时间标记恶意更新。trustPolicy: no-downgrade: 防止安装来源不如以前版本可靠的更新(例如,未经 CI/CD 验证发布的版本)。blockExoticSubdeps: 防止受信任的依赖项从不受信任的源拉取传递依赖项。
全局虚拟存储 (v10.12)
pnpm 的一项原创创新是内容寻址存储,它通过文件去重来节省磁盘空间。 在 v10.12中,我们使用全局虚拟存储向前迈出了一步。
以前,项目都有自己的 node_modules 结构。 启用 enableGlobalVirtualStore: true 后,pnpm 现在可以将磁盘上中央位置的依赖项直接链接到您的项目中。 这意味着:
- 大幅节省磁盘空间:项目之间共享相同的依赖关系图。
- 更快的安装速度:如果您有 10 个项目使用
react@19,pnpm 只需要全局链接一次。
原生 JSR 支持(v10.9)
我们采用了具有原生支持的新 JSR 注册表。 现在可以使用 jsr: 协议直接从 JSR 安装软件包:
pnpm add jsr:@std/collections
这样就能在 package.json 中正确映射,并能与 npm 依赖项无缝地处理 JSR 包的独特解析规则。
配置依赖项(v10.0)
对于单体仓库和复杂的设置,我们引入了**配置依赖项**。 此功能允许你在多个项目中共享和集中管理 pnpm 配置(例如钩子、补丁和构建权限)。
配置依赖项在解析主依赖关系图之前安装到 node_modules/.pnpm-config 中。 这意味着你可以用它们来:
- 在不同仓库之间共享
.pnpmfile.cjs钩子。 - 集中管理
patchedDependencies的补丁文件。 - 维护一个共享的软件包列表,允许这些软件包为
allowBuilds执行构建脚本。
configDependencies:
pnpm-plugin-my-company: "1.0.0+sha512-..."
这样可以确保你的 pnpm 配置具有版本控制、一致性,并且在包管理器需要时可用。
自动 JavaScript 运行时管理(v10.14 和 v10.21)
我们已经支持 Node.js 运行时管理一段时间了。 2025年,我们将其扩展到支持其他运行时环境,例如 Deno 和 Bun。
现在您可以通过在 package.json 中通过 devEngines.runtime 指定所需的运行时:
{
"devEngines": {
"runtime": {
"name": "node",
"version": "24.6.0"
}
}
}
pnpm 将自动下载并使用该特定版本的运行时来运行该项目中的脚本。 这使得“在我的机器上运行正常”成为过去式——团队中的每个人都使用完全相同的运行时,完全由 pnpm 管理。
展望未来
我们已经开始着手开发 pnpm v11.0,该版本在性能方面有一些明显的改进。 全局虚拟存储默认情况下尚未启用。 我们将致力于修复漏洞和完善缺失的功能,以便在未来的主要版本中默认启用该功能。
