乐闻世界logo
搜索文章和话题

pnpm 的性能优势体现在哪些方面?与 npm/Yarn 对比如何?

3月6日 21:34

pnpm 的性能优势主要体现在安装速度、磁盘空间和内存使用三个方面。

安装速度对比:

bash
# 测试场景:安装有 1000+ 依赖的项目 # 首次安装(冷启动) npm install: 45s yarn install: 38s pnpm install: 25s # 二次安装(已有缓存) npm install: 15s yarn install: 8s pnpm install: 2s # 硬链接,几乎瞬间完成 # 删除 node_modules 后重装 npm install: 40s yarn install: 35s pnpm install: 3s # 从 store 创建硬链接

磁盘空间节省:

bash
# 10个相同技术栈的项目 # npm 方式 每个项目 node_modules: ~500MB 总占用: 500MB × 10 = 5GB # pnpm 方式 全局 store: ~500MB 每个项目硬链接: ~几KB(元数据) 总占用: ~500MB # 节省空间: 90%

性能优势原理:

  1. 硬链接机制
javascript
// npm/yarn 方式 // 每个项目复制完整的文件 project-a/node_modules/lodash.js // 1.4MB project-b/node_modules/lodash.js // 1.4MB project-c/node_modules/lodash.js // 1.4MB // 总计: 4.2MB // pnpm 方式 // 所有项目共享同一物理文件 ~/.pnpm-store/lodash.js // 1.4MB project-a/node_modules/lodash.js // 硬链接 project-b/node_modules/lodash.js // 硬链接 project-c/node_modules/lodash.js // 硬链接 // 总计: 1.4MB
  1. 内容寻址存储
javascript
// 相同内容的文件只存储一份 // 即使是不同包中的相同文件 const hash = getContentHash(fileContent); // 存储路径: ~/.pnpm-store/files/${hash}
  1. 并行下载
bash
# pnpm 默认并行下载依赖 # npm 默认串行下载 # .npmrc 配置 network-concurrency=16 # 并发下载数

内存使用优势:

bash
# pnpm 的 node_modules 结构更紧凑 # 文件系统缓存更有效 # 内存占用对比(大型项目) npm: ~800MB yarn: ~750MB pnpm: ~400MB

性能基准测试:

javascript
// 使用 benchmark 测试 const { execSync } = require('child_process'); // 测试安装时间 console.time('npm'); execSync('npm install'); console.timeEnd('npm'); // ~45s console.time('pnpm'); execSync('pnpm install'); console.timeEnd('pnpm'); // ~25s

实际项目案例:

bash
# Vue 3 项目(约 1500 个依赖) npm install: 52s, 1.2GB 磁盘 yarn install: 45s, 1.1GB 磁盘 pnpm install: 28s, 450MB 磁盘 # React 项目(约 800 个依赖) npm install: 35s, 800MB 磁盘 yarn install: 30s, 750MB 磁盘 pnpm install: 18s, 280MB 磁盘

性能优化配置:

toml
# .npmrc # 增加并发数 network-concurrency=16 # 使用本地缓存 prefer-frozen-lockfile=true # 禁用进度条(略微提升性能) reporter=silent

性能对比总结:

指标npmYarnpnpm
首次安装中等
二次安装中等最快
磁盘占用
内存占用中等
并行下载
硬链接

适用场景:

  • ✅ 多项目开发环境
  • ✅ CI/CD 流水线
  • ✅ Monorepo 项目
  • ✅ 磁盘空间受限环境
标签:PNPM