为什么要装 nvm-windows
同时维护几个 Node 项目的人多半都遇到过这个尴尬:A 项目跑在 Node 16,B 项目要 Node 18,C 项目最近升到 22 用了新的内置 fetch。直接装一个版本然后到处兼容是行不通的 —— 总有一个会跑不起来。
nvm-windows 就是用来解决这个问题的:它是一个独立的命令行工具,管理本机的多个 Node 版本,一行命令切换。Windows 上和 macOS / Linux 上的 nvm 不是同一个项目(那个是 nvm-sh/nvm,基于 bash),用法虽然像但底层完全不同 —— 别照着 macOS 的教程在 Windows 上敲,会被空环境变量坑到。

下载与安装
官方 GitHub Release:
https://github.com/coreybutler/nvm-windows/releases
下载列表里挑 nvm-setup.exe(还有一个 nvm-noinstall.zip 是绿色版,新手不建议)。
装之前先做两件事:
- 卸载电脑里已有的 Node —— 控制面板里搜 Node.js 卸载干净。如果留着,nvm 切换出来的版本和原生 Node 会打架,
node -v永远输出原生的那个,你会以为切换没生效。 - 右键以管理员身份运行 nvm-setup.exe。装的时候它要往
C:Program Filesnodejs创建 symbolic link(系统目录,需要权限),普通用户跑会装,但切换版本时会失败。
装完打开一个新的 PowerShell / CMD(老的开着会读不到新加的 PATH),输入:
nvm version
# 输出类似 1.1.12 就是装好了
关键配置:镜像源
nvm-windows 默认从 https://nodejs.org/dist 下载 Node 安装包,国内访问这个域名速度感人 —— 不是慢,是大概率超时。第一次用之前一定要换镜像。
# Node 安装包镜像
nvm node_mirror https://npmmirror.com/mirrors/node/
# npm 安装包镜像
nvm npm_mirror https://npmmirror.com/mirrors/npm/
这两条命令把镜像写进 nvm 安装目录下的 settings.txt。直接编辑那个文件也能改。
除了淘宝镜像,可选的国内源还有:
# 腾讯云
nvm node_mirror https://mirrors.cloud.tencent.com/nodejs-release/
# 华为云
nvm node_mirror https://repo.huaweicloud.com/nodejs/
# 中科大(教育网友好)
nvm node_mirror https://mirrors.ustc.edu.cn/node/
都试过,普遍是淘宝最稳,腾讯偶尔更新慢一两天但速度最快。学校宿舍跑教育网用中科大。
安装 / 切换 Node 版本
核心三条命令,几乎覆盖 90% 使用场景:
# 看看远程有哪些版本可装
nvm list available
# 装一个版本(只写大版本号会装当时的最新小版本)
nvm install 18
nvm install 20.11.1 # 指定精确版本
# 切到这个版本(切换需要管理员权限)
nvm use 18
注意:nvm install 和 nvm use 这两条都必须在管理员权限的终端里跑(Win+X → "Windows 终端(管理员)")。不然会报 access is denied,因为切换版本要重写 C:Program Filesnodejs 这个 symlink。
切完验证一下:
node -v # v18.x.x
npm -v
where node # C:Program Filesnodejsnode.exe(永远是这个,因为是 symlink)
常用命令速查
下面是日常用得到的命令,加粗的是高频:
nvm list(可简写nvm ls):列出本机装过的所有版本,前面带*的是当前激活的nvm install <version>:安装版本,可加--insecure跳过 SSL 校验(企业内网证书烂的时候用)nvm use <version>:切换激活版本nvm uninstall <version>:卸载某个版本(省磁盘空间)nvm current:只看当前激活版本,等同node -vnvm arch [32|64]:看当前是 32 位还是 64 位,默认跟系统走nvm on/nvm off:启用 / 停用整套版本管理(很少用,临时禁用调试用)nvm proxy [url]:设代理,适用走 socks5 / http proxy 的场景。nvm proxy none移除nvm root [path]:多版本 Node 的存储根目录,默认装到 nvm 安装目录下nvm node_mirror [url]/nvm npm_mirror [url]:镜像源,见上节nvm version(简写nvm v):看 nvm 自身版本
典型工作流
实际场景里一个完整的"换 Node 版本"流程通常是这样:
# 1. 看远程有什么(过滤 LTS 版本)
nvm list available
# 2. 装目标版本(选个 LTS 偶数版本最稳)
nvm install 20.11.1
# 3. 切换到新版本
nvm use 20.11.1
# 4. 验证一下
node -v && npm -v
# 5. 重新装项目里的全局工具(切版本后全局包要重装)
npm i -g pnpm yarn typescript ts-node
# 6. 老版本用不上了就删掉
nvm uninstall 16.20.0
第 5 步是 nvm 容易忘的点:每个 Node 版本有独立的 npm 全局目录,切换后之前 npm i -g 装的工具全没了。你会发现 pnpm 命令找不到、vue CLI 不见了,这就是这个原因。
项目级版本锁定(.nvmrc 的替代方案)
macOS / Linux 上的 nvm 支持读取项目根目录的 .nvmrc 文件自动切换版本(配合 cd hook)。nvm-windows 不支持 .nvmrc —— 这是绕不开的差异。
但你可以用 npm 自带的 engines 字段做版本声明:
{
"name": "your-project",
"engines": {
"node": ">=18.0.0 <21.0.0",
"npm": ">=9.0.0"
}
}
配合 .npmrc 强制校验:
# .npmrc
engine-strict=true
这样新人 npm install 时如果 Node 版本对不上,会直接报错,提示该用哪个版本。比 .nvmrc 隐式切换更显式,实际维护更舒服。
如果一定要自动切换,可以写个 PowerShell function 挂在 cd 上读 .nvmrc:
# 加到 $PROFILE
function Set-Location-WithNvm {
param([string]$Path)
Set-Location $Path
if (Test-Path .nvmrc) {
$v = (Get-Content .nvmrc -Raw).Trim()
nvm use $v
}
}
Set-Alias cd Set-Location-WithNvm -Option AllScope -Force
但要小心 —— 每次 cd 触发 nvm use 又需要管理员权限,普通终端会报错。所以这招仅对常开管理员终端的人有用。
排错:几个常见坑
1. nvm use 报 access is denied
就是没用管理员权限开终端。重开个管理员 PowerShell 再来。
2. 切换后 node -v 还是旧版本
两种可能:
- 装 nvm 之前的原生 Node 没卸干净,残留的
node.exe在 PATH 里抢先了。检查where node,如果输出多于一行,把多余的卸掉。 - 终端没重启。
nvm use改的是系统级 symlink,当前终端的环境变量是进程启动时快照的,得开新终端读到新的 PATH。
3. 装版本卡在 "Downloading node version x.x.x..."
镜像没设。回到本文上面"关键配置:镜像源"那一节,把 node_mirror 改成 npmmirror。
4. 全局包切换后全部消失
每个 Node 版本独立 npm 目录,见上一节"典型工作流"第 5 步。可以把常用全局包列个清单贴到 README,切版本后跑一次重装。
5. PowerShell 中 nvm 命令找不到
装好后第一次开终端,PATH 缓存还没刷新。开新窗口,或者执行 refreshenv(装了 Chocolatey 才有)。
升级 nvm 本身
nvm-windows 自己也会发新版,修 bug + 加新功能。直接覆盖装就行:
# 1. 看本机当前版本
nvm version
# 2. GitHub 查最新版,下载新的 nvm-setup.exe
# https://github.com/coreybutler/nvm-windows/releases
# 3. 不需要卸载老的,直接以管理员身份运行新 setup
# 它会原地升级,已装的 Node 版本完全保留
# 4. 装完再开新终端验证
nvm version
升级过程不会动你装的 Node 版本,也不会动 settings.txt 里的镜像配置,放心。
一句话总结
对 Windows 开发者来说,nvm-windows 几乎是必装。装完先换镜像,后面所有操作都用管理员身份的终端来跑,基本就不会踩坑。复杂场景配合 package.json 的 engines + engine-strict=true 做版本约束,比依赖 .nvmrc 这种隐式方式更稳。
—— 别看了 · 2026