近日(2025 年 6 月 11 日),pnpm 发布了 10.12.1 版本,引入两项重大更新:全局虚拟存储(Global Virtual Store,实验性) 和 版本 Catalog 系统的增强。这些更新大幅提升了安装速度和 monorepo 中的依赖管理效率,尤其对大型项目而言意义突出。
下面我将从原理、配置与使用,适用场景等方面展开详解。
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=true
、CONTINUOUS_INTEGRATION
、BUILD_NUMBER
、RUN_ID
等变量。这时,即使全局虚拟存储功能已在本地或用户配置中启用,pnpm 在 CI 环境下也会:
-
发出警告:提示该功能在 CI 中可能无效,甚至拖慢速度;
-
自动关闭:不使用全局虚拟存储,改为传统的
node_modules/.pnpm
模式,确保构建过程稳定可靠。
本地开发时常出现频繁的安装和项目切换,开启全局虚拟存储后,可以让不同项目共享相同依赖实例,极大提高热缓存命中率,安装速度接近“瞬装”;而 CI 环境的缓存多为“冷缓存”,启用此功能有时反而会增加额外查找和链接开销,不如关闭更稳定。
因此,pnpm 的策略是:
-
开发环境:优先开全局虚拟存储,提升效率;
-
CI 环境:自动识别并关闭该功能,保证安装路径清晰、行为可预测。
这种“按环境自动优化”的机制,让你不用手动区分配置,就能在不同环境下获得最佳体验。
2. 版本 Catalog 系统强化
Catalog 功能回顾
自 pnpm 9.5 开始引入,通过在 pnpm-workspace.yaml
中统一声明依赖版本,使用 catalog:
协议在各 package.json 中引用,确保整个 monorepo 内依赖版本统一,减少冲突。
新功能亮点
-
支持
pnpm update
直接更新catalog:
协议依赖 执行pnpm update
后,相关 catalog 指定会自动替换到pnpm-workspace.yaml
中,无需手动改版号 ([socket.dev][1])。 -
引入
catalogMode
配置选项-
manual
(默认):不自动添加依赖到 catalog; -
prefer
:优先使用 catalog 中已有的版本; -
strict
:严格模式,只能使用 catalog 中声明的版本。
-
-
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 增强:更灵活、更可控的依赖版本管理,降低手动重复操作和冲突风险。
完整的 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 的更新,既关注性能提升,也强化了依赖管理体验:
-
全局虚拟存储:让开发者受益于“几乎瞬装”的体验;
-
Catalog 功能增强:工具更智能、更可控,特别适合 monorepo 操作;
-
其他细节改进:更稳定更易调试,整体生态持续成熟。