nvm 与 pnpm 实战指南
nvm 与 pnpm 实战指南
Node.js 开发中最痛的事:项目 A 要 Node 18,项目 B 要 Node 20,切来切去环境全乱。nvm 解决版本管理,pnpm 解决依赖管理——两个工具配合,开发体验直接起飞。
一、nvm — Node Version Manager
1.1 是什么
nvm(Node Version Manager)是 Node.js 的版本管理器,允许在同一台机器上安装和切换多个 Node.js 版本。
核心价值:
| 痛点 | nvm 怎么解决 |
|---|---|
| 多项目要求不同 Node 版本 | 一条命令切换,秒级生效 |
| 全局安装的包随版本混乱 | 每个 Node 版本有独立的全局包空间 |
| 升级/降级 Node 怕搞坏环境 | 随意安装任意版本,互不干扰 |
1.2 官方仓库
- GitHub:https://github.com/nvm-sh/nvm(Linux / macOS)
- Windows 版:https://github.com/coreybutler/nvm-windows
⚠️ nvm-windows 是独立项目,命令基本一致,但实现不同。本文以 Windows 为主。
1.3 安装
Windows
- 去 nvm-windows Releases 下载
nvm-setup.exe - 安装时选择 Node.js 符号链接路径(默认即可)
- 安装完成后验证:
nvm version
# 输出如:1.2.2Linux / macOS
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash
# 或
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash安装后重启终端,或手动加载:
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"1.4 常用命令
安装与切换
# 查看可安装的 Node 版本(远程列表)
nvm list available # Windows
nvm ls-remote # Linux/macOS
# 安装指定版本
nvm install 20.11.0
# 安装最新 LTS
nvm install --lts
# 切换版本
nvm use 20.11.0
# 切换到最新已安装版本
nvm use latest查看与清理
# 查看已安装的所有版本
nvm list # Windows
nvm ls # Linux/macOS
# 查看当前使用的版本
nvm current # Windows
nvm current # Linux/macOS(同)
# 卸载某个版本
nvm uninstall 16.20.0设置默认版本
# 设置默认版本(新终端自动使用)
nvm alias default 20.11.0 # Linux/macOS
# Windows 下 nvm use 会自动写入 default项目级自动切换
在项目根目录创建 .nvmrc 文件:
20.11.0进入项目目录后执行:
nvm use # 自动读取 .nvmrc 并切换💡 建议配合 shell hook 实现自动切换(cd 进目录自动
nvm use),参见 avn 或在.bashrc/.zshrc中添加 hook。
1.5 nvm 与全局包的关系
关键理解:每个 Node 版本有独立的全局包目录。
nvm use 18
npm install -g typescript # 装到 Node 18 的全局空间
nvm use 20
# typescript 不在了!需要重新装
npm install -g typescript # 装到 Node 20 的全局空间💡 这就是为什么推荐用 corepack 管理 pnpm——它跟着 Node 走,不用每次重装。
1.6 常见问题
| 问题 | 解决 |
|---|---|
nvm use 报错权限不足 | Windows:以管理员身份运行终端 |
| 切换版本后 npm 全局包没了 | 正常现象,每个版本独立;用 corepack 管理包管理器 |
| 安装 Node 太慢 | 配镜像:nvm node_mirror https://npmmirror.com/mirrors/node/(Windows 在 settings.txt) |
.nvmrc 不自动切换 | 需要手动 nvm use 或配置 shell hook |
二、pnpm — 高性能包管理器
2.1 是什么
pnpm 是 Node.js 的高性能包管理器,通过硬链接 + 符号链接的存储策略,解决 npm/yarn 的依赖冗余问题。
三大核心优势:
| 优势 | 原理 | 效果 |
|---|---|---|
| 🚀 极速安装 | 硬链接共享存储,不重复下载 | 比 npm 快 2~3 倍 |
| 💾 节省磁盘 | 同一包只存一份,多项目链接复用 | 磁盘占用减少 70%+ |
| 🔒 严格依赖隔离 | 幽灵依赖无法访问 | 杜绝 require 了没声明的包 |
2.2 官方资源
2.3 安装
方式一:corepack(✅ 推荐,配合 nvm 最佳)
corepack enable
corepack prepare pnpm@latest --activate为什么推荐:corepack 随 Node.js 自带(16.9+),pnpm 跟着 Node 版本走,nvm use 切换后 pnpm 自动可用,不用重装。
方式二:npm 全局安装
npm install -g pnpm⚠️ nvm 环境下,每次切换 Node 版本后需要重新安装。
方式三:独立安装脚本
# Windows (PowerShell)
iwr https://get.pnpm.io/install.ps1 -UseBasicParsing | iex
# Linux/macOS
curl -fsSL https://get.pnpm.io/install.sh | sh -⚠️ 独立安装的 pnpm 不跟随 nvm 的 Node 版本,可能产生版本不匹配,不推荐在 nvm 环境下使用。
验证安装
pnpm -v
# 输出如:10.0.02.4 核心概念:内容寻址存储
pnpm 在全局维护一个 store(默认 ~/.local/share/pnpm/store),所有包只下载一份存入 store,项目中的 node_modules 通过符号链接指向 store 中的硬链接。
项目 A/node_modules/.pnpm/lodash@4.17.21 → store/v3/files/xx/xx
项目 B/node_modules/.pnpm/lodash@4.17.21 → store/v3/files/xx/xx (同一个!)结果:10 个项目用同一个版本的 lodash,磁盘上只存 1 份。
2.5 常用命令
项目初始化与安装
# 初始化项目
pnpm init
# 安装所有依赖(根据 lockfile)
pnpm install # 简写 pnpm i
# 安装生产依赖
pnpm add express
# 安装开发依赖
pnpm add -D typescript @types/node
# 安装全局包
pnpm add -g pnpm # 自升级依赖管理
# 移除依赖
pnpm remove express
# 查看依赖树
pnpm list # 简写 pnpm ls
# 查看过时的包
pnpm outdated
# 交互式更新
pnpm update --interactive # 简写 pnpm up -i运行脚本
# 运行 package.json 中的 scripts
pnpm run dev # 简写 pnpm dev
pnpm run build # 简写 pnpm build
pnpm run test # 简写 pnpm testStore 管理
# 查看 store 路径
pnpm store path
# 清理 store 中未引用的包(释放磁盘)
pnpm store prune2.6 配置镜像
# 设置淘宝镜像
pnpm config set registry https://registry.npmmirror.com
# 查看当前镜像
pnpm config get registry或在项目根目录 .npmrc 文件中:
registry=https://registry.npmmirror.com2.7 Monorepo 支持
pnpm 原生支持 Monorepo,通过 workspace 实现:
# pnpm-workspace.yaml
packages:
- 'packages/*'
- 'apps/*'# 在所有子包中执行命令
pnpm -r run build
# 只在指定包执行
pnpm --filter @myapp/server run dev
# 查看所有子包
pnpm -r list💡 pnpm 的 workspace 比 npm workspaces 和 yarn workspaces 更严格——子包之间只能引用
dependencies中声明的包,杜绝幽灵依赖。
2.8 与 npm/yarn 的命令对照
| 功能 | npm | yarn | pnpm |
|---|---|---|---|
| 安装依赖 | npm install | yarn | pnpm install |
| 添加依赖 | npm add pkg | yarn add pkg | pnpm add pkg |
| 添加开发依赖 | npm add -D pkg | yarn add -D pkg | pnpm add -D pkg |
| 移除依赖 | npm rm pkg | yarn remove pkg | pnpm remove pkg |
| 运行脚本 | npm run dev | yarn dev | pnpm dev |
| 全局安装 | npm i -g pkg | yarn global add pkg | pnpm add -g pkg |
| 查看过时 | npm outdated | yarn outdated | pnpm outdated |
2.9 常见问题
| 问题 | 解决 |
|---|---|
ERR_PNPM_NO_IMPORTER_MANIFEST_FOUND | 当前目录没有 package.json,先 pnpm init |
| 依赖找不到(shims 报错) | pnpm install 重新安装,确保 .npmrc 中 shamefully-hoist 按需配置 |
| 某些包需要幽灵依赖 | 在 .npmrc 中加 shamefully-hoist=true(不推荐,仅作兜底) |
| store 占用太大 | pnpm store prune 清理未引用的包 |
| 切换 Node 版本后 pnpm 不见了 | 用 corepack enable 安装,而非 npm install -g pnpm |
三、nvm + pnpm 最佳实践
3.1 推荐安装顺序
# 1. 安装 nvm(略,见上文)
# 2. 安装 Node.js LTS
nvm install --lts
nvm use <安装的版本>
# 3. 启用 corepack,安装 pnpm
corepack enable
corepack prepare pnpm@latest --activate
# 4. 配置镜像
npm config set registry https://registry.npmmirror.com
pnpm config set registry https://registry.npmmirror.com
# 5. 验证
node -v
pnpm -v3.2 项目级版本锁定
在项目根目录维护两个文件:
# .nvmrc — 锁定 Node 版本
20.11.0// package.json — 声明包管理器
{
"packageManager": "pnpm@10.0.0"
}
packageManager字段配合 corepack 使用,执行corepack install会自动安装指定版本的 pnpm,确保团队环境一致。
3.3 切换 Node 版本后的行为
nvm use 18
# → Node 18 的 pnpm 自动可用(corepack 管理)
# → 全局 pnpm store 共享,不重复下载
nvm use 20
# → Node 20 的 pnpm 自动可用
# → 同一 store,无缝衔接四、速查表
nvm
| 命令 | 作用 |
|---|---|
nvm install <version> | 安装指定 Node 版本 |
nvm install --lts | 安装最新 LTS |
nvm use <version> | 切换版本 |
nvm list / nvm ls | 查看已安装版本 |
nvm current | 查看当前版本 |
nvm uninstall <version> | 卸载版本 |
nvm alias default <version> | 设置默认版本 |
pnpm
| 命令 | 作用 |
|---|---|
pnpm add <pkg> | 添加依赖 |
pnpm add -D <pkg> | 添加开发依赖 |
pnpm install | 安装所有依赖 |
pnpm remove <pkg> | 移除依赖 |
pnpm dev / pnpm run dev | 运行脚本 |
pnpm -r run build | Monorepo 全量构建 |
pnpm store prune | 清理 store |
pnpm outdated | 查看过时依赖 |
🎯 一句话总结:nvm 管 Node 版本,pnpm 管依赖安装,corepack 做桥梁——三者配合,多版本多项目开发丝滑无感。