npm vs pnpm 对比
1.核心差异
| 特性 | npm | pnpm |
|---|---|---|
| 存储方式 | 每个项目独立存储依赖(重复占用空间) | 全局存储 + 硬链接(节省磁盘空间) |
| 安装速度 | 较慢(重复下载和复制) | 更快(利用缓存和链接) |
| 磁盘占用 | 高(依赖重复) | 低(依赖共享) |
| node_modules 结构 | 扁平化(幽灵依赖问题) | 非扁平化(严格的依赖隔离) |
| Monorepo 支持 | 需要 workspaces(较新版本) | 原生支持,性能更好 |
2.详细对比
2.1. 磁盘空间和安装速度
- npm: 每个项目都有完整的
node_modules副本,100个项目就会占用100份空间 - pnpm: 所有包存储在全局 store,项目通过硬链接引用,100个项目只占用1份空间
- 安装速度比 npm 快 2-3 倍
2.2. 依赖管理
npm (v3+):使用扁平化结构,所有依赖提升到顶层
1
2
3
4node_modules/
├── package-a/
├── package-b/
└── package-c/ # 幽灵依赖:即使未在 package.json 声明也能访问pnpm: 使用符号链接创建严格的依赖树
1
2
3
4
5node_modules/
├── .pnpm/ # 实际存储位置
├── package-a/ # 符号链接到 .pnpm
└── package-b/ # 符号链接到 .pnpm
# 只能访问 package.json 中声明的依赖
2.3. Monorepo 支持
- npm: 需要配置 workspaces,性能一般
- pnpm:
- 原生 workspaces 支持
- 更快的安装和链接速度
- 更好的依赖提升控制
2.4. 兼容性
- npm: 最广泛使用,几乎所有工具都兼容
- pnpm:
- 大多数情况下兼容
- 少数工具可能因为严格的依赖隔离出现问题
- 可通过
.npmrc配置node-linker=hoisted兼容
3.性能对比
1 | # 安装 100 个包的项目 |
4.快速开始 pnpm
1 | # 安装 |
结论:新项目推荐 pnpm,尤其 monorepo 和大型项目;已有 npm 项目可继续使用,按需迁移。