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
    4
    node_modules/
    ├── package-a/
    ├── package-b/
    └── package-c/ # 幽灵依赖:即使未在 package.json 声明也能访问
  • pnpm: 使用符号链接创建严格的依赖树

    1
    2
    3
    4
    5
    node_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
2
3
# 安装 100 个包的项目
npm install # 耗时 ~30s,占用 ~500MB
pnpm install # 耗时 ~12s,占用 ~150MB(首次) + 共享

4.快速开始 pnpm

1
2
3
4
5
6
7
8
9
10
11
12
13
# 安装
npm install -g pnpm

# 常用命令(基本兼容 npm)
pnpm install # npm install
pnpm add express # npm install express
pnpm run dev # npm run dev

# Monorepo 工作区
# pnpm-workspace.yaml
packages:
- 'packages/*'
- 'apps/*'

结论:新项目推荐 pnpm,尤其 monorepo 和大型项目;已有 npm 项目可继续使用,按需迁移。