
1. 为什么要用 nvmNode 版本分裂下的刚需如果你是个天天跟前端、脚手架、后端工具链打交道的人迟早会撞上这样一个场景公司老项目用的是 Node 14本地新项目却要求 Node 18 起步或者你今天要跑一个依赖node-sass的旧构建流程明天要开一个新框架的工程化环境。装高版本老项目跑不起来装低版本新项目直接报语法错误。这时候如果你还在用官网下载安装包的方式管理 Node.js那你大概率已经经历过反复卸载、重装、清注册表、改环境变量这一整套折磨。nvmNode Version Manager就是解决这个问题的标准答案。它的核心能力很简单在同一台 Windows 机器上安装多个 Node.js 版本随时切换当前生效的版本切换对终端、IDE、脚本完全透明。你不需要卸载任何东西不需要手工改 PATH不需要担心系统残留。说句实在话在 Windows 上折腾 Node 环境nvm几乎是必备的第一件工具。尤其对于需要同时维护多个项目的开发者来说这不是锦上添花而是没有它工作流就是断的。如果你是刚开始学 Node.js 的新手也建议直接从 nvm 入手一步到位别先去官网下安装包——因为等你装了第二个 Node 版本需求时返工成本远高于一开始就配好 nvm。不过这里得先澄清一个关键概念Node.js 官方社区最常用的nvm脚本也就是 GitHub 上nvm-sh/nvm那个项目是为 Linux 和 macOS 设计的它本质是一段 Bash 脚本Windows 上跑不了。Windows 下我们用的是另一个项目叫nvm-windows由 Corey Butler 维护GitHub 地址是coreybutler/nvm-windows。这个区别很重要——我见过太多人照着nvm-sh/nvm的文档在 Windows 上折腾最后发现命令全对不上其实就是装错物种了。后面文章里所有命令和环境配置全部基于 nvm-windows。2. 安装前必须想清楚的三件事安装 nvm 本身不难真正让大多数人翻车的是安装前没想清楚这三件事后面一步步踩坑。我按顺序说。2.1 选择正确的发行版与版本号先到coreybutler/nvm-windows的 Release 页面找安装包。正常情况下你会看到这些文件nvm-setup.exe图形化安装向导适合大多数用户。nvm-noinstall.zip绿色解压版解压后手动配环境变量适合想完全掌控配置的人。nvm-setup.tar.gz源码包一般用不到。我建议绝大多数人选nvm-setup.exe。至于版本选标了Latest的那个即可。目前 nvm-windows 的发布节奏相对稳定尽量别用太老的 release因为更早版本对 Node 20 的支持、对 Windows 11 的兼容性都有问题没必要给自己找麻烦。这里有一个容易被忽略的细节你在命令行里敲nvm version看到的版本号和 GitHub Release 页面的版本号对应。装完确认一下如果不一致大概率是环境变量指向了旧路径。2.2 已经装了 Node.js先卸载再装如果你电脑上已经装有 Node.js我非常认真地建议先把已安装的 Node.js 卸载干净再装 nvm。为什么因为 nvm-windows 管理 Node 版本的方式是在系统里创建一个符号链接符号链接这个概念下面会细说指向你当前启用的那个 Node 版本目录。而这个符号链接的路径默认是C:\Program Files\nodejs——这和官网安装包默认安装路径完全相同。如果已有的 Node 实体目录占着这个位置nvm 创建链接时会冲突或产生诡异行为比如切换版本后node -v还是老版本或者 npm 命令从这个目录里找到的是已卸载的残留。卸载时不要只删安装目录建议做完整清理在控制面板 → 程序和功能里卸载 Node.js。删除残留目录C:\Program Files\nodejs、C:\Users\你的用户名\AppData\Roaming\npm、C:\Users\你的用户名\AppData\Local\pnpm如果存在。检查环境变量清理 PATH 里指向上述目录的条目。如果之前用 npm 全局装过很多包先跑一句npm ls -g --depth0把全局包列表导出来存好后面 nvm 装好新 Node 之后可以照着装回去。这一套做完再开始装 nvm能省掉后面一半的排错时间。2.3 设计安装路径避开空格、避开中文、避开默认用户目录nvm-windows 的安装向导会问你两个路径nvm 安装目录存放 nvm 自身和所有 Node 版本实际文件的目录。Node.js 符号链接目录也就是当前生效的 Node在系统中的暴露位置。第一个路径我推荐直接填C:\nvm不要用默认的C:\Users\你的用户名\AppData\Roaming\nvm。原因是默认路径藏在用户目录里路径长不说有些工具链对含空格的路径处理不友好而且重装系统、切换用户时容易出幺蛾子。逻辑上nvm 和它管理的一堆 Node 版本属于开发工具链放一个独立、简短、纯英文的根目录最干净。第二个路径保持默认C:\Program Files\nodejs就行。这个目录最终只是一个符号链接不是真实文件所在位置所以不用担心放 Program Files 会有权限问题——日常使用中 nvm use 切换时会自动处理目录连接不需要你手工去改这个目录的东西。另外强烈建议安装路径中绝对不要出现中文和空格。虽然 nvm-windows 对中文路径的兼容性比早年好了很多但 Node 生态里大量原生模块在编译时会拿不到正确的路径一旦碰上中文路径就报错。这种问题排查起来极其痛苦谁踩谁知道。3. 安装步骤与初始化验证想清楚上面三件事之后安装过程其实就非常顺了。我给你完整走一遍。3.1 用 nvm-setup.exe 完成基础安装双击下载好的nvm-setup.exe安装向导会先让你选 nvm 安装目录我填的是C:\nvm再让你选符号链接目录保持默认C:\Program Files\nodejs之后一路 Next 即可。安装完成时向导可能会提示你nvm 安装成功并建议重启终端。这里有一个很多人会忽略的点安装完成后必须关闭所有已打开的终端窗口再重新打开一个新终端。因为安装程序会修改系统环境变量添加 NVM_HOME、NVM_SYMLINK并把C:\nvm和C:\Program Files\nodejs加进 PATH而已经打开的命令行窗口不会自动刷新环境变量你在旧窗口里敲nvm大概率会得到不是内部或外部命令的提示。这不是没装好只是没刷新环境。打开新终端输入nvm version如果正常输出类似1.1.12的版本号说明 nvm 本体装好了。3.2 检查 settings.txt 与环境变量安装完成后C:\nvm目录下会生成一个settings.txt文件内容大致如下root: C:\nvm path: C:\Program Files\nodejs arch: x64 proxy: nonerootnvm 安装目录。path符号链接目录。arch架构默认 x64如果你的机器是 32 位系统或者特殊场景需要 32 位 Node可以改成 x86。proxy代理设置公司网络环境如果需要走代理才能下载 Node这里可以填http://127.0.0.1:端口。同时到系统环境变量里确认一下NVM_HOME指向C:\nvmNVM_SYMLINK指向C:\Program Files\nodejsPATH 中包含%NVM_HOME%和%NVM_SYMLINK%这些细节平时不用管但一旦出现nvm 命令找不到或者node 命令找不到的问题第一站就是这里。3.3 安装第一个 Node 版本并验证nvm 装好之后先用这条命令看看远程仓库有哪些版本可供选择nvm list available输出会分几段显示包括当前 LTS 版本列表、最新版本列表等。如果你不想挑直接执行nvm install lts这会安装当前最新的 LTS长期支持版本。安装的过程本质上是 nvm 去 Node 官方或镜像站下载对应版本的 zip 包解压到C:\nvm\vXX.XX.XX目录下整个过程不需要管理员权限如果遇到权限问题用管理员身份打开终端再试一次。安装完成后启用这个版本nvm use lts然后验证node -v npm -v顺利的话两个命令都会输出对应的版本号说明你的 nvm 工作流已经跑通了。4. 日常版本管理安装、切换、默认版本nvm 装好只是第一步真正每天高频使用是下面这些操作。我把常用命令整理成一张速查表方便你贴在手边功能命令查看本机已安装版本nvm list查看可安装版本nvm list available安装指定版本nvm install 18.19.0安装最新 LTSnvm install lts安装最新版nvm install latest切换当前版本nvm use 18.19.0查看当前版本nvm current设置默认版本nvm alias default 18.19.0删除某个版本nvm uninstall 18.19.0切换 32/64 位nvm arch 644.1 精确选择版本而不是盲目 latest新手最容易犯的一个错误是什么版本都装 latest。但现实是很多企业级项目为了稳定会明确指定 Node 版本比如 package.json 的engines字段或者项目文档里写要求 Node 16.x。这时候你需要的是精确安装nvm install 16.20.2 nvm use 16.20.2一个实用技巧看到项目里有.nvmrc文件时这个文件就写着项目推荐使用的 Node 版本号。nvm-windows 虽然不像 Linux 版那样支持nvm use自动读取.nvmrc部分新版本已支持但你手动看一眼文件内容再按内容切换就能保证环境与项目要求一致。4.2 切换版本后终端里立刻生效nvm use 18.19.0这条命令是即时生效的。执行它之后你在同一个终端里敲node -v看到的立刻就是新版本。这是因为 nvm-windows 在切换时重新创建了C:\Program Files\nodejs这个符号链接把它指向C:\nvm\v18.19.0目录。当前终端的 PATH 里包含这个符号链接目录所以立即生效。这一点和 Linux/macOS 的 nvm 不太一样。在 Linux 上nvm 是通过修改 shell 的环境变量来切换的很多时候只在当前终端生效而 nvm-windows 直接操作符号链接所以理论上对所有新启动的进程都生效。不过为了保险起见切换版本后如果遇到 IDE 或终端工具不认新版本的情况重启一下那个工具就行——因为某些长时间运行的进程在启动时缓存了 PATH 和链接信息。4.3 设置默认版本避免每次开终端都没有 node如果你装了多个 Node 版本并且希望每次打开新终端自动使用某个版本一定要执行nvm alias default 18.19.0设置之后新终端默认就会启用这个版本。不设置的话新终端里node -v可能直接报找不到 node因为符号链接没有指向任何有效版本。这个坑我见过很多人踩明明 nvm list 里躺着好几个版本但打开新终端就是没有 node其实只是缺了 alias default 而已。4.4 删版本时的提醒nvm uninstall 18.19.0会直接删除C:\nvm\v18.19.0整个目录。如果你当前正在使用这个版本nvm 会拒绝删除或提示先切换。另外删除前确认一下这个版本是否被某个老项目的package-lock.json或node-sass之类的模块绑定因为原生模块针对特定 Node 版本编译后换版本往往需要重新编译删掉老版本等于彻底断了退路。5. 切换版本背后的机制符号链接与全局工具链很多人用 nvm 用了一两年都不一定清楚它底层到底做了什么。但理解这个机制对排查问题特别有帮助。5.1 符号链接nvm-windows 的核心机制Windows 上有一种叫目录联接junction的机制类似于 Linux 的符号链接。它长得很像一个文件夹但实际指向另一个位置。nvm-windows 的工作方式就是安装 Node 版本时把真实文件解压到C:\nvm\v18.19.0这样的独立目录中。在C:\Program Files\nodejs创建一个目录联接指向当前启用的版本目录。你的 PATH 里配置的是C:\Program Files\nodejs所以无论这个链接指向哪个版本终端里执行node都会解析到当前激活的版本。也就是说C:\Program Files\nodejs这个目录本身不是实体它是一个入口。当你执行nvm use 20.11.0时nvm 所做的就是删除旧联接、创建新联接指向C:\nvm\v20.11.0。这也是为什么安装 nvm 之前必须先卸载 Node.js 的原因——旧 Node 的实体目录占着C:\Program Files\nodejs链接根本创建不上去。5.2 为什么切换版本后npm 全局包消失了这是 nvm 用户最高频的疑问之一明明我在 Node 18 下全局装了nodemon切到 Node 20 之后nodemon命令怎么就找不到了答案还是和符号链接机制有关。npm 安装全局包时默认放在当前 Node 版本目录下的node_modules里具体路径是C:\nvm\v18.19.0\node_modules。你切到v20.11.0之后系统 PATH 里只有v20.11.0的路径当然找不到v18.19.0下装的全局包。所以记住这个事实nvm 切换的是 Node 版本同时也切换了一整套 npm 全局包环境。不同版本下的全局包是物理隔离的不存在一次安装处处可用。解决方案有三种切换版本后手动重装需要的全局包。可以提前存一份全局包清单脚本。尽量把工具型包改为项目的 devDependencies而不是全局安装。像 pnpm、yarn 这类包管理器可以通过 corepack 或特定配置实现跨版本复用下面会说。5.3 全局包清单一次记录快速恢复我自己的习惯是维护一份全局包备忘清单每当换电脑或切换新版本时装回来。生成当前全局包列表的命令npm ls -g --depth0拿到列表后把不需要随版本走的工具比如nodemon、rimraf、cross-env这类纯命令行工具做成一个批量安装命令npm install -g nodemon rimraf cross-env pm2实测下来与其折腾各种全局包同步方案不如这条朴素命令来得实在。毕竟需要全局装的包通常就那么七八个五分钟就装完了。6. 全局配置优化npm 镜像、全局工具链与 pnpm 的配合nvm 切换版本解决的是Node 版本共存问题但日常开发还有几个配套问题需要一起处理否则体验还是会打折扣。6.1 给 npm 换源解决下载慢和安装失败npm 默认的官方源在国外国内网络环境下安装依赖经常慢到崩溃甚至直接卡死。好在换源非常简单npm config set registry https://registry.npmmirror.com配置后可以执行npm config get registry确认。这个配置写在你用户目录下的.npmrc文件里Windows 路径是C:\Users\你的用户名\.npmrc。如果你有额外的私有 npm 源需求比如公司内部包可以在项目目录建一个.npmrc覆盖全局配置不影响其他项目。注意npm 源配置是对应当前用户的 npm 配置而不是绑定某个 Node 版本。所以 nvm 切换版本后这个配置依然有效不用重新设。6.2 corepack管理 pnpm 和 yarn 的推荐方式Node 从 16.9 版本开始内置了 corepack 工具它专门用来管理 pnpm 和 yarn。启用方式corepack enable启用之后你可以在项目里通过package.json的packageManager字段锁定包管理器版本corepack 会自动下载并使用对应版本。这样的好处是即使切换 Node 版本corepack 依然可用前提是 Node 版本不太老且包管理器的版本由项目决定不会出现A 项目要 pnpm 7、B 项目要 pnpm 9的冲突。这里有个要点如果你平时大量使用 pnpm安装方式建议是通过 corepack 管理而不是npm install -g pnpm。因为前者不依赖某个 Node 版本的全局目录配合 nvm 切换时不用反复重装。6.3 全局工具的跨版本复用思路很多 nvm 用户会问能不能让全局工具不跟随 Node 版本切换而失效如果你的全局工具密度很高比如装了十几个 CLI可以试试独立安装 手动加入 PATH的思路。比如把nodemon、eslint这类工具安装到一个固定目录然后把该目录加入系统 PATH与 nvm 管理的 Node 版本解耦。具体做法是npm install -g --prefix D:\global-tools nodemon eslint然后把D:\global-tools加入 PATH。这样无论 nvm 当前切到哪个 Node 版本这些工具都能被找到。代价是这些工具的 npm 依赖由固定目录管理和 Node 版本的隔离带来的是你需要手动处理它们的升级。不过说实话对于大多数开发者这个方案有点过度工程化了。全局工具真没那么多切完版本重装一遍也就几分钟反而更省心。6.4 手动补充缺失版本的 Node偶尔会遇到这种情况nvm list available里看不到你需要的版本比如一些发行版列表更新延迟或者你需要某个特定的 RC 版本。这时候可以手动下载 Node 官方提供的 Windows zip 包解压后把文件夹重命名为vXX.XX.XX放进C:\nvm目录然后重新打开终端执行nvm list。这个手动方法虽然略显粗暴但在应急场景特别管用。需要注意解压出来的文件夹名称必须严格符合v主版本.次版本.修订号的格式否则nvm list识别不出来。7. 避坑排错来自真实环境的完整排查链路工具用久了总会碰到各种看起来哪都没问题但就是跑不起来的诡异场景。我把这些年帮人排查 nvm 问题时最高频的几类问题连同排查链路一起放出来你按着顺序走一遍基本能解决九成问题。7.1 安装完成后nvm 命令提示找不到现象刚装完 nvm打开终端敲nvm提示不是内部或外部命令。排查链路确认是否在安装完成后新开的终端里执行命令。旧终端不会刷新环境变量这是最高频的原因。执行echo %NVM_HOME%如果输出为空说明环境变量没配上。打开系统属性 → 环境变量手动添加 NVM_HOME 指向C:\nvm并在 PATH 里加上%NVM_HOME%。检查C:\nvm目录下是否有nvm.exe。如果没有说明安装程序没把主程序放进去建议完全卸载后重装且安装时关闭所有可能在占用文件的应用。7.2 nvm use 显示成功但 node -v 还是旧版本现象执行nvm use 18.19.0后提示切换成功但紧跟着node -v输出的还是上一个版本。排查链路用where.exe node查看命令行实际解析到哪个路径。如果输出里出现了两个路径说明 PATH 里既有C:\Program Files\nodejs又残留着其他 Node 安装目录比如之前卸载没干净的C:\Program Files\nodejs实体目录或某些 IDE 自带的 Node。清理 PATH确保 Node 相关的路径只有%NVM_SYMLINK%和%NVM_HOME%。如果问题依旧检查C:\Program Files\nodejs这个目录是不是一个目录联接。用管理员权限打开 PowerShell 执行cmd /c dir /AL如果它显示的不是JUNCTION或SYMLINK说明有实体目录占着位置删掉后重新nvm use一次。7.3 某个 Node 版本装完npm 命令不可用现象nvm install 20.10.0成功node -v正常但npm -v报错或找不到 npm。排查链路检查C:\nvm\v20.10.0目录下是否存在npm.cmd和npx.cmd。npm 是随 Node 发行包一起发布的正常情况下必有。如果没有说明安装时下载的 zip 包损坏或不完整。执行nvm uninstall 20.10.0后重新安装。如果文件在但还是报错执行where.exe npm确认 npm 路径确实指向v20.10.0目录。如果指向了全局缓存或老版本路径清理环境变量中的相关项。7.4 原生模块编译失败node-sass、bcrypt、sharp 的经典兼容问题这是 nvm 多版本切换场景下最痛的一类问题。像node-sass、bcrypt、sharp这类包含 C/C 原生代码的 npm 包在安装时会针对当前 Node 版本进行编译。你切了 Node 版本后node_modules里那些编译好的二进制文件大概率不能用了表现就是运行时报错提示模块不是有效的二进制文件、或者 module version mismatch。解决思路很简单切换 Node 版本后删除项目里的 node_modules 并重新安装。对于 node-sass 这种老牌坑王还要注意它和 Node 版本的对应关系node-sass 版本支持的 Node 版本7.0.0Node 14/166.0.1Node 12/145.0.0Node 10/124.14.1Node 8/10如果你的项目还在用 node-sass我额外的建议是尽快迁移到sassdart-sass 实现省得每次切换版本都提心吊胆。当然迁移旧项目在真实工作中往往不是想迁就能迁的那就老老实实用 nvm 切回项目建时的 Node 版本然后npm rebuild或重装 node_modules。7.5 AI 开发工具安装失败一个典型的 nvm 应用场景近期有不少人遇到这类问题在 Windows 上安装某些 AI 编程辅助工具比如 Codex 的桌面端或 CLI安装过程中提示Node.js版本过低或安装无法完成甚至看到报错信息里出现了 nvm 目录下的某个 exe 路径。这类问题的本质是安装器检测或调用了系统里的 Node.js 版本而当前 nvm 激活的版本不满足要求或者符号链接指向的 npm 全局包路径与安装器预期不符。排查方式如下确认当前 Node 版本是否满足安装器要求不满足就nvm install 对应版本并nvm use。如果安装器报错信息里指向某个全局包比如claude.exe的路径里带了node_modules说明问题出在你之前用npm install -g装的全局 CLI 与当前 Node 版本不兼容。切到符合要求的 Node 版本后重装这个全局 CLI 即可。这种场景说白了还是多个 Node 版本并存环境下的经典问题——全局包是跟着版本走的。用 nvm 把版本切对很多安装器报错自然就消失了。7.6 网络代理与下载超时公司网络里如果走代理nvm install可能卡在下载阶段进度条一动不动。解决方法是修改C:\nvm\settings.txt在文件末尾加入proxy: http://你的代理地址:端口如果你没有代理但下载 Node 发行包仍然极慢可以把settings.txt里的 Node 下载地址改成镜像源。具体来说编辑settings.txt加入node_mirror: https://npmmirror.com/mirrors/node/这样 nvm 会从国内镜像拉取 Node 发行包速度提升非常明显。注意node_mirror只在修改后新执行的nvm install中生效已经下载过的版本不受影响。最后再分享一个小技巧如果你经常需要在不同 Node 版本之间切换并且每切一次就要重新配 npm 镜像或全局包建议把下面这段命令存成一个.bat或 PowerShell 脚本一键完成切换后的初始化nvm use %1 npm config set registry https://registry.npmmirror.com corepack enable比如你想切到 Node 18 并完成基础配置就执行init-node-env 18.19.0实际用下来这个习惯帮我省了不少重复劳动。nvm 本身只负责切版本把切换后的环境初始化也顺手做掉整个工作流才算闭环。