乐闻世界logo
搜索文章和话题

npm、pnpm 和 Bun 有什么不同?我们应该选用哪个包管理工具?

2月17日 22:42

除了 npm 和 Yarn,还有其他流行的 JavaScript 包管理器,如 pnpm 和 Bun。了解它们的特点和选择标准对于项目决策很重要。

pnpm

基本介绍

pnpm 是一个快速、节省磁盘空间的包管理器,使用硬链接和符号链接来管理依赖。

核心特性

1. 节省磁盘空间

pnpm 使用内容寻址存储,所有包都存储在全局存储中,通过硬链接引用:

shell
~/.pnpm-store/ ├── v3/ │ └── files/ │ └── 00/ │ └── 00a1b2c3d4.../ # 包的实际文件 project/ └── node_modules/ └── .pnpm/ └── package@1.0.0/ └── node_modules/ └── package/ # 硬链接到全局存储

2. 严格的依赖隔离

pnpm 确保包只能访问其声明的依赖:

javascript
// package-a 只能访问其声明的依赖 // 不能访问 package-b 的依赖

3. 快速安装

pnpm 的安装速度比 npm 和 Yarn 更快:

包管理器安装时间(1000+ 依赖)
npm 6~120s
npm 7+~60s
Yarn 1~45s
Yarn 2+~40s
pnpm~30s

pnpm 命令

bash
# 安装 pnpm npm install -g pnpm # 安装依赖 pnpm install # 添加依赖 pnpm add <package> # 添加开发依赖 pnpm add -D <package> # 移除依赖 pnpm remove <package> # 更新依赖 pnpm update # 运行脚本 pnpm run <script> # 全局安装 pnpm add -g <package>

pnpm 工作区

json
{ "name": "my-monorepo", "version": "1.0.0", "private": true, "scripts": { "build": "pnpm -r build", "test": "pnpm -r test" } }
bash
# 在所有工作区中运行命令 pnpm -r build pnpm --recursive build # 在特定工作区中运行命令 pnpm --filter package-a build

pnpm 配置

bash
# 设置存储位置 pnpm config set store-dir ~/.pnpm-store # 设置注册表 pnpm config set registry https://registry.npmmirror.com # 查看配置 pnpm config list

Bun

基本介绍

Bun 是一个现代化的 JavaScript 运行时和包管理器,内置了包管理器、测试运行器和打包工具。

核心特性

1. 极快的安装速度

Bun 的安装速度比其他包管理器快得多:

包管理器安装时间(1000+ 依赖)
npm 7+~60s
Yarn 2+~40s
pnpm~30s
Bun~10s

2. 内置工具链

Bun 内置了多个工具:

  • 包管理器
  • 测试运行器
  • 打包工具
  • 服务器

3. 兼容 Node.js

Bun 兼容大多数 Node.js API 和 npm 包。

Bun 命令

bash
# 安装 Bun curl -fsSL https://bun.sh/install | bash # 安装依赖 bun install # 添加依赖 bun add <package> # 添加开发依赖 bun add -d <package> # 移除依赖 bun remove <package> # 更新依赖 bun update # 运行脚本 bun run <script> # 运行文件 bun run index.js

Bun 工作区

json
{ "name": "my-monorepo", "version": "1.0.0", "private": true, "workspaces": [ "packages/*" ] }
bash
# 在所有工作区中运行命令 bun run build --filter "*"

包管理器对比

功能对比

特性npmYarnpnpmBun
安装速度很快极快
磁盘空间
依赖隔离
工作区支持npm 7+Yarn 1+支持支持
Plug'n'PlayYarn 2+
硬链接
内置工具
生态系统最大

使用场景对比

npm

适用场景

  • 新项目,不需要特殊功能
  • 团队已经熟悉 npm
  • 需要最大的生态系统支持
  • CI/CD 环境(默认支持)

优势

  • 随 Node.js 一起安装
  • 最大的生态系统
  • 良好的文档和社区支持
  • npm 7+ 性能已足够好

劣势

  • 磁盘空间占用大
  • 依赖隔离较弱

Yarn

适用场景

  • 大型 monorepo
  • 需要离线支持
  • 需要更好的用户体验
  • 需要 Plug'n'Play 功能

优势

  • 更好的工作区支持
  • 成熟的离线模式
  • 更好的用户体验
  • 丰富的插件生态

劣势

  • 需要单独安装
  • Yarn 2+ 学习曲线较陡

pnpm

适用场景

  • 磁盘空间受限
  • 需要严格的依赖隔离
  • 需要快速安装
  • 大型 monorepo

优势

  • 极低的磁盘空间占用
  • 严格的依赖隔离
  • 极快的安装速度
  • 良好的工作区支持

劣势

  • 生态系统相对较小
  • 硬链接可能在某些系统上有问题

Bun

适用场景

  • 需要极快的安装速度
  • 新项目,可以尝试新技术
  • 需要内置工具链
  • 性能敏感的项目

优势

  • 极快的安装速度
  • 内置工具链
  • 兼容 Node.js
  • 现代化的设计

劣势

  • 生态系统较小
  • 相对较新,稳定性待验证
  • 社区支持有限

迁移指南

从 npm 迁移到 pnpm

bash
# 1. 安装 pnpm npm install -g pnpm # 2. 删除 node_modules 和 lock 文件 rm -rf node_modules package-lock.json # 3. 安装依赖 pnpm install # 4. 更新脚本(如果需要) # npm run -> pnpm run # npm install -> pnpm install

从 Yarn 迁移到 pnpm

bash
# 1. 安装 pnpm npm install -g pnpm # 2. 删除 node_modules 和 lock 文件 rm -rf node_modules yarn.lock # 3. 安装依赖 pnpm install # 4. 更新脚本 # yarn -> pnpm

从 npm 迁移到 Bun

bash
# 1. 安装 Bun curl -fsSL https://bun.sh/install | bash # 2. 删除 node_modules 和 lock 文件 rm -rf node_modules package-lock.json # 3. 安装依赖 bun install # 4. 更新脚本 # npm run -> bun run

最佳实践

1. 选择合适的包管理器

考虑因素

  • 项目规模和复杂度
  • 团队熟悉度
  • 性能要求
  • 磁盘空间限制
  • CI/CD 环境支持

2. 锁定包管理器

在项目中明确使用的包管理器:

json
{ "scripts": { "preinstall": "npx only-allow pnpm" } }

3. 使用 CI/CD 缓存

yaml
# GitHub Actions - pnpm - uses: pnpm/action-setup@v2 with: version: 8 - uses: actions/setup-node@v3 with: cache: 'pnpm' - run: pnpm install

4. 文档化选择

在 README 中说明使用的包管理器:

markdown
## Installation This project uses pnpm as the package manager. ```bash # Install pnpm npm install -g pnpm # Install dependencies pnpm install
shell
## 性能基准测试 ### 安装速度测试 ```bash # 测试 npm time npm install # 测试 Yarn time yarn install # 测试 pnpm time pnpm install # 测试 Bun time bun install

磁盘空间测试

bash
# 查看 node_modules 大小 du -sh node_modules # npm: ~1GB # Yarn: ~1GB # pnpm: ~300MB # Bun: ~800MB

未来趋势

  • npm:持续改进性能和安全性
  • Yarn:推动 Plug'n'Play 和零安装
  • pnpm:改进硬链接和依赖隔离
  • Bun:快速成长,可能成为主流选择

选择包管理器应该基于项目需求、团队偏好和长期维护考虑。

标签:NPM