前端项目的 Node 版本要求五花八门:老项目锁 Node 16,新项目要 Node 20+,CI 镜像又是另一个版本。系统包管理器装的 Node 只有一个版本,来回卸载重装不现实。nvm 就是干这个的:把多个 Node 版本装进用户目录,一条命令切换。
安装
官方安装脚本(版本号以 nvm releases 页为准,写这篇时最新是 v0.40.8):
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.8/install.sh | bash
脚本做的事很简单:把 nvm 克隆到 ~/.nvm,然后往你的 ~/.bashrc / ~/.zshrc 里追加几行初始化代码。装完重开终端或手动生效:
source ~/.bashrc # zsh 用户用 ~/.zshrc
nvm --version # 能打印出版本号就成了
国内网络
安装脚本要访问 raw.githubusercontent.com,国内大概率超时。三个替代办法,任选其一:
# 1. 走代理(有的话)
https_proxy=http://127.0.0.1:7890 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.8/install.sh | bash
# 2. 直接下 tarball 解压到 ~/.nvm
mkdir -p ~/.nvm && curl -L https://github.com/nvm-sh/nvm/archive/refs/tags/v0.40.8.tar.gz | tar -xz -C ~/.nvm --strip-components=1
# 然后手动把初始化代码写进 shell rc(见官方 README)
# 3. 用 Gitee 上的同步镜像仓(搜 nvm 镜像,注意甄别同步是否及时)
装 Node 走国内镜像
nvm 装好了,装 Node 还要从 nodejs.org 下载,同样慢。把下载源换成 npmmirror:
# 写入 shell rc,永久生效
export NVM_NODEJS_ORG_MIRROR=https://npmmirror.com/mirrors/node
之后再装版本就丝滑了:
nvm install --lts # 装最新 LTS
nvm install 20 # 装指定大版本的最新
nvm ls-remote --lts # 看看有哪些 LTS
日常命令
nvm ls # 本机已装版本
nvm use 20 # 当前 shell 切到 Node 20
nvm alias default 20 # 设默认版本(新终端自动用它)
nvm current # 当前在用哪个
nvm uninstall 16 # 卸载某个版本
项目里放一个 .nvmrc 文件(内容就一行版本号,如 20),进目录后 nvm use 不带参数会自动读它,团队协作时每人手上的版本就统一了。
几个坑
- 新开终端 nvm 失效:初始化代码没写进你实际用的 shell 的 rc 文件(bash 和 zsh 是两份)。用
echo $SHELL确认自己跑的是什么 shell sudo下 nvm 不存在:nvm 装在用户目录,root 的环境里没有它。需要全局场景就换思路,别 sudo- 全局 npm 包不共享:每个 Node 版本有自己独立的全局包目录,切版本后
npm i -g装过的工具要重装。装完新版本可以用nvm install 20 --reinstall-packages-from=16一次性搬过去 - 别用 brew 装 nvm:官方明确不支持,brew 版和初始化脚本经常闹别扭,老老实实走官方脚本
小结
nvm 本身没什么技术含量,但它是前端环境的第一块地基:装对一次,后面所有项目的版本切换都是一句话的事。国内使用记住两个加速点——安装脚本走代理或镜像,装 Node 前把 NVM_NODEJS_ORG_MIRROR 指到 npmmirror。