1. 为什么选择 pnpm 而不是 npm/yarn?
如果你已经习惯了 npm 或 yarn,可能会好奇为什么要切换到 pnpm。我在管理多个前端项目时发现,当 node_modules 文件夹开始吞噬硬盘空间时,事情就变得棘手了。pnpm 的核心优势在于它采用了内容可寻址存储(content-addressable storage),这意味着:
- 所有依赖包只会被存储一次,即使多个项目使用相同版本
- 通过硬链接(hard links)方式引用依赖,节省 60-70% 的磁盘空间
- 创建非扁平的 node_modules 结构,避免幽灵依赖(phantom dependencies)问题
实测一个中型项目(约 50 个依赖)的安装对比:
| 包管理器 | 安装时间 | 占用空间 |
|---|---|---|
| npm | 25s | 210MB |
| yarn | 18s | 195MB |
| pnpm | 12s | 80MB |
提示:如果你经常需要同时维护多个 React/Vue 项目,pnpm 的空间节省效果会非常明显。我的开发机上 10 个项目共用 pnpm store 后,node_modules 总大小从 4.2GB 降到了 1.8GB。
2. Ubuntu 环境准备
2.1 系统版本兼容性检查
在开始安装前,先确认你的 Ubuntu 版本是否受支持。通过以下命令查看系统信息:
lsb_release -apnpm 对 Ubuntu 的主要版本支持情况:
- Ubuntu 20.04 LTS (Focal Fossa) - 完全支持
- Ubuntu 22.04 LTS (Jammy Jellyfish) - 最佳支持
- Ubuntu 24.04 LTS (Noble Numbat) - 需注意 Node.js 版本要求
注意:如果你看到 "error: this version of pnpm requires at least Node.js v22.13" 这类错误,说明需要先升级 Node.js。我会在 3.2 节详细说明。
2.2 依赖项安装
pnpm 需要一些基础依赖才能正常运行:
sudo apt update sudo apt install -y curl git python3 make g++这些依赖的作用:
- curl:用于下载安装脚本
- git:某些包可能需要从 git 仓库安装
- python3/make/g++:用于编译原生模块(如 node-sass)
3. 安装 pnpm 的三种方法
3.1 官方脚本安装(推荐)
这是最快捷的安装方式:
curl -fsSL https://get.pnpm.io/install.sh | sh -安装完成后需要重新加载 shell 配置:
source ~/.bashrc # 如果用 bash # 或 source ~/.zshrc # 如果用 zsh验证安装:
pnpm --version避坑指南:如果遇到 "Permission denied" 错误,可能是 ~/.local/share/pnpm 目录权限问题,执行:
sudo chown -R $(whoami) ~/.local/share/pnpm
3.2 通过 npm 安装(适合已有 Node 环境)
如果你已经通过 nvm 等工具安装了 Node.js:
npm install -g pnpm版本对应关系:
| Node.js 版本 | 推荐 pnpm 版本 |
|---|---|
| < 14 | 不推荐 |
| 14-16 | 6.x |
| 16-18 | 7.x |
| ≥ 18 | 8.x+ |
3.3 通过 Corepack 安装(Node.js 16+)
Node.js 16+ 内置了包管理器管理工具:
corepack enable corepack prepare pnpm@latest --activate4. 环境配置与优化
4.1 存储路径配置
默认情况下 pnpm 将包存储在 ~/.local/share/pnpm/store,你可以通过环境变量修改:
echo 'export PNPM_HOME="/path/to/your/store"' >> ~/.bashrc source ~/.bashrc我建议将 store 放在大容量分区,特别是如果你使用 SSD 作为系统盘。
4.2 镜像源加速
国内用户建议设置淘宝镜像:
pnpm config set registry https://registry.npmmirror.com/其他实用配置:
# 设置并发下载数 pnpm config set fetch-retries 5 pnpm config set fetch-timeout 60000 # 禁用自动安装 peerDependencies pnpm config set auto-install-peers false5. 常见问题解决方案
5.1 权限问题汇总
问题1:EACCES: permission denied, access '/usr/local/lib/node_modules'
解决方案:
# 方法1:使用 --global 时加上 sudo sudo pnpm add -g some-package # 方法2(推荐):重新配置全局目录权限 pnpm setup问题2:ERR_PNPM_DLX_MULTIPLE_BINS] Could not determine executable to run
这是因为项目中有多个可能的执行入口,明确指定:
pnpm dlx -p @angular/cli ng new project5.2 版本冲突处理
当遇到类似 "the 'pnpm' field in package.json is no longer read by pnpm" 警告时:
- 检查项目根目录的 package.json
- 移除或更新过时的 pnpm 配置项
- 运行
pnpm install --force重置依赖
5.3 与其它工具集成
VSCode 配置: 在 .vscode/settings.json 中添加:
{ "eslint.packageManager": "pnpm", "prettier.packageManager": "pnpm" }Docker 优化: 在 Dockerfile 中使用 pnpm 的最佳实践:
RUN corepack enable && \ corepack prepare pnpm@latest --activate && \ pnpm install --frozen-lockfile6. 进阶使用技巧
6.1 工作空间(Workspace)配置
pnpm 的工作空间功能比 npm/yarn 更高效。创建 pnpm-workspace.yaml:
packages: - 'packages/**' - '!**/test/**'然后可以:
# 安装所有工作区依赖 pnpm install # 在指定包中运行命令 pnpm --filter my-package run dev6.2 依赖审查与审计
安全审计:
pnpm audit查看依赖树:
pnpm list --depth 3批准构建(针对需要编译的依赖):
pnpm approve-builds6.3 性能优化配置
在 .npmrc 中添加:
prefer-offline=true strict-peer-dependencies=false hoist=false对于 CI 环境:
pnpm install --shamefully-hoist --frozen-lockfile7. 完整卸载指南
如果需要完全移除 pnpm:
- 删除二进制文件:
rm -rf ~/.local/share/pnpm ~/.local/bin/pnpm- 清理环境变量(编辑 ~/.bashrc 或 ~/.zshrc):
# 删除包含 PNPM_HOME 的行 nano ~/.bashrc- 删除全局安装的包:
rm -rf ~/.pnpm-store- 如果通过 npm 安装,还需要:
npm uninstall -g pnpm