PNPM 发布 10.12.1 版本,安装依赖包速度进一步提升,NPM 看不见尾灯 🚀🚀🚀

1,647 阅读5分钟

近日(2025 年 6 月 11 日),pnpm 发布了 10.12.1 版本,引入两项重大更新:全局虚拟存储(Global Virtual Store,实验性) 和 版本 Catalog 系统的增强。这些更新大幅提升了安装速度和 monorepo 中的依赖管理效率,尤其对大型项目而言意义突出。

20250625115734

下面我将从原理、配置与使用,适用场景等方面展开详解。

1. 实验性功能:全局虚拟存储

旧版机制中,pnpm 会在项目目录中的 node_modules/.pnpm 下解压并管理所有依赖,实现依赖的本地隔离。这种方案虽然保证了项目间的互不干扰,但导致多个项目间相同依赖会被重复下载和存储,效率和磁盘利用率都有局限。

而在实验性的全局虚拟存储机制中,pnpm 会将所有依赖集中保存在 <store-path>/links 目录,具体以其依赖图的哈希值作为文件夹名进行组织。各项目仅通过符号链接(Windows 下使用 junction)指向该全局目录内对应版本,而不再保留本地依赖副本。这种思路借鉴自 NixOS,能让多个项目共享同一份“依赖实例”,无重复下载,实现跨项目复用,尤其在本地热缓存情况下极大提高安装速度。

启用全局虚拟存储后,pnpm 会在系统级 <store-path>/links 目录中集中存储所有依赖。每个目录以依赖图的哈希值命名,对应特定版本组合的完整依赖快照,然后通过硬链接方式保留实际包内容。

当在项目中执行安装时,pnpm 不再本地解压这些包,而是创建符号链接(Windows 下为 junction)指向全局存储中的对应目录,这样多个项目可以共用同一份依赖实例,从而避免重复下载与磁盘占用。

由于这种集中式存储加上链接策略,重复安装(尤其是在热缓存环境下)大概率能命中已有依赖,安装时间大幅缩短,接近“瞬装”级别体验,非常适合多个相关项目并行开发的本地环境。

使用方式

在工作空间根目录的 pnpm-workspace.yaml 文件中添加以下字段:

enableGlobalVirtualStore: true

这条配置会让所有子项目共享同一个全局虚拟存储,使得依赖安装既统一又高效。

除了在 Monorepo 项目中配置,我们还可以使用 pnpm 命令行设置全局配置:

pnpm config -g set enable-global-virtual-store true

这会修改用户目录下的 .npmrc 文件,影响到该用户在所有项目中的 pnpm 使用行为。

pnpm 使用 ci-info 库(通过 is-ci)自动识别是否正在 CI 环境中运行,例如检测到 CI=trueCONTINUOUS_INTEGRATIONBUILD_NUMBERRUN_ID 等变量。这时,即使全局虚拟存储功能已在本地或用户配置中启用,pnpm 在 CI 环境下也会:

  • 发出警告:提示该功能在 CI 中可能无效,甚至拖慢速度;

  • 自动关闭:不使用全局虚拟存储,改为传统的 node_modules/.pnpm 模式,确保构建过程稳定可靠。

本地开发时常出现频繁的安装和项目切换,开启全局虚拟存储后,可以让不同项目共享相同依赖实例,极大提高热缓存命中率,安装速度接近“瞬装”;而 CI 环境的缓存多为“冷缓存”,启用此功能有时反而会增加额外查找和链接开销,不如关闭更稳定。

因此,pnpm 的策略是:

  • 开发环境:优先开全局虚拟存储,提升效率;

  • CI 环境:自动识别并关闭该功能,保证安装路径清晰、行为可预测。

这种“按环境自动优化”的机制,让你不用手动区分配置,就能在不同环境下获得最佳体验。

2. 版本 Catalog 系统强化

Catalog 功能回顾

自 pnpm 9.5 开始引入,通过在 pnpm-workspace.yaml 中统一声明依赖版本,使用 catalog: 协议在各 package.json 中引用,确保整个 monorepo 内依赖版本统一,减少冲突。

新功能亮点

  1. 支持 pnpm update 直接更新 catalog: 协议依赖 执行 pnpm update 后,相关 catalog 指定会自动替换到 pnpm-workspace.yaml 中,无需手动改版号 ([socket.dev][1])。

  2. 引入 catalogMode 配置选项

    • manual(默认):不自动添加依赖到 catalog;

    • prefer:优先使用 catalog 中已有的版本;

    • strict:严格模式,只能使用 catalog 中声明的版本。

  3. CLI 新增保存命令参数

支持 --save-catalog--save-catalog-name=<name>,可以将新添加的依赖自动写入指定 catalog,并在 package.json 中使用 catalog: 协议声明版本 ([hackernoon.com][2])。

3. 其他重要更新

  • side-effects 缓存键更新:意味着旧缓存不再兼容;
  • 新增 ci 设置项:允许用户显式声明是否运行于 CI 环境;
  • pnpm patch 命令增强:版本排序严格按照语义版本规则;
  • 错误提示改进:版本不匹配时自动展示 diff 内容,帮助调试。

总结

pnpm 正持续走高,目前 npm 上月下载量接近 1 亿,尤其在 monorepo 环境中应用广泛。其独特优势包括严格的依赖隔离、节省磁盘空间、快速安装等。 此次上线的两项功能正是这些优势的进一步延伸和深化:

  • 全局虚拟存储:更高效利用缓存、跨项目共享模块;

  • 版本 Catalog 增强:更灵活、更可控的依赖版本管理,降低手动重复操作和冲突风险。

20250625115642

完整的 pnpm-workspace.yaml 如下所示:

packages:
  - "packages/*"
enableGlobalVirtualStore: true
catalog:
  react: ^18.2.0
  lodash: ^4.17.21
catalogMode: prefer

安装依赖时:

pnpm add axios --save-catalog
pnpm update

这将把 axios 自动添加到默认 catalog,在所有项目内统一使用该版本。

pnpm 10.12.1 的更新,既关注性能提升,也强化了依赖管理体验:

  1. 全局虚拟存储:让开发者受益于“几乎瞬装”的体验;

  2. Catalog 功能增强:工具更智能、更可控,特别适合 monorepo 操作;

  3. 其他细节改进:更稳定更易调试,整体生态持续成熟。