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,现在可以享受更快、更省空间的开发体验了!

相关推荐
烛阴29 分钟前
带你用TS彻底搞懂ECS架构模式
前端·javascript·typescript
卓码软件测评1 小时前
【第三方网站运行环境测试:服务器配置(如Nginx/Apache)的WEB安全测试重点】
运维·服务器·前端·网络协议·nginx·web安全·apache
龙在天1 小时前
前端不求人系列 之 一条命令自动部署项目
前端
开开心心就好1 小时前
PDF转长图工具,一键多页转图片
java·服务器·前端·数据库·人工智能·pdf·推荐算法
国家不保护废物1 小时前
10万条数据插入页面:从性能优化到虚拟列表的终极方案
前端·面试·性能优化
文心快码BaiduComate2 小时前
七夕,画个动态星空送给Ta
前端·后端·程序员
web前端1232 小时前
# 多行文本溢出实现方法
前端·javascript
文心快码BaiduComate2 小时前
早期人类奴役AI实录:用Comate Zulu 10min做一款Chrome插件
前端·后端·程序员
人间观察员2 小时前
如何在 Vue 项目的 template 中使用 JSX
前端·javascript·vue.js
布列瑟农的星空2 小时前
大话设计模式——多应用实例下的IOC隔离
前端·后端·架构