nvm-windows = Windows 上的 Node.js 多版本管理器。它通过 下载/存放多个 Node 版本,再用一个 symlink(符号链接) 把“当前在用版本”挂到固定入口(通常是 C:\Program Files\nodejs),从而让你用一条命令切换 Node,而不用手动装卸 Node 的安装包。别和 Linux/macOS 的 nvm(nvm-sh) 搞混:后者是 shell 脚本,不能直接在原生 Windows CMD/PowerShell 用;Windows 请用 nvm-windows。

nvm-windows使用注意事项
nvm-windows 的本质是用“自己目录里的某个 Node 版本 + 一个系统级符号链接”接管 node / npm的入口;而大多数人机器上的 Node 是通过官方 MSI 安装出来的“标准安装版”。这两套会互相踩脚,所以最稳、最少玄学问题的做法是:先把老 Node 清干净,让 nvm 成为唯一的 Node 来源。
1) nvm-windows 是怎么工作的(关键点)
常见情况下(默认安装),nvm-windows 会做类似这样的事:
- 所有 Node 版本装在它自己的目录里,例如:
- C:\Users\你\nvm\v18.19.0
- C:\Users\你\nvm\v20.11.0
- 然后在系统层面建立一个“指向当前在用版本”的符号链接(symlink),常见位置如:
- C:\Program Files\nodejs -> C:\Users\你\nvm\v18.19.0
- 你的 PATH 里真正生效的其实是这个“统一入口”(C:\Program Files\nodejs)
也就是说:nvm 不是去改你原来那个 Node 的安装目录,而是把自己造的那个 nodejs 入口强行挂到系统位置来当‘唯一 Node’。
2) 你机器里如果还留着 MSI 装的 Node,会发生什么冲突
PATH 优先级打架
MSI 安装通常会把 Node 放进 C:\Program Files\nodejs(或你自己装的位置),并把该路径写进 PATH;
nvm 也会试图用同名入口(同样叫 nodejs/ 同样的目录习惯)去接管。
结果经常变成:
- 你在终端敲 node -v,实际命中的可能是 旧安装残留的那个exe,而不是 nvm 正在管理的版本
- 即使你 nvm use 18看起来成功,但 where node仍然指向旧的,于是你“以为切了,其实没切”
注册表 / 安装器元数据残留
MSI 安装会在 Windows 的已安装程序/注册表里留下记录;有时还会影响:
- 后续你想再装“官方 Node MSI”时的逻辑
- 某些工具(甚至 IDE/安装器检测)以为你机器上有“一套正统 Node”,结果行为不一致
npm 的“全局前缀 / 全局模块”最容易炸
MSI 版 Node 的 npm 全局目录通常落在:
- 类似 C:\Users\你\AppData\Roaming\npm
- 可能还带 npm-cache、npm本身的可执行脚本
nvm 自己管理的版本里也有 npm,而且版本跟 Node 绑定。两套混在一起会出现:
- 全局包装了但 xxx 命令找不到
- 不同 Node 版本共用同一套全局模块导致 二进制原生模块 ABI 不匹配(装包时报一堆 node-gyp / binding 错误)
- npm -g到底写到哪、从哪找全乱掉
3) “卸载”在这里到底卸的是什么?你能不能保留东西?
它要求你卸载的是:系统里那套“MSI/安装器装出来的 Node”(以及它注册进 PATH/注册表的条目)。
不需要也不应该删:
- 你项目的 node_modules(下次按json 重装即可)
- 你的源代码/配置
建议你只做两件“保险动作”再卸:
- 把全局装过的包名记一下(方便后面按需重装)
在卸之前可以先看:
npm ls -g --depth=0
卸完、nvm 装好后,再把需要的全局工具重新装一遍(后面装好 nvm 后,你再按需 npm i -g xxx恢复就行。别把旧 Roaming\npm\node_modules直接拷回来,更容易出事)。
4) 有没有“不卸载也能硬跑”的情况?
有——但代价是你必须手工保证 PATH 顺序、where node指向 nvm 的入口、并且没任何地方再引用旧 node.exe。
这等于给自己埋雷:今天能用,明天某次安装器/更新/换终端就又糊了。所以所有靠谱教程都会让你先卸干净,不是闲得慌,是在帮你省后面排障时间。
nvm-windows的安装与使用
下载 & 安装 nvm-windows
去官方 Releases 页面下载:
https://github.com/coreybutler/nvm-windows/releases
- 下载 nvm-setup.exe(或 nvm-setup.zip里包含的 exe),双击安装,一路 Next 即可。常见安装器给的两个路径概念(你可按默认或改到无中文/无空格目录):
- NVM 本体目录(root):用来存不同 Node 版本(默认往往在用户目录 AppData\Roaming\nvm)
- js symlink 目录(path):默认往往是 C:\Program Files\nodejs(nvm 会把它做成/维护成一个链接)
- 安装完 开一个新的 CMD / PowerShell(老窗口可能还没刷新 PATH),验证:nvm version,能看到版本号就说明 nvm 已就绪。
配置国内镜像(让 nvm install下载飞起来)
用管理员权限打开终端,执行:
nvm node_mirror https://npmmirror.com/mirrors/node/ nvm npm_mirror https://npmmirror.com/mirrors/npm/
日常使用:安装 / 切换 / 卸载 Node
查看可安装的版本列表
nvm list available
(能看到远程版本列表,基本说明镜像可达)
安装某个版本(示例)
nvm install 20.11.0 nvm install 18.19.0
也可以用别名(视版本支持情况):
nvm install lts nvm install latest
切换版本(重点:可能需要管理员权限)
nvm use 20.11.0
如果报类似 exit status 1 / 权限 相关错误:关闭终端 → 右键“以管理员身份运行” CMD/PowerShell → 再 nvm use 20.11.0。
验证:
node -v npm -v
查看已安装 & 当前在用
nvm list
带 *的就是当前激活版本。
卸载某个版本
nvm uninstall 18.19.0
6) 常用命令速查(官方命令体系)
nvm # 帮助 nvm version # nvm 自身版本 nvm root # 查看/设置 nvm 存放目录 nvm list / nvm ls # 已安装列表 nvm list available # 可安装版本 nvm install <version> [arch] # 安装 nvm use <version> [arch] # 切换 nvm uninstall <version> # 卸载 nvm on / nvm off # 启用/停用版本管理(不卸载) nvm proxy [url] # 设置/查看代理 nvm node_mirror <url> nvm npm_mirror <url>
这些都可以在官方 README 的帮助输出说明里对照着用。
安装时只指定大版本号(自动匹配最新小版本)
场景:你不想记 20.11.0这种具体小版本号,只想装 Node 20的最新稳定版。
方法 :nvm install 20
nvm-windows 会自动去镜像源查找 20.x.x系列里最新的非 RC/非 Nightly 版本,下载并安装。
其他示例
nvm install 18 # 装 Node 18 最新版 nvm install 22 # 装 Node 22 最新版(如果有) nvm install lts # 装当前 LTS 主线最新版 nvm install latest # 装当前最新正式版(可能不是 LTS)
设置默认版本(每次新终端自动激活)
nvm-windows 没有内置的“默认版本”概念(不像 Linux nvm 那样有 default别名)。nvm-windows 的功能比较基础,而且命令和 Linux nvm 不一致容易混淆。如果你觉得这些限制烦人,可以考虑:
- fnm(Rust 编写,速度快,支持 .nvmrc自动切换,有 default别名)
- Volta(零配置,自动根据json切换版本,最适合团队)
两者都有 Windows 原生支持,而且命令更现代。
全局包的隔离与迁移(最容易懵的点)
每个 Node 版本有自己的全局包空间,这是很多人没意识到的:你用 nvm use 18时全局装的包,切到 nvm use 20后就看不到了。
nvm use 18 npm i -g yarn # 全局装到 v18 的目录下 nvm use 20 yarn --version # 报错:'yarn' 不是内部或外部命令
解决方案
方案 A:每个版本单独装全局包(最干净)
nvm use 18 npm i -g yarn typescript nvm use 20 npm i -g yarn typescript
方案 B:用 corepack(Node 16.10+ 内置,推荐)
corepack enable corepack prepare yarn@stable --activate
这样 yarn/pnpm 就不需要全局装了,每个版本都能用。
迁移全局包的最佳实践
如果你换了主版本(比如从 18 升到 20),想要迁移全局包:
# 1. 在旧版本导出清单 nvm use 18 npm ls -g --depth=0 > global-packages.txt # 2. 切到新版本 nvm use 20 # 3. 逐个安装(不要一次性全部装,有些可能在新版本不兼容) # 打开 global-packages.txt,挑必要的装 npm i -g yarn
项目级版本锁定(.nvmrc文件)
场景:你有一个项目需要在 Node 18 下运行,另一个项目需要 Node 20。每次 cd 进去都要手动 nvm use太麻烦。
解决方案:.nvmrc文件
在项目根目录创建一个名为 .nvmrc的文件,内容只写版本号:18.19.0
或者宽松写法:18(表示 “>=18.0.0 <19.0.0” 范围内的任意版本)
如何使用
进入项目目录后,手动执行:nvm use(不带参数,nvm 会自动读取 .nvmrc)



