如果你还在用“官网下载 Node.js 安装包,双击一路下一步”的方式管理 Windows 上的开发环境,我强烈建议你花十分钟看完这篇。以前我维护一个老项目时必须锁在 Node 12,新项目要 Node 18,还有几个工具链要 Node 20,那段时间我基本是在“卸载旧版—装新版—发现老项目跑不了—再卸载重装”的死循环里度过的,直到换成 nvm 管理版本,才算彻底解脱。这篇文章会从原理讲到实操,覆盖 Windows 下 nvm 的下载、安装、配置、日常命令、npm 全局工具链的配套设置,以及我踩过的各种坑。不管你是刚接触 Node.js 的新手,还是已经被版本切换折磨过几轮的老手,都可以直接照着操作。
1. Windows 上的 nvm 到底是什么,它和 mac/Linux 上的 nvm 完全不是同一个东西
1.1 名字一样,其实是两个项目
很多人在 mac 或 Linux 上用过 nvm(Node Version Manager),以为 Windows 下装一个同样名字的东西就能直接上手。实际上这是个巨大的认知误区:mac/Linux 上的 nvm 是 tj 那个生态里的 shell 脚本实现,它依赖 bash、依赖 Unix 体系的符号链接和环境变量机制,原生 Windows 的 cmd 和 PowerShell 根本跑不了。Windows 平台广泛使用的是另一个独立项目,叫 nvm-windows,由 Corey Butler 维护,用 Go 编写,是一个独立发布的 .exe 程序。
这两个东西命令长得像,但代码、实现方式、配置体系都不一样。所以你在网上搜“nvm 安装教程”时,一定要先分清作者和仓库。如果教程里让你用 curl 脚本安装、让你改~/.bashrc,那是 mac/Linux 的玩法,不是 Windows 的。我最早就是在这上面浪费了很多时间,装了一堆莫名其妙的脚本,最后把系统 PATH 搞得一团糟。
1.2 符号链接:nvm-windows 管理版本的核心原理
nvm-windows 能管理多个 Node 版本,核心机制是 Windows 的目录符号链接(symbolic link)。你可以把它理解成一种“快捷方式”,但和普通快捷方式不同,对命令和程序来说,这个符号链接看起来就是一个真实的目录。
nvm-windows 在工作时,会把所有已安装的 Node 版本放在一个主目录下,比如C:\nvm\v18.20.4、C:\nvm\v20.11.0这样一个个版本目录。它另外配置了一个符号链接路径,默认可能是C:\Program Files\nodejs,也可能是你自定义的C:\nodejs。当你执行nvm use 20.11.0时,nvm-windows 会把这个符号链接重新指向C:\nvm\v20.11.0这个目录。因为符号链接目录被加到了系统 PATH 里,所以你在任何终端执行node、npm、npx时,系统实际找到的就是当前符号链接指向的那个 Node 版本目录里的程序。
这个机制比“改 PATH 字符串”要可靠得多。改 PATH 的方案在切换版本后经常会因为路径缓存、残留条目而失效,而符号链接只要创建成功,所有新开的终端都能立刻感知。
1.3 nvm 和 nvm-windows 的能力对比
| 维度 | mac/Linux 上的 nvm | Windows 上的 nvm-windows |
|---|---|---|
| 实现方式 | shell 脚本 | Go 编译的单文件 exe |
| 安装方式 | curl 脚本或包管理器 | 下载 nvm-setup.exe 安装 |
| 依赖环境 | bash、Unix 符号链接 | Windows 原生,支持 cmd/PowerShell |
| 版本切换机制 | 修改 PATH 或软链 | 操作 Windows 符号链接 |
| 安装版本来源 | 官方 Node 版本列表 | 官方或镜像版本列表 |
| 主要局限 | Windows 不能用 | 不支持自动读取 .nvmrc 这类便捷功能 |
那有人会问,我是不是可以用 WSL,在 Linux 子系统里装真正的 nvm?可以,但 WSL 里的 Node 是跑在 Linux 环境里的,和 Windows 本地开发的工具链、路径、文件监听机制完全隔离。如果你要做前端构建、跑本地服务、对接 Windows 上的 IDE 调试器,直接用 nvm-windows 管理 Windows 原生 Node 是更省事的选择。
2. 安装前的环境清理与目录规划:这一步决定你后面少踩多少坑
2.1 卸载旧 Node 时最容易忽略的三处残留
如果你电脑上之前用官方安装包装过 Node.js,在装 nvm-windows 之前建议先把它卸载干净。很多人以为控制面板里“卸载”就完事了,实际上会有三处残留非常坑:
第一是全局安装的 npm 包。官方安装包会把 npm 的全局目录指向%APPDATA%\npm,里面可能躺着 yarn、pnpm、@vue/cli、nodemon 这些你用过的工具。卸载 Node 后这些目录还在,但对应的可执行文件里的 shebang 或依赖可能已经坏了,等你装完 nvm 再执行这些命令,会蹦出各种莫名其妙的报错。建议卸载前先执行npm ls -g --depth=0看一眼有哪些包,有需要的话手动删掉%APPDATA%\npm目录和%APPDATA%\npm-cache。
第二是 PATH 环境变量里残留的 Node 相关条目。官网安装包会把C:\Program Files\nodejs\写进系统 PATH。卸载后这个路径可能还在,如果后面 nvm-windows 的符号链接路径恰好不包含这个路径,那倒没什么影响;但如果两个路径并存,你的终端里node -v到底指向谁,完全取决于 PATH 的先后顺序,这是最容易让人懵的情况。
第三是注册表和相关服务。少数情况下,某些开发工具会在安装 Node 时注册系统服务或写入注册表。这些一般不影响 nvm 使用,但如果你的系统里 Node 装过不止一版,最好在“设置—应用”里确认所有 Node 相关条目都已卸载。
2.2 nvm-windows 的安装目录和符号链接路径怎么选
nvm-windows 的安装向导会要求你填两个路径:一个是 nvm 程序本身和所有 Node 版本存放的根目录,另一个是符号链接目录。
我的建议是:不要把根目录放在C:\Program Files下面,也不要用默认的C:\Users\你的用户名\AppData\Roaming\nvm。不是不能用,而是 Program Files 和用户目录往往有权限控制,某些场景下 nvm 切换版本时需要写文件或创建符号链接,可能触发权限弹窗。我自己的习惯是直接在 C 盘或者 D 盘建一个简洁的目录,比如C:\nvm,符号链接路径用C:\nodejs。这两个路径都不要包含中文、空格和特殊字符,否则后面配置 npm 全局目录或某些工具链时非常容易出问题。
另外要注意一点:符号链接路径对应的目录不要提前手动创建。nvm-windows 在nvm use时会自己创建并维护这个符号链接。如果你手动建了一个同名的真实目录,切换版本时反而可能报错或被拒绝。
2.3 下载安装包的正确姿势
nvm-windows 的安装包在 GitHub Releases 页面可以下载,通常是nvm-setup.exe。如果你所在网络环境下 GitHub 下载速度比较慢,可以从 npmmirror(淘宝镜像)的 binary 镜像站或者其他可信的镜像源找一个对应版本的安装包。下载时注意区分nvm-setup.exe(安装向导版)和nvm-noinstall.zip(绿色解压版),新手直接用nvm-setup.exe最省心。
注意:安装之前最好暂时关闭实时防护类的杀毒软件,或者给安装目录加白名单。因为 nvm-windows 安装过程中会创建符号链接,某些安全软件会拦截这种操作,导致安装完成后
nvm use一直报权限错误。这个问题我在两台电脑上都遇到过,表现是安装时一切正常,但切换版本时反复失败,最后才发现是安全软件在后台阻拦。
3. nvm-windows 安装步骤与装完必须做的验证
3.1 安装向导里的两个关键路径
双击nvm-setup.exe后,安装向导会让你确认两个路径:
- Destination Folder(nvm 根目录):建议填
C:\nvm。 - Symlink Folder(符号链接目录):建议填
C:\nodejs。
这里一定要看着填,不要一路默认。默认的C:\Program Files\nodejs作为符号链接目录存在权限问题,改到自己指定的目录后,后面很多麻烦都能避免。安装过程很快,结束后它会自动把相关环境变量写好,但为了保险,我每次都会手动确认一遍。
3.2 环境变量确认:NVM_HOME、NVM_SYMLINK、PATH
安装完成后,打开系统属性里的“环境变量”设置,检查以下几项:
NVM_HOME:指向C:\nvm,这是 nvm-windows 的程序和版本库目录。NVM_SYMLINK:指向C:\nodejs,这就是你给 Node 做的“当前版本入口”。PATH中必须包含%NVM_HOME%和%NVM_SYMLINK%两个条目。
如果发现缺失,可以手动补上。特别是NVM_SYMLINK,如果 PATH 里没有它,即使你nvm use切了版本,终端里依然找不到node命令。
3.3 第一次使用前的小实验
装完后,重开一个 cmd 或 PowerShell 窗口(这里注意:如果把 PATH 改了就一定要重开终端,旧终端里读到的还是旧的环境变量),依次执行:
nvm version如果输出类似1.1.12的版本号,说明 nvm-windows 本身已经就位。
接着执行:
nvm list这时候应该输出一个空列表或提示“No installations recognized”,这是正常的,你还没装任何 Node 版本。某些版本会输出一个current标记,不用管它。接下来我们进入正式安装 Node 版本的环节。
4. 核心操作:安装、切换、删除 Node 版本,以及下载慢的解决办法
4.1 nvm 常用命令一览
nvm-windows 的命令不多,把下面这些用熟就能覆盖 95% 的日常场景:
| 命令 | 作用 |
|---|---|
nvm list available | 查看远程所有可安装的 Node 版本号 |
nvm list | 查看本机已安装的版本列表 |
nvm install 20.11.0 | 安装指定版本 |
nvm use 20.11.0 | 切换当前使用的版本 |
nvm uninstall 20.11.0 | 卸载某个版本 |
nvm current | 查看当前正在使用的版本 |
nvm root | 查看 nvm 根目录路径 |
nvm on/nvm off | 启用/禁用 nvm 的版本管理功能 |
这里有个很常见的操作误区:很多人以为nvm use之后,所有终端里的 Node 都会立刻变成目标版本。实际上这个切换只对“之后新打开的终端”生效,已经开着的终端窗口里,PATH 环境变量可能还停留在旧值。所以切换版本后,如果发现node -v没变,第一反应应该是重开一个终端窗口,而不是怀疑 nvm 坏了。
4.2 版本选择建议:不是越新越好
在nvm install之前,先想清楚你到底需要什么版本。Node.js 的版本发布节奏很快,每个大版本都有对应的 LTS(长期维护)时间窗口。我的实践经验是:
- 公司老项目、依赖原生模块或老版构建工具链的项目,老老实实用 Node 14 或 Node 16。硬上高版本大概率会遇到
node-sass、gulp、webpack 4这类老组件编译失败的问题。 - 大部分新项目、Vue 3 / React 18 + Vite 的现代前端工程,用 Node 18 或 Node 20 就非常稳。
- 如果你想尝鲜新语法,或者某些工具明确要求更高版本,再考虑 Node 22 及更高版本。不要把“大版本号最高”当成最优解,很多 CLI 工具在最新版本上反而没有完成适配。
顺便回应一个热搜词:“node.js 如何从 10.21.0 版本升级到 18 版本”。千万不要去官网下载 Node 18 的安装包直接覆盖旧版本,那样会在系统里留下两套残留路径,npm 全局包也会乱成一锅粥。正确做法就是用 nvm 装一个 18 的 LTS,比如nvm install 18.20.4,然后nvm use 18.20.4,再把旧环境里的全局 npm 包按需重装一遍,最后卸载掉旧 Node 或直接不管它(不冲突)。
4.3 镜像配置:解决下载慢和版本列表拉不到
nvm install默认从 Node 官方源下载,在国内网络环境下经常慢到怀疑人生。这时可以把下载源切到国内镜像,执行:
nvm node_mirror https://npmmirror.com/mirrors/node/ nvm npm_mirror https://npmmirror.com/mirrors/npm/这两条命令分别设置了 Node 二进制文件和 npm 的镜像地址。设置之后,nvm install 20.11.0的速度会明显提升,nvm list available也能正确拉到镜像源的版本列表。
4.4 一个真实报错:error installing 24.20.0 是怎么回事
有个热搜词非常典型:“error installing 24.20.0: node.js v24.20.0 is not yet released or is not ava”。这个报错的意思是:你想安装的版本号在官方或镜像源里不存在,要么是版本号打错了,要么是那个版本还没发布或已下架。
很多新手喜欢凭记忆输入版本号,比如听说“Node 24 很新,那我装 24.20.0 吧”,结果版本号根本对不上。正确操作是,先执行:
nvm list available它会输出完整的可安装列表,并且标注哪些是 LTS、哪些是 Latest,你从列表里复制准确的版本号再执行安装命令。比如列表里写的是24.21.0,你就装24.21.0,不要自己凭空发挥。
5. 与 npm、全局工具链的配套配置:让 nvm 真正进入日常工作流
5.1 每个 Node 版本自带 npm,切换版本后 npm 会跟着变
这一点是很多人切换版本后“感觉不对劲”的根源:用 nvm-windows 装的每个 Node 版本都自带一个对应版本的 npm,所以你nvm use 20.11.0后,再执行npm -v,看到的可能和上一个版本里的 npm 版本不一样。这是正常现象,不是 nvm 把你的 npm 搞坏了。
这也意味着,你在 Node 18 下全局安装的工具包,不一定能无缝对接到 Node 20 下。好在 npm 的全局安装路径和 node 版本的关系可以通过配置来调整,下面说。
5.2 配置 npm registry 加速
npm 默认源在境外,包下载速度不稳定,建议先换个源:
npm config set registry https://registry.npmmirror.com查看是否生效:
npm config get registry这个配置是写在用户级.npmrc里的,和当前 Node 版本无关,切换 Node 版本后依然保留,不用反复设置。
5.3 全局包的安装目录:建议与 Node 版本解耦
默认情况下,npm 会把全局包安装在%APPDATA%\npm目录,这个目录不随 Node 版本变化,所以大多数命令行工具在切换 Node 版本后依然能直接用。但如果你发现某个全局工具需要依赖当前 Node 版本才能运行,比如某些原生模块只能在某个大版本下编译,那就需要排查工具本身的兼容性,而不是责怪 nvm。
如果你希望把全局包统一放在自己方便管理的位置,可以执行:
npm config set prefix "D:\nodejs\npm-global"然后把这个路径加入系统 PATH。这样所有通过npm install -g安装的工具都会集中到这个目录,备份、迁移、查错都更方便。只是要注意,一旦设置了自定义 prefix,旧目录%APPDATA%\npm里的工具就不会再出现在 PATH 里了,需要重新安装一遍,或者手动把旧目录也留在 PATH 中。
5.4 旧项目与新项目并存的日常管理习惯
现在我日常的工作流基本是这样的:
- 项目开始前,先看项目文档里锁定的 Node 版本要求。
- 如果没有特别要求,统一用 Node 20 LTS。
- 如果电脑上没装对应版本,先
nvm install,再nvm use。 - 如果多个项目要在多个终端同时跑,每个终端可以各自
nvm use到不同版本,互不干扰,因为符号链接机制只影响当前环境下的命令解析。
我还习惯在项目根目录的 README 里明确写一行“Node 版本要求:20.x LTS”,下次换电脑或同事接手时,直接用nvm install 20.11.0就能把环境对齐。这个习惯看起来简单,但真的能省掉大量“本地跑得好好的,别人拉下来就报错”的沟通成本。
6. 高频问题排查:从症状反推根因的完整链路
6.1 症状:node 提示“不是内部或外部命令”
这是新装 nvm-windows 后最常见的报错。排查链路如下:
- 先执行
nvm list,确认当前是否有已安装版本,并且是否已经nvm use过某个版本。刚装完 nvm 但没执行过nvm use时,符号链接可能还没建立,系统中根本没有 node。 - 执行
nvm root,确认 nvm 的根目录路径。 - 打开系统环境变量,确认
NVM_SYMLINK是否存在,以及它对应的目录是否在PATH中。 - 重开终端再试一次。如果还是不行,手动执行一次
nvm use 某个已安装版本,看有没有报错。
6.2 症状:nvm use 报错 exit status 1
这个报错九成和权限有关。nvm-windows 在nvm use时需要在系统层面操作符号链接,所以执行终端必须是以管理员身份启动的。你可以右键点击“Windows Terminal”或“命令提示符”,选择“以管理员身份运行”,再执行nvm use。
如果管理员权限下依然报错,再检查安全软件。某些安全软件会拦截对符号链接的创建操作,表现为nvm use退出码为 1 或提示Access is denied。临时关闭相关保护再试一次,如果确认是拦截,就把C:\nvm和你的符号链接路径加入白名单。
6.3 症状:node 版本切换了,npm 全局包找不到了
这个问题要分情况看。如果你把 npm 的 prefix 保持默认,全局包在%APPDATA%\npm,它不随 Node 版本变化,理论上切换后工具还在。如果你设置了自定义 prefix 且指向某个 Node 版本目录内部,比如C:\nvm\v20.11.0\node_modules,那切换版本后自然就找不到了。解决办法是让 prefix 指向一个与 Node 版本无关的独立目录。
另外,有些全局 CLI 工具本身会调用原生模块或依赖特定的 Node ABI 版本,比如node-sass、bcrypt这类,切换大版本后可能需要npm rebuild或者在目标版本下重新npm install -g。
6.4 症状:GitHub 下载 nvm 或 node 安装包很慢
安装 nvm 本身时下载nvm-setup.exe慢,可以从镜像源或可信的加速渠道获取。安装好 nvm 之后,就像前面说的,用nvm node_mirror和nvm npm_mirror把版本下载源换成 npmmirror,速度问题基本就能解决。不要硬等官方源,那是在浪费生命。
6.5 最后的检查清单
| 检查项 | 预期结果 |
|---|---|
nvm version | 输出 nvm-windows 版本号 |
nvm list | 能看到已安装的 Node 版本列表 |
nvm current | 输出当前使用的 Node 版本 |
where node | 输出的路径包含你的NVM_SYMLINK对应目录 |
node -v/npm -v | 正常输出版本号,且与nvm current一致 |
npm config get registry | 输出你设置的镜像源或 npm 官方源 |
我个人现在每次在一台新电脑上配环境,第一件事就是装 nvm-windows,然后按项目需求装两个 LTS 版本。看到别人还在官网下载安装包、遇到版本冲突时反复卸载重装,我都会劝他试试这套流程。最后再分享一个小技巧:切换版本后如果某个全局工具突然不能用,先在当前版本下执行npm rebuild或重新安装这个工具,八成能解决。管理 Node 版本这件事,工具选对了,后面就都是顺水推舟的事了。