npm、pnpm、yarn 是什么?该用哪个?怎么用?如何迁移?

下面我会用通俗易懂、零基础也能理解的方式,向初学者讲清楚:

npm、pnpm、yarn 是什么?它们有什么区别?我该用哪个?怎么用? 如何迁移?


🧱 一、它们是什么?------"包管理器"

想象你正在做一道菜(比如"番茄炒蛋"),需要买食材:

  • 鸡蛋 🥚
  • 番茄 🍅
  • 盐 🧂
  • 油 🫒

但你不想自己一个个去买,于是你叫了一个"外卖小哥",告诉他:"我要做番茄炒蛋,请帮我把所有食材送来。"


📦 在编程中:

  • 这道"菜" = 你的项目(比如一个 Vue 网站)
  • "食材" = 第三方代码(比如 vueaxioslodash
  • "外卖小哥" = 包管理器(npm / pnpm / yarn)

它们的作用就是:

✅ 帮你自动下载项目需要的代码库(叫"包"或"依赖")

✅ 管理这些包的版本

✅ 安装、更新、删除它们


🔍 二、三者对比(小白版)

工具 全名 出身 特点 类比
npm Node Package Manager Node.js 官方自带 最基础,像"默认外卖平台" 美团(人人都用,但慢一点)
yarn Yet Another Resource Negotiator Facebook 推出 更快、更稳定,有锁文件 饿了么(优化过的外卖)
pnpm Permanent npm 独立团队开发 最省空间、最快,用硬链接 京东物流(智能仓储,不重复进货)

🧩 三、核心区别(深入一点)

1. 安装速度

  • npm:较慢(尤其网络差时)
  • yarn:较快(早期优势)
  • pnpm:最快(只下载一次,其他项目直接"链接"使用)

2. 磁盘空间占用

  • npm / yarn:每个项目都复制一份 node_modules → 占用大
  • pnpm:所有项目共用一份包 → 节省 90% 空间 ✅

💡 举例:你有 5 个项目都用 vuenpm 会下载 5 份;pnpm 只存 1 份,其他项目"快捷方式"指向它。

3. 依赖安装方式

  • npm / yarn:复制文件
  • pnpm:使用 硬链接(hard link)符号链接(symlink),不复制,只"引用"

4. 锁文件(保证一致性)

  • npmpackage-lock.json
  • yarnyarn.lock
  • pnpmpnpm-lock.yaml

🔐 锁文件的作用:确保你和同事、服务器安装的依赖完全一样,避免"在我电脑上能跑"的问题。

5. 命令对比

操作 npm yarn pnpm
安装所有依赖 npm install yarn / yarn install pnpm install
安装一个包 npm install vue yarn add vue pnpm add vue
删除一个包 npm uninstall vue yarn remove vue pnpm remove vue
全局安装 npm install -g vite yarn global add vite pnpm add -g vite
运行脚本 npm run dev yarn dev pnpm dev

✅ 三者命令非常相似,学会一个,其他很容易上手!


🎯 四、初学者该怎么选?

你的需求 推荐工具 理由
刚学 Node.js,只想试试 npm 自带,不用额外安装,适合入门
想更快、更稳定 yarn Facebook 背书,生态好,适合团队
想省空间、追求效率 ✅✅✅ pnpm 最现代,适合长期开发,推荐新人直接用!

🚀 五、推荐选择:直接上手 pnpm(2024 年最佳选择)

虽然 npm 是默认的,但 pnpm 是目前最先进、最高效的包管理器,特别适合:

  • 本地开发多个项目
  • SSD 空间有限(Windows 用户尤其受益)
  • 追求速度和稳定性

🛠️ 六、如何使用 pnpm?(手把手)

1. 安装 pnpm(只需一次)

bash 复制代码
# 使用 npm 安装 pnpm(只装一次)
npm install -g pnpm

⚠️ 注意:-g 表示"全局安装",以后所有项目都能用 pnpm 命令

2. 创建项目并安装依赖

bash 复制代码
# 创建项目文件夹
mkdir my-vue-app
cd my-vue-app

# 初始化项目(生成 package.json)
pnpm init

# 安装 Vue
pnpm add vue

# 安装 Vite(开发服务器)
pnpm add -D vite

# 创建 index.html 和 main.js(略)

3. 启动项目(假设你有 vite.config.js)

bash 复制代码
# 运行开发服务器
pnpm add -D @vitejs/plugin-vue
# 在 package.json 中添加脚本:
# "scripts": {
#   "dev": "vite"
# }

pnpm run dev

📌 七、常见问题解答

❓ 为什么我看到别人用 npm,你要推荐 pnpm?

因为 pnpmnpm 的"升级版",就像智能手机替代功能机。它解决了 npm 的痛点(慢、占空间),但完全兼容 npm 的生态

❓ 用了 pnpm,别人还能运行我的项目吗?

✅ 可以!只要他们在项目根目录运行 pnpm install 就行。你提交代码时包含 pnpm-lock.yaml,别人就能装一模一样的依赖。

❓ 我能混用 npm 和 pnpm 吗?

❌ 不建议!一个项目只用一种包管理器,否则锁文件会冲突,导致依赖混乱。


✅ 八、总结:一句话记住

  • npm:官方默认,适合入门
  • yarn:更快更稳,曾是主流
  • pnpm :最省空间、最快,2024 年推荐首选!

🎁 附加建议:初学者路线图

  1. ✅ 先用 npm 跑通第一个项目(理解概念)
  2. ✅ 然后切换到 pnpm,体验高效开发
  3. ✅ 学会看 package.json 和锁文件
  4. ✅ 掌握 addremoverun 三个核心命令

下面我会用 清晰、安全、零错误 的方式,手把手教你如何将一个现有的 npm 项目迁移到 pnpm


🧭 迁移目标

将一个使用 npm 的项目(有 package.jsonpackage-lock.json)迁移到 pnpm,最终:

  • 删除旧的 node_modules 和锁文件
  • 使用 pnpm 重新安装依赖
  • 生成 pnpm-lock.yaml
  • 项目正常运行

✅ 第一步:安装 pnpm(全局)

如果你还没安装 pnpm,先全局安装一次(只需做一次):

bash 复制代码
npm install -g pnpm

✅ 验证是否安装成功:

bash 复制代码
pnpm --version

✅ 第二步:进入你的项目目录

bash 复制代码
cd your-existing-project

确保当前目录有:

  • package.json
  • package-lock.json
  • (可选)node_modules/

✅ 第三步:删除旧的依赖和锁文件

bash 复制代码
# 删除 node_modules
rimraf node_modules
# 或者手动删除(Windows 资源管理器也行)

# 删除 npm 的锁文件
del package-lock.json
# 或者手动删除

💡 提示:推荐安装 rimraf(跨平台删除工具):

bash 复制代码
npm install -g rimraf

✅ 第四步:生成 .npmrc(可选但推荐)

告诉项目"以后都用 pnpm",避免别人误用 npm。

创建文件 .npmrc(注意开头有个点):

ini 复制代码
# .npmrc
engine-strict=true
public-hoist-pattern[]=*
# 可选:指定 pnpm 为包管理器(现代做法)
package-manager=pnpm@9.0.0  # 版本号可改

🔍 作用:

  • engine-strict=true:确保 Node.js 版本匹配
  • package-manager:提示使用 pnpm(VS Code 等工具会识别)

✅ 第五步:使用 pnpm 安装依赖

bash 复制代码
pnpm install

pnpm 会:

  1. 读取 package.json
  2. 安装所有依赖(开发 + 生产)
  3. 生成 pnpm-lock.yaml
  4. 创建新的 node_modules(使用硬链接,非常节省空间)

✅ 成功后你会看到:

sql 复制代码
Packages: +200
Packages are hard linked from the content-addressable store

✅ 第六步:验证项目是否正常

bash 复制代码
# 如果是 Vue 项目
pnpm run dev

# 如果是 React 项目
pnpm run start

# 如果是构建项目
pnpm run build

✅ 如果能正常启动/构建,说明迁移成功!


✅ 第七步:更新 package.json 中的脚本(可选)

虽然不是必须,但建议统一使用 pnpm 命令风格:

json 复制代码
{
  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "preview": "vite preview"
  }
}

运行方式不变:

bash 复制代码
pnpm dev
pnpm build

💡 pnpm 支持直接运行脚本名,无需 run


✅ 第八步:提交到 Git(重要)

将以下文件加入版本控制:

  • package.json
  • pnpm-lock.yaml关键!保证别人也用 pnpm 安装
  • .npmrc(可选)
  • node_modules/ ← 一定不要提交!
bash 复制代码
git add .
git commit -m "chore: migrate from npm to pnpm"

✅ 第九步:通知团队(如果是多人项目)

README.md 或团队文档中添加说明:

markdown 复制代码
## 📦 项目使用 pnpm

请使用 pnpm 安装依赖:

```bash
pnpm install
pnpm run dev

不要使用 npm install,否则会导致锁文件冲突。


⚠️ 常见问题 & 解决方案

| 问题 | 原因 | 解决方法 |
|-----------------------|---------------------------------------------|------------------------------------------------------------|----------------------------------------------------|
| ENOSPC(Linux/macOS) | 文件监听数超限 | `echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p` |
| 安装失败 / 网络慢 | 源问题 | 使用国内镜像: pnpm set registry https://registry.npmmirror.com |
| 与 npm 混用导致冲突 | 同时存在 package-lock.jsonpnpm-lock.yaml | 删除 package-lock.json,坚持只用 pnpm |
| 某些包不兼容 | 极少数包依赖 node_modules 扁平结构 | 使用 public-hoist-pattern 或反馈给作者 |


🎯 迁移成功后的优势

优势 说明
💾 节省磁盘空间 多个项目共享依赖,不再重复安装
⚡ 安装更快 尤其第二次安装,几乎是秒级
🔐 锁文件更精确 pnpm-lock.yaml 记录更细粒度依赖
🧩 支持 Monorepo 方便管理多个子项目

🧩 高级技巧(可选)

1. 使用 .pnpmfile.cjs 自定义行为(高级)

js 复制代码
// .pnpmfile.cjs
function readPackage(pkg) {
  // 强制某些包使用特定版本
  if (pkg.name === 'debug') {
    pkg.version = '4.3.4'
  }
  return pkg
}

module.exports = { readPackage }

2. 设置国内镜像(加速)

bash 复制代码
pnpm set registry https://registry.npmmirror.com

查看当前配置:

bash 复制代码
pnpm get registry

✅ 总结:迁移步骤一览

bash 复制代码
# 1. 安装 pnpm(一次)
npm install -g pnpm

# 2. 进入项目
cd your-project

# 3. 清理旧文件
rimraf node_modules
del package-lock.json

# 4. 创建 .npmrc(推荐)
echo "package-manager=pnpm@9.0.0" > .npmrc

# 5. 安装依赖
pnpm install

# 6. 测试运行
pnpm run dev

# 7. 提交 pnpm-lock.yaml
git add .
git commit -m "migrate to pnpm"

🎉 恭喜!你已经成功将项目从 npm 迁移到 pnpm,现在可以享受更快、更省空间的开发体验了!

相关推荐
崔庆才丨静觅14 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby606115 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了15 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅15 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅15 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅16 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment16 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅16 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊16 小时前
jwt介绍
前端
爱敲代码的小鱼16 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax