Skip to content

pnpm

1. 什么是 pnpm?

pnpm 是一种 Node.js 的包管理器(类似于 npmyarn)。 名字里的 p 代表 Performant(高性能),也有人说是 “poor man's npm” 😂。

它的核心特点是:

  • 使用 硬链接 + 符号链接 的方式来存储依赖。
  • 避免不同项目重复下载相同的依赖,大大节省磁盘空间。
  • 更快的安装速度。

2. pnpm 有什么用?

🚀 性能和空间优势

  • npm/yarn:每个项目都要复制一份完整的依赖到 node_modules
  • pnpm:把所有依赖放在一个全局的 内容可寻址存储(content-addressable store),项目里只是通过符号链接指向。

结果就是:

  • 相同的依赖只会存一份。
  • 安装速度更快,磁盘占用更小。

📦 严格的依赖隔离

  • npmyarn 中,node_modules 会形成一个“扁平化”结构,有时可能让项目误依赖到不是自己声明的包(幽灵依赖问题)。
  • pnpm 使用符号链接保持严格的依赖树,避免隐式依赖。 👉 如果你的 package.json 里没声明,就无法直接引用。

🛠 Monorepo 支持更好

  • pnpm 原生支持 monorepo 管理(工作空间 pnpm-workspace.yaml)。
  • 比如在一个仓库里有多个子包,pnpm 可以高效地安装和链接它们,代替 Lerna、Yarn workspaces 等工具。

🌍 与 npm 生态完全兼容

  • pnpm 底层还是调用 npm registry,所以和 npm 包生态 100%兼容
  • 使用方式也和 npm 很接近,学习成本低。

3. 如何使用 pnpm?

安装 pnpm

bash
npm install -g pnpm

常用命令对照

操作npmpnpm
安装依赖npm installpnpm install
安装某个包npm install xxpnpm add xx
移除某个包npm uninstall xxpnpm remove xx
更新依赖npm updatepnpm update
初始化项目npm initpnpm init

Monorepo 示例

创建 pnpm-workspace.yaml

yaml
packages:
  - 'packages/*'
  - 'apps/*'

这样 pnpm 会自动管理多个子项目的依赖和链接。

总结

  • pnpm 是一种更快、更省空间、更严格的包管理器
  • 核心优势:
    1. 磁盘节省(共享依赖存储)。
    2. 安装速度快
    3. 严格依赖管理,避免幽灵依赖。
    4. 原生支持 monorepo

npm vs Yarn vs pnpm 对比表

特性 / 工具npmYarnpnpm
生态兼容性✅ 官方,100% 兼容 npm registry✅ 兼容 npm registry✅ 兼容 npm registry
安装速度⏳ 较慢(尤其是全量安装时)🚀 比 npm 快,缓存优化⚡ 非常快(硬链接 + 全局存储机制)
磁盘空间占用📦 高,每个项目一份完整依赖📦 中等,有缓存但依赖重复存储🪶 很低,共享依赖存储,节省大量空间
依赖结构扁平化,可能产生“幽灵依赖”扁平化,依旧可能有幽灵依赖严格隔离,避免幽灵依赖
Monorepo 支持🚫 无原生支持,需要 Lerna 等工具⚠️ Yarn Workspaces 支持✅ 原生支持 Workspaces,管理更高效
命令兼容性标准 npm 命令大部分与 npm 相似基本兼容,部分命令略有不同(如 add
锁文件package-lock.jsonyarn.lockpnpm-lock.yaml
稳定性✅ 官方维护,稳定性高✅ 较成熟,社区维护✅ 越来越流行,性能最佳
学习成本⭐⭐ 最低⭐⭐ 略有差异(命令相似)⭐⭐⭐ 略高,但上手简单
适用场景小型项目,或默认环境中大型项目,需要更快安装中大型/Monorepo 项目,重视性能和空间

对比总结

  • npm:默认选择,生态最广,适合一般小型项目。
  • Yarn:性能较优,适合需要加快依赖安装的团队。
  • pnpm:性能最好、磁盘最省、依赖最严格,特别适合 大型项目monorepo 场景。