跳到主内容

🚀 2025年的 pnpm

· 一分钟阅读
Zoltan Kochan
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 默认情况下不再运行 preinstallpostinstall 脚本,从而消除了一类巨大的供应链攻击途径。

为了完善此控制,我们在 v10.26 中引入了 allowBuilds,用更灵活的配置取代了之前的 onlyBuiltDependencies

allowBuilds:
esbuild: true
# 仅允许特定版本
nx@21.6.4: true

纵深防御(v10.16v10.21

我们并没有止步于剧本。 我们增加了多层防御措施,在恶意软件到达你的磁盘之前就将其拦截:

  • minimumReleaseAge: 阻止“零日”版本(例如,发布时间不足 24 小时的软件包),让社区有时间标记恶意更新。
  • trustPolicy: no-downgrade: 防止安装来源不如以前版本可靠的更新(例如,未经 CI/CD 验证发布的版本)。
  • blockExoticSubdeps: 防止受信任的依赖项从不受信任的源拉取传递依赖项。

全局虚拟存储 (v10.12)

pnpm 的一项原创创新是内容寻址存储,它通过文件去重来节省磁盘空间。 在 v10.12中,我们使用全局虚拟存储向前迈出了一步。

以前,项目都有自己的 node_modules 结构。 启用 enableGlobalVirtualStore: true 后,pnpm 现在可以将磁盘上中央位置的依赖项直接链接到您的项目中。 这意味着:

  1. 大幅节省磁盘空间:项目之间共享相同的依赖关系图。
  2. 更快的安装速度:如果您有 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 执行构建脚本。
pnpm-workspace.yaml
configDependencies:
pnpm-plugin-my-company: "1.0.0+sha512-..."

这样可以确保你的 pnpm 配置具有版本控制、一致性,并且在包管理器需要时可用。

自动 JavaScript 运行时管理(v10.14 和 v10.21)

我们已经支持 Node.js 运行时管理一段时间了。 2025年,我们将其扩展到支持其他运行时环境,例如 Deno 和 Bun。

现在您可以通过在 package.json 中通过 devEngines.runtime 指定所需的运行时:

package.json
{
"devEngines": {
"runtime": {
"name": "node",
"version": "24.6.0"
}
}
}

pnpm 将自动下载并使用该特定版本的运行时来运行该项目中的脚本。 这使得“在我的机器上运行正常”成为过去式——团队中的每个人都使用完全相同的运行时,完全由 pnpm 管理。

展望未来

我们已经开始着手开发 pnpm v11.0,该版本在性能方面有一些明显的改进。 全局虚拟存储默认情况下尚未启用。 我们将致力于修复漏洞和完善缺失的功能,以便在未来的主要版本中默认启用该功能。