除了 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 "*"
包管理器对比
功能对比
| 特性 | npm | Yarn | pnpm | Bun |
|---|---|---|---|---|
| 安装速度 | 中 | 快 | 很快 | 极快 |
| 磁盘空间 | 高 | 高 | 低 | 中 |
| 依赖隔离 | 低 | 中 | 高 | 中 |
| 工作区支持 | npm 7+ | Yarn 1+ | 支持 | 支持 |
| Plug'n'Play | 否 | Yarn 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:快速成长,可能成为主流选择
选择包管理器应该基于项目需求、团队偏好和长期维护考虑。