器→工具, 工具软件

Node.Js 版本管理工具nvm-windows

钱魏Way · · 1 次浏览

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)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注