Skip to content

npm/yarn/pnpm对比完整指南:2026年开发者如何选择

2026年5月10日

npm、yarn、pnpm 分别是什么?它们之间有什么区别?在开发中怎么选择?这篇文章来展开说说。

分别是什么

npm (Node Package Manager)

项目说明
出身Node.js 官方自带,2009 年发布
收购2010 年被 npm Inc. 收购,2020 年被 GitHub 收购
地位Node.js 安装时默认捆绑,生态最成熟
特点开箱即用,无需额外安装

Yarn (Yet Another Resource Negotiator)

项目说明
出身Facebook(Meta)2016 年开源
定位npm 的替代方案,强调确定性、安全性和工作区支持
贡献引入 lockfile、并行下载、离线缓存等概念

pnpm (Performant npm)

项目说明
出身2017 年由 Zoltan Kochan 创建
核心理念内容寻址存储 + 硬链接
特点安装极快、磁盘占用极小、严格的依赖隔离

核心对比

对比项npmYarnpnpm
安装速度较慢(串行)快(并行+缓存)最快(仅创建链接)
磁盘占用较大极小
lockfilepackage-lock.jsonyarn.lockpnpm-lock.yaml
依赖提升✅ 有✅ 有❌ 无(严格隔离)
幽灵依赖⚠️ 有⚠️ 有✅ 无
Monorepoworkspaces(基础)workspaces(完善)workspaces(最佳)
Node_modules扁平结构扁平结构非扁平结构

依赖管理原理

┌─────────────────────────────────────────────────────────┐
│                    依赖结构对比                           │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  npm/Yarn(扁平结构)                                   │
│  ┌─────────────────────────────────┐                   │
│  │ node_modules/                   │                   │
│  │   ├─ vue/                       │                   │
│  │   ├─ vue-router/                │                   │
│  │   ├─ vuex/                      │                   │
│  │   └─ ...(所有依赖平铺)         │                   │
│  └─────────────────────────────────┘                   │
│  ⚠️ 问题:幽灵依赖(可以直接引用未声明的包)             │
│                                                         │
│  pnpm(严格隔离)                                       │
│  ┌─────────────────────────────────┐                   │
│  │ .pnpm/                          │                   │
│  │   ├─ node_modules/              │                   │
│  │   │   ├─ vue/                   │                   │
│  │   │   └─ vue-router/            │                   │
│  │   └─ ...(硬链接)              │                   │
│  │                                   │                   │
│  │ node_modules/                    │                   │
│  │   └─ .bin/                       │                   │
│  └─────────────────────────────────┘                   │
│  ✅ 优势:必须显式声明依赖,无幽灵依赖                   │
│                                                         │
└─────────────────────────────────────────────────────────┘

命令对照表

功能npmYarnpnpm
初始化项目npm inityarn initpnpm init
安装依赖npm installyarn installpnpm install
添加依赖npm add <pkg>yarn add <pkg>pnpm add <pkg>
删除依赖npm remove <pkg>yarn remove <pkg>pnpm remove <pkg>
全局安装npm i -g <pkg>yarn global add <pkg>pnpm add -g <pkg>
更新依赖npm updateyarn upgradepnpm update
清除缓存npm cache cleanyarn cache cleanpnpm store prune
列出依赖npm listyarn listpnpm list
运行脚本npm run <script>yarn <script>pnpm <script>
锁定版本npm shrinkwrapyarn --frozen-lockfilepnpm import

选择决策树

┌─────────────────────────────────────────────────────────┐
│                   包管理器选择决策树                      │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  你需要什么?                                           │
│      │                                                 │
│      ├─── 简单、通用、团队无共识 ──→ npm               │
│      │     (开箱即用,文档最多)                       │
│      │                                                 │
│      ├─── 已有 Yarn 习惯 ──→ Yarn                      │
│      │     (兼容性好,命令相似)                       │
│      │                                                 │
│      └─── Monorepo / 大项目 ──→ pnpm                  │
│            │                                           │
│            ├─── 严格依赖隔离? ──→ ✅ pnpm            │
│            │                                           │
│            └─── 磁盘空间紧张? ──→ ✅ pnpm            │
│                                                         │
└─────────────────────────────────────────────────────────┘

场景推荐

场景推荐理由
新手入门npm开箱即用,文档最全
老项目维护保持现有不要轻易换
新公司/新团队pnpm现代、快速、规范
Monorepopnpmworkspaces 支持最佳
大型前端项目pnpm磁盘占用小、依赖隔离
小项目/个人项目npm / pnpm都行,看习惯

pnpm 核心优势

1. 幽灵依赖问题

javascript
// package.json
{
  "dependencies": {
    "vue": "^3.0.0"
  }
}

npm/Yarn 问题

javascript
// 可以直接引用(幽灵依赖)
import lodash from 'lodash'  // ❌ 没有声明但能用

pnpm 解决方案

javascript
// 必须先声明
// pnpm add lodash
import lodash from 'lodash'  // ✅ 显式声明后才能用

2. 磁盘占用对比

项目磁盘占用说明
npm1.5GB每个项目独立复制
Yarn1.2GB有缓存但仍需复制
pnpm200MB硬链接,共享依赖

3. 安装速度对比

pnpm > Yarn > npm

pnpm:  2秒  ████████░░
Yarn:  5秒  ██████████████░░░░
npm:   8秒  ████████████████████████░░░░░░░

配置推荐

npm 配置

json
{
  "save-exact": true,
  "registry": "https://registry.npmjs.org/"
}

pnpm 配置(推荐)

yaml
# .npmrc
shamefully-hoist=true
strict-peer-dependencies=false
auto-install-peers=true

Monorepo 配置

yaml
# pnpm-workspace.yaml
packages:
  - 'packages/*'
  - 'apps/*'

常见问题

Q:可以混用吗?

A: 不建议,同一个项目混用会混乱。

Q:-lock 文件可以互转吗?

A: 可以用 pnpm import 从 yarn.lock 转 pnpm-lock.yaml。

Q:pnpm 会破坏现有项目吗?

A: 一般不会,但建议先用 shamefully-hoist=true 兼容。

Q:npm 未来会追上 pnpm 吗?

A: npm 正在改进,但 pnpm 的设计理念仍然领先。

一句话总结

场景推荐
新手npm(简单)
Monorepopnpm(规范)
大项目pnpm(快速)
老项目保持现有

趋势:2026 年 pnpm 正在成为新项目的首选。

不要孤军奋战啦!

加入微信群一起学习交流 AI

与大神一起使用 OpenClaw、Hermes、Claude Code、Seedance 2.0、GPT-Image-2 等

微信公众号

扫码关注微信公众号
私信 "加群",将自动获取微信群二维码

探索 AI 世界,掌握智能未来