使用 NVM 切换 Node.js 版本详解

在现代前端开发中,不同项目可能需要不同版本的 Node.js。NVM (Node Version Manager) 让我们能够轻松地在多个 Node.js 版本之间切换。

  1. 项目兼容性:旧项目可能依赖较老的 Node.js 版本
  2. 工具要求:某些工具对 Node.js 版本有特定要求
  3. 测试需求:需要在不同版本下测试应用兼容性
  4. 团队协作:保持团队成员使用相同版本
# 旧项目可能需要 Node.js 14
# 新项目使用最新的 Node.js 20
# 某些工具如 Wrangler 可能对版本敏感
# 查看已安装的版本
nvm ls

# 查看当前使用的版本
nvm current
# 输出示例:v18.17.0

# 查看可安装的版本
nvm ls-remote --lts  # 查看所有 LTS 版本
# 安装 Node.js 18
nvm install 18.17.0

# 安装最新的 LTS 版本
nvm install --lts

# 安装最新版本
nvm install node
# 切换到 Node.js 18
nvm use 18.17.0

# 切换到最新 LTS 版本
nvm use --lts

# 切换到最新版本
nvm use node

# 使用主版本号(自动选择最新的子版本)
nvm use 18
# 某些工具(如 Wrangler)可能在最新版本遇到问题
# 切换到兼容版本
nvm install 18
nvm use 18

# 安装工具
npm install -g wrangler

# 验证工具是否正常工作
wrangler --version
# 项目 A 使用 Node.js 16
cd project-a
nvm use 16.20.0

# 项目 B 使用 Node.js 18
cd project-b
nvm use 18.17.0

在项目根目录创建 .nvmrc 文件:

# .nvmrc 文件内容
18.17.0

然后在项目目录中:

# 自动使用项目指定的版本
nvm use

# 如果版本未安装,先安装
nvm install
# 在指定版本下执行单个命令
nvm exec 16.20.0 node --version

# 在指定版本下运行脚本
nvm exec 18.17.0 npm run build

# 在指定版本下运行 Node.js 脚本
nvm run 18.17.0 server.js
# 设置默认版本(新终端会自动使用)
nvm alias default 18.17.0

# 设置最新 LTS 为默认
nvm alias default --lts

# 查看所有别名
nvm alias
# 为常用版本创建别名
nvm alias stable 18.17.0
nvm alias legacy 16.20.0
nvm alias latest node

# 使用别名切换
nvm use stable
nvm use legacy

~/.zshrc~/.bashrc 中添加:

# 自动加载 .nvmrc
autoload -U add-zsh-hook
load-nvmrc() {
  local node_version="$(nvm version)"
  local nvmrc_path="$(nvm_find_nvmrc)"

  if [ -n "$nvmrc_path" ]; then
    local nvmrc_node_version=$(cat "${nvmrc_path}")

    if [ "$nvmrc_node_version" = "N/A" ]; then
      nvm install
    elif [ "$nvmrc_node_version" != "$node_version" ]; then
      nvm use
    fi
  elif [ "$node_version" != "$(nvm version default)" ]; then
    echo "Reverting to nvm default version"
    nvm use default
  fi
}
add-zsh-hook chpwd load-nvmrc
load-nvmrc

package.json 中添加脚本:

{
  "scripts": {
    "prestart": "nvm use",
    "start": "node server.js"
  }
}

每个 Node.js 版本都有独立的全局包环境:

# 查看当前版本的全局包
npm list -g --depth=0

# 重新安装常用全局包
npm install -g yarn typescript nodemon
# 检查当前使用的 Node.js 路径
which node

# 确保路径指向 nvm 管理的版本
# 正确路径示例:/Users/username/.nvm/versions/node/v18.17.0/bin/node

# 如果路径不正确,重新加载 nvm
source ~/.nvm/nvm.sh
# 不要使用 sudo 安装全局包
# 如果遇到权限问题,检查 nvm 目录权限
ls -la ~/.nvm
sudo chown -R $(whoami) ~/.nvm
# 更新 nvm 到最新版本
nvm install node --reinstall-packages-from=node

# 或者重新安装 nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash
# 每个项目都应该有 .nvmrc 文件
echo "18.17.0" > .nvmrc

# 在项目 README 中说明 Node.js 版本要求
# 团队成员使用相同的 Node.js 版本
# 在项目文档中明确版本要求
# 使用 .nvmrc 文件统一版本
# 生产环境使用 LTS 版本
nvm install --lts
nvm alias default --lts

# 开发环境可以尝试最新版本
nvm install node
# 查看已安装的版本
nvm ls

# 卸载不再使用的版本
nvm uninstall 14.21.0

创建 switch-node.sh 脚本:

#!/bin/bash
# 快速切换 Node.js 版本

case $1 in
  "16"|"legacy")
    nvm use 16.20.0
    ;;
  "18"|"stable")
    nvm use 18.17.0
    ;;
  "20"|"latest")
    nvm use 20
    ;;
  *)
    echo "使用方法: $0 {16|18|20|legacy|stable|latest}"
    echo "当前版本: $(nvm current)"
    ;;
esac

使用方法:

chmod +x switch-node.sh
./switch-node.sh 18
# 使用二进制安装(更快)
nvm install 18.17.0

# 避免从源码编译(除非必要)
# nvm install -s 18.17.0  # 源码编译(慢)
# 在 shell 配置文件中延迟加载 nvm
nvm() {
    unset -f nvm
    [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
    nvm "$@"
}