核心差异一句话:
npm 是每个项目各拷贝一份依赖;pnpm 通过“全局内容寻址 + 硬链接”让所有项目共享同一份依赖实体,磁盘占用和安装时间大幅缩减,并天然避免“幽灵依赖”。
- 磁盘占用
-
npm:每个 node_modules 都放完整包体,多项目就多次复制,空间翻倍。
-
pnpm:包实体只存一份在全局仓库,各项目用硬链接/符号链接指向它,空间节省 50 %–80 %
。
- 安装速度
-
npm:串行 + 重复下载,大项目首次安装慢。
-
pnpm:并行 + 全局缓存命中即秒链,首次比 npm 快 2× 左右,缓存命中后再次安装几乎瞬间完成
。
- 依赖结构
-
npm:扁平化后仍可能出现“幽灵依赖”(代码 require 了未在 package.json 声明的包)。
-
pnpm:严格的“依赖隔离”树,只有声明过的包才能在 require 解析路径中出现,潜在问题提前暴露
。
- 锁文件
-
npm:package-lock.json
-
pnpm:pnpm-lock.yaml,格式更紧凑且跨平台一致性更强。
- 兼容性/生态
-
npm:Node.js 内置,工具链默认支持,无踩坑风险。
-
pnpm:兼容 95 % 场景,但部分老旧包或特殊 postinstall 脚本遇到硬链接会报错,需要配置
node-linker=hoisted回退。
- 适用场景速览
一句话总结:
想“装得快、用得省、结构干净”就选 pnpm;要“零配置、最大兼容”就继续 npm。