以前写 Node 项目最怕听到一句话:“这个老项目只能跑 Node 12,你先把版本换一下。”Windows 系统上切换 Node 版本不像 Linux 那样写几行 bash 就能搞定,官方安装包装一个只能用一个,装新版本时旧版本的所有全局依赖又跟着遭殃。我后来切换到 nvm-windows 管理 Node 环境之后,才算彻底告别了“卸载—重启—再安装—再配环境变量”的循环。这篇指南就是我从下载 nvm、配置多版本 Node、切换默认版本,到 npm 镜像源与全局模块目录设置的完整操作记录,里面每一行命令都是我在 Windows 上实际验证过的,遇到报错也给出了完整的排查思路,希望你在 Windows 下管理 Node 环境时能少走几条弯路。
1. 为什么 Windows 下推荐用 nvm 而不是反复卸载官方包
1.1 我遇到过的真实版本冲突
我之前接手过一个维护了两年的后台管理系统,前端脚手架停留在 webpack 4,依赖的 node-sass 在 Node 17 以上的版本根本编译不过。而同期的另一个新项目一上来就要求 Node 18+,因为用了最新版 Vite 和原生 ES Module 工具链。两台机器并行开发倒还好,偏偏我需要在同一台 Windows 电脑上同时维护这两个项目,于是一天里反复换 Node 版本成了常态。
一开始我的做法很粗暴:从官方安装包卸载旧版,再装上目标版本。低估了旧版本的”残留能力”:
- 卸载官方安装包时,C:\Program Files\nodejs目录偶尔没删干净,导致命令行里出现两个不同版本的 node;
- 全局工具的安装路径%APPDATA%\npm里的旧命令脚本,在换版本后指向错误的 npm 路径;
- PATH 环境变量里残留着旧版本目录,虽然卸载程序做了清理,但手动改过 PATH 的话,顺序一乱就轮到旧版本“先手”。
这两三周里,我至少花了两天时间在处理“为什么 node -v 显示 14,但运行脚本时却是另一个版本”“为什么全局 CLI 突然不可用”这类问题,开发效率被拖得很厉害。后来我想明白一件事:同一台 Windows 机器上的 Node 环境,不应该指望用“卸载再安装”来管理,而是需要一个专门的版本管理工具去接管。这就是我转向 nvm 的原因。
1.2 nvm 与 nvm-windows 的差别
搜“nvm 安装”时,很多人会先撞上 Linux / macOS 下使用的 nvm 项目。这个 nvm 是通过 shell 脚本实现版本切换的,它会在每次切换时修改当前 shell 的 PATH 变量,所以在 Windows 原生终端下根本没法直接跑,只能放到 WSL 里用。
Windows 下真正需要的是另一个项目:由 coreybutler 维护的nvm-windows。它虽然命令名同样叫 nvm,但底层用 Go 实现,是一个完全独立于 Linux 版 nvm 的工程。它的工作方式不是修改 PATH,而是通过创建 Windows 目录联接(Junction)来切换当前 Node 版本。这个差别很关键,后面我会专门讲。
很多人下载时没分清这两个项目,结果拿了一段 shell 安装脚本去 Git Bash 里执行,环境变量被改得乱七八糟,最后还怪 nvm 不好用。记住一点:你的系统是 Windows,就认准哪个 release 提供 nvm-setup.exe 的文件;只有 .zip 源码包的、只有安装脚本的,都不是 Windows 原生工具。
1.3 安装前先清理旧环境
如果你电脑里已经装过 Node 官方安装包,或者手动改过 PATH,安装 nvm 之前最好先做一次体检,否则装完 nvm 后很可能出现“两个 node 打架”的局面。
具体做三件事:
- 打开“设置 -> 应用”,卸载所有已安装的 Node.js 条目。
- 打开资源管理器,检查这些目录是否存在,存在就手动删除:
C:\Program Files\nodejsC:\Users\你的用户名\AppData\Roaming\npmC:\Users\你的用户名\AppData\Local\Temp下的 node 相关临时文件
- 在系统环境变量 PATH 中,找到所有
nodejs、npm、yarn等路径条目,确认已清理干净。
提示:如果你以前用官方安装包装过 Node,并且安装目录设置在了 D 盘,也要把对应的 D 盘 nodejs 目录清理掉。nvm-windows 默认通过
C:\Program Files\nodejs这个固定入口切换版本,如果这个入口被旧版 Node 占用,切换时会报“目录已存在”或者“无法创建符号链接”的错误。
最后一步是提醒自己:安装 nvm-windows 和后续切换版本都需要管理员权限。所以安装完成后,尽量用“以管理员身份运行”的 PowerShell 或 CMD 来执行 nvm 命令,避免因为权限不足折腾半天。
2. 安装 nvm-windows:下载、路径规划和符号链接机制
2.1 下载页里认准哪个安装包
进入 nvm-windows 的 Release 页面后,你会看到好几个下载选项,我挑常见的说一下:
- nvm-setup.exe:推荐使用。带图形化安装向导,运行后自动配置好环境变量和默认目录。
- nvm-noinstall.zip:免安装版,下载解压后需要手动设置 NVM_HOME 与 NVM_SYMLINK 两个环境变量,适合想完全控制目录的人。
- Source code(zip):源码包,普通用户不用碰,只有二次开发才需要。
我建议普通开发者直接就选nvm-setup.exe。因为 nvm-windows 有一个很容易踩的坑:NVM_HOME 和 NVM_SYMLINK 的路径是在安装时写死的,如果后续手动改环境变量,不一定能同步更新成功。用安装向导能在这一步最大化避免配置错误。
2.2 安装向导里的两个关键路径
安装向导到了选择安装位置那一步,会要求填两个路径:
- NVM_HOME:nvm 程序本身和所有已下载 Node 版本的存放位置。我设置为
C:\nvm,不建议放C:\Program Files下,因为路径中的空格和权限控制容易让后续下载环节出问题。 - NVM_SYMLINK:这是对外暴露的 Node 入口目录,默认是
C:\Program Files\nodejs。nvm 把当前激活的 Node 版本通过目录联接“挂”到这个位置,系统 PATH 里只需要保留这一个入口就可以了。
需要注意一个细节:NVM_SYMLINK 所指的目录不能提前新建为普通文件夹。如果你手动创建过C:\Program Files\nodejs这个目录,nvm 在创建联接到一半的时候会提示“目标已存在”,此时要先删除目录,再重新执行nvm use让 nvm 自己创建联接。这一点非常容易踩,因为很多教程安装好 nvm 后,第一步就是让用户去新建nodejs目录。
2.3 符号链接机制:理解 nvm 切换版本的本质
很多人不理解为什么安装 nvm 还要专门留一个C:\Program Files\nodejs目录,其实这正是理解 nvm-windows 的钥匙。
当你执行nvm install 18.20.4,nvm-windows 会从 Node 官方镜像站下载 v18.20.4 的压缩包,解压到C:\nvm\v18.20.4目录。此时C:\Program Files\nodejs里还是空的或者指向别的版本。当你执行nvm use 18.20.4,nvm 会删掉旧的目录联接,然后创建一个指向C:\nvm\v18.20.4的 Junction。
目录联接在 Windows 中看起来就是一个普通目录,node、npm、npx这些命令文件都存在于C:\nvm\v18.20.4内部,但你从命令行访问C:\Program Files\nodejs\node.exe时,Windows 会顺着联接自动找到v18.20.4中的真实文件。
这个机制带来的直接好处就是:系统 PATH 环境变量从头到尾只需要一条固定路径,不需要在切换版本时动态改写环境变量。理解了这一点,你就能想明白为什么 nvm-windows 要求管理员权限,以及为什么切换后必须“重开终端”才能看到新版本——某些正在运行的终端进程缓存的 PATH 还是旧的。
3. 从 nvm install 到 nvm use:Node 版本安装与切换的完整流程
3.1 先看可安装的版本,不要凭印象输入
安装完 nvm 后,第一步建议执行nvm list available,它的英文名字可能叫nvm list available或者显示为| CURRENT | LTS | OLD STABLE |这样的分组。
我第一次用的时候,想当然地输入了一个记忆中的版本号,结果直接报错。先跑一遍nvm list available,能看到当前可以从官方源下载的全部版本,例如 CURRENT 列下有 v20、v22、v24 等,LTS 列下有 v18、v20 的稳定版。版本号很密,如果不小心把v20.11.0看成v20.1.0,安装命令一样会失败。
提示:
nvm list available读的是 nodejs.org 的版本元数据。如果你所在网络环境访问该站点不稳定,列表可能是空的,也可能卡在下载阶段。此时要考虑换网络或手动配置镜像源,后面会细说。
同时还可以用nvm list查看本机已经安装了哪些版本,用nvm current查看当前正在使用的版本。三个命令配合起来,基本能掌握整台机器的 Node 状态。
3.2 安装指定版本
确定版本号后,执行安装命令:
nvm install 18.20.4nvm-windows 会根据当前配置从 nodejs.org 下载对应的压缩包,下载完成后自动解压到 NVM_HOME 目录下。此时命令行会提示安装成功,并且显示此版本自带的 npm 版本号。
这里有一个细节:nvm-windows 安装的是 Node 发行版自带的那套 npm,版本会随着 Node 版本变化。例如 Node 18.20.4 自带 npm 10.x,Node 20 系列则可能自带 npm 10.x 或更高。所以当你切换 Node 版本时,npm 版本也会跟着变,这属于正常现象。
装完以后不用急着切换,可以先把多个常用版本都装好。比如我会把 16.x、18.x、20.x 各装一个,之后再按项目需求切换。
3.3 切换版本并处理“node 不是内部或外部命令”
切换版本只需要执行:
nvm use 18.20.4正常情况下会提示Now using node v18.20.4 (64-bit)。如果你遇到以下两种提示,需要分别处理:
一是出现exit status 1或无法创建符号链接这类权限错误。解决办法:用管理员身份重新打开 PowerShell 或 CMD,再执行一次nvm use。nvm-windows 创建目录联接时需要管理员权限,普通权限终端在创建时会被拒绝。
二是明明提示切换成功,但执行node -v还是旧版本。最常见的解释是当前终端进程的 PATH 没有刷新。目录联接已经改变了,但当前终端解析node命令时仍旧指向旧的缓存路径。此时不要纠结命令,直接关闭当前终端,新开一个窗口重新执行node -v,几乎都是新版本。如果新开终端还是旧版本,再去检查 PATH 里是否有其他 Node 目录排在C:\Program Files\nodejs前面。
3.4 设置一个不会变的默认版本
每天手动执行nvm use终究有点繁琐,尤其你用 VS Code 或 JetBrains 系列 IDE 打开终端时,更希望它一打开就自动落到某个基础版本上。
nvm-windows 提供了默认版本设置命令:
nvm alias default 20.11.1设置之后,每次新开终端,nvm 会自动把默认版本设为当前版本。如果你的项目依赖某个特定版本,再单独执行nvm use切换到目标版本即可。
下面是一份常用命令速查,贴到笔记里随时能翻。
| 命令 | 作用 | 示例 |
|---|---|---|
nvm list available | 查看远端可安装版本列表 | nvm list available |
nvm list | 查看本地已安装版本 | nvm list |
nvm install <版本> | 安装指定版本 | nvm install 18.20.4 |
nvm use <版本> | 切换当前版本 | nvm use 18.20.4 |
nvm alias default <版本> | 设置默认版本 | nvm alias default 20.11.1 |
nvm uninstall <版本> | 卸载指定版本 | nvm uninstall 16.20.2 |
nvm current | 查看当前版本 | nvm current |
4. 镜像源、全局模块和缓存目录:nvm 下的 Node 全局配置
4.1 npm 镜像源配置,写在哪个位置很关键
很多新手知道要设置 npm 镜像源,但不知道在 nvm-windows 环境下,镜像源配置应该放在哪里。很多人执行完npm config set registry https://registry.npmmirror.com后,发现只有当前 Node 版本有效,切换版本后又回到官方源,甚至报网络错误。
原因是 npm 的配置文件有不同层级:项目级.npmrc、用户级.npmrc、全局级配置。在 nvm-windows 下,每个 Node 版本都有自己的一套 npm,直接执行npm config set registry时,默认写入了当前版本对应的用户级配置文件,或者项目级配置。换版本后,老配置文件不会被新版本读取,于是新版本又回到了默认源。
我建议直接用文本编辑器编辑用户目录下的.npmrc文件,路径是:
C:\Users\你的用户名\.npmrc里面至少写入以下内容:
registry=https://registry.npmmirror.com这样所有通过 nvm 安装的 Node 版本在读取用户级配置时,都会自动使用这个镜像源。可用npm config get registry检查当前生效的源地址。
4.2 设置全局模块安装目录和缓存目录
npm 默认把全局模块安装到当前 Node 版本目录下的node_modules里。在 nvm-windows 下,这意味着“全局安装”其实跟当前激活的 Node 版本绑定在一起,切换版本后全局模块并不会自动跟着走。为了减少版本切换带来的全局模块迁移麻烦,也为了压缩系统盘占用,我建议把全局模块目录和缓存目录统一设置到独立的目录中。
在.npmrc文件里追加:
prefix=D:\nodejs-global cache=D:\nodejs-cache这里我以 D 盘为例,你可以按自己的磁盘规划调整。设置完成后,执行以下命令让配置立即生效:
npm config get prefix npm config get cache如果输出的路径与你设置的目录一致,说明生效了。但还有一步容易被忽略:把D:\nodejs-global加入系统 PATH 的用户变量中。因为在 Windows 上,全局安装的 CLI 工具实际生成的是.cmd和.ps1脚本,放在 prefix 目录下,只有 PATH 里包含该目录,命令行才能直接识别这些命令。
提示:修改 PATH 后,需要重新打开终端才生效。以前我遇到过明明
npm install -g成功了,可命令提示“无法识别”,折腾半天才发现就是没把 prefix 加入到 PATH。
切换版本时,如果你发现全局命令找不到,多半是当前版本没有重装这些全局包,或者 PATH 里的全局目录指向错误,按上面思路排查通常能很快定位。
4.3 切换版本后,全局命令丢失是正常现象
这一点值得专门提一下。nvm-windows 的机制决定了:你通过npm install -g vite安装的全局命令,只存在于当时的 Node 版本目录里。当你nvm use切换到另一个新版本后,在新版本里执行vite -v,十有八九会提示找不到命令。
这不是你操作错了,也不是 nvm 坏了,而是因为两个版本各自有完整的 npm 文件结构和全局目录。解决方案有两种思路:
- 每个新版本激活后,重新安装必要的全局工具。例如
npm install -g pnpm、npm install -g vite。 - 尽量用
npx代替全局安装。对于一次性使用的命令行工具,直接npx pnpm、npx vite可以避免反复安装。
如果你确实需要多个版本共享同一套全局工具,较稳妥的做法是使用 pnpm 或 Yarn,它们的全局存储独立于 Node 版本,跨版本兼容性更好。至少我现在的习惯是:除非某个工具天天都要用,否则一律 npx 临时调用,减少版本切换后的清理成本。
5. 实测踩坑:版本不存在报错、切换失效与发行包手动安装
5.1 “Error Installing 24.20.0: node.js v24.20.0 is not yet released or is not available”
这条报错在最近咨询里出现的频率非常高,命令行输出大概是这样的:
C:\> nvm install 24.20.0 Error installing 24.20.0: node.js v24.20.0 is not yet released or is not available.这条信息的字面意思已经很明确:你请求的版本号在 nodejs.org 的版本发布列表里找不到。很多人下意识以为是不是网络问题,于是反复重试,结果依旧报错。
我先说结论:绝大多数情况是版本号拼写错误。比如 Node 24 系列当前的发布版本可能只到 24.2.x,而你把版本写成了 24.20.0,这实际上是另一个不存在的版本。20 作为次版本号,需要等 Node 后续发布才能出现,但现在还没有。因为 Node 版本节奏不慢,但也没有快到已经发布 24.20.0 的程度。
遇到这条报错时,不要急着重试,按下面顺序排查:
- 在浏览器中打开
https://nodejs.org/dist/,在目录列表里直接搜你输入的版本号。 - 如果目录不存在,说明这个版本号不是有效版本,换一个真实存在的版本号,用
nvm list available查一下当前可用的版本。 - 如果目录存在,但 nvm 仍然报错,则可能是 nvm-windows 读取的版本列表缓存过期,或者你本地配置的下载源不是官方源导致索引不一致。此时可以检查 NVM_HOME 下的
settings.txt,看看是不是配置了自定义镜像。
这个报错本身并不深奥,真正的坑在于:报错信息直指“未发布”,容易被解读成“网络连不上”或“镜像没同步”,绕一大圈才发现只是一个版本号敲错。
5.2 下载卡住、安装中断时的手动兜底方案
nvm-windows 下载 Node 时依赖外部网络。在某些办公网络或网络波动的情况下,nvm install可能长期停在Downloading node.js version...这一段。等十几分钟还没动静,十有八九是连接不上 nodejs.org。
我的做法是绕过 nvm 的下载环节,直接手动放入发行包:
- 从 Node 的镜像站手动下载对应版本的 zip 压缩包,例如先从
https://nodejs.org/dist/v18.20.4/目录下载node-v18.20.4-win-x64.zip。 - 用解压工具把压缩包里的
node-v18.20.4-win-x64文件夹解压出来,并将该文件夹重命名为v18.20.4。 - 把整个
v18.20.4文件夹复制到 NVM_HOME 目录下,即和nvm.exe同级。 - 执行
nvm list,确认列表中出现18.20.4。 - 执行
nvm use 18.20.4,切换到该版本。
这个方法之所以可行,是因为 nvm-windows 的原理本来就简单:它只负责把 Node 发行包放到 NVM_HOME 下,并维护目录联接。手动放入发行包完全可以绕过它的下载环节。但要注意,系统会自动校验版本目录的命名格式,手动放置时文件夹名必须是v+ 完整版本号,不能简写。
5.3 切换后 node 指令残留旧版本的排查链路
切换版本后,如果终端执行node -v依旧显示旧的版本,除了之前说的“终端缓存 PATH”,还有几种隐蔽情况:
第一种,系统中存在两份 Node 安装。比如你之前用官方安装包装过 Node,残留的node.exe位于其他目录,并且该目录在 PATH 中的优先级比C:\Program Files\nodejs更高。由于 Windows 解析命令时按 PATH 顺序查找,先找到哪一份就会执行哪一份。可以执行where node查看命令行实际找到的所有 node.exe 路径,第一个路径就是即将执行的 node。如果发现第一个路径不是 nvm 的入口,说明 PATH 顺序有问题,需要在系统环境变量里调序。
第二种,某些第三方工具安装过自带的 Node 运行时,例如部分桌面应用内置了 Node,也会向 PATH 注入自身目录。这类进程如果常驻,会在进程内存里保留旧路径。解决办法是彻底退出相关后台应用再测试。
第三种,目录联接失效。如果你清理过C:\Program Files\nodejs目录,或者某些安全软件移除了联接,nvm use虽然显示成功,但实际入口目录是空的或损坏的。此时执行:
nvm uninstall <当前版本> nvm install <版本> nvm use <版本>让 nvm 重新生成目录联接,通常能解决。平时也要注意,不要手动往C:\Program Files\nodejs里复制文件,这个目录只是联接入口,不是真实文件目录,手动改动很容易破坏 nvm 的状态。
| 现象 | 常见原因 | 推荐处理 |
|---|---|---|
| 版本不存在报错 | 版本号拼写错误或发布列表过期 | 用nvm list available确认真实版本 |
| 下载卡住 | 网络无法访问 nodejs.org | 手动下载 zip 放入 NVM_HOME |
| 切换后 node 仍是旧版 | 终端缓存 PATH / 其他 Node 安装残留 | where node排查路径顺序,重开终端 |
| 提示权限不足 | 未能创建目录联接 | 管理员身份运行终端 |
6. 我在多项目环境下的 nvm 日常使用习惯
6.1 默认版本固定为 LTS,项目级要求再单独切换
我现在这台 Windows 机器上常驻的 Node 版本有 18.20.4 和 20.11.1,默认版本指向 20.11.1。每次打开终端,基础环境就是 Node 20,绝大部分新项目都能直接跑。老项目若提示依赖不兼容,我再执行nvm use 18.20.4手动切换,而不是在默认版本上反复横跳。
有一个习惯帮我省了很多麻烦:每次切换版本后,我都会立刻执行一遍:
node -v npm -v两个命令输出都符合预期后才开始跑项目。如果只确认 node 版本而忽略 npm 版本,等到执行npm install时才发现 npm 的版本和 package-lock 文件锁定的版本不一致,又要浪费时间去排查。
6.2 全局工具能少装就少装,能 npx 就 npx
因为 nvm-windows 下全局工具和版本强绑定,我现在很少全局安装各种 CLI,除非这个工具我每个项目都要用。偶尔遇到某个工具没有在版本 npx 解析路径中命中,我就直接执行带完整命令的 npx,比如npx -y vue-cli-service serve,避免全局污染。
如果你确实需要全局安装,建议在.npmrc中设置好 prefix,并且每次安装后检查npm bin -g的路径,确认命令脚本确实生成在了 PATH 覆盖范围内。
6.3 给新手上路的几个小建议
最后结合我自己的使用经验,给刚开始在 Windows 下用 nvm 的开发者三个建议:
一是安装时不要图方便把 NVM_HOME 放到带空格的目录下。很多奇怪的路径解析问题,都因为空格导致脚本无法正确拼接路径。老老实实选一个简单路径,比如C:\nvm。
二是尽量在管理员终端里执行 nvm 相关命令。虽然部分命令在普通权限下也能运行,但nvm use创建目录联接时可能遇到权限拦截,浪费时间排查不如一开始就用管理员身份打开。
三是版本切换后,如果 IDE 内置终端仍旧使用旧版本,不要认为是 nvm 失效,先把 IDE 完全退出再重新打开。IDE 进程在启动时就已经缓存了环境变量,即使系统 PATH 已经更新,IDE 里旧的终端进程也未必同步,重启 IDE 是最快的解决方式。
我在实际维护项目时,已经彻底依赖 nvm 管理 Windows 下的 Node 环境,每次遇到环境问题,第一反应不是重装,而是先执行nvm list看版本结构,再按本文的思路定位问题。整体下来,这套流程帮我省下的时间远比当初安装配置 nvm 花费的时间多。希望这篇文章也能让你的 Windows Node 环境管理变得顺手一些。