同时维护几个前端项目的人,大概率都碰过 nodejs 版本不一致的麻烦:老后台依赖旧版 Node,新项目又要求新版 Node,手动改环境变量改到怀疑人生。这时候要么同时安装多个 nodejs 版本并按需切换,要么直接用 nvm 做版本管理。两种思路都能解决版本切换,但安装细节、目录规划、全局包处理和踩坑点完全不同。手动多版本方案适合不想引入额外工具、需要离线或权限受限的场景;nvm 方案更适合日常在多个项目间来回跳的人,一条命令就能切版本,npm 全局包也跟着版本走,省心很多。下面我按“先讲清楚为什么,再分别拆两个方法,最后把常见报错和实操心得一次性讲透”的顺序展开,尽量让刚装 Node 的人也能照着做,也让已经用 nvm 的人能补上几个容易忽略的细节。
1. 先把需求拆开:为什么要同时安装多个 Node.js 版本
1.1 项目依赖差异与版本锁定
Node.js 生态最让人头疼的一点,是不同项目对运行时的要求经常互相冲突。新项目用 Vite、Next.js、NestJS,通常要求 Node 18 或 20 以上;而一些维护了三四年的后台管理系统,依赖node-sass、老版本webpack、旧版vue-cli,在 Node 16 甚至 Node 14 上才跑得顺。你如果强行用新版 Node 去装旧依赖,轻则npm install报错,重则原生模块编译失败,折腾半天还不一定能跑起来。
更麻烦的是,很多项目只在package.json里写了engines字段,比如"node": ">=14 <17",但 npm 默认只给警告,不会强制拦住你。于是就会出现“安装成功、启动报错”的迷惑现场。要彻底规避这类问题,最直接的办法就是让机器上同时存在多个 Node.js 版本,每个项目用对应版本运行。版本管理不是洁癖,而是减少无效排查时间的基础设施。
1.2 全局工具与原生模块的兼容性
除了项目依赖,全局命令行工具也会受 Node 版本影响。比如你全局装了pnpm、yarn、typescript、nodemon、serve,这些包本质上都跑在某个 Node 版本下。你从 Node 18 切到 Node 20 后,全局命令可能还在,但执行时用的是新 Node 去加载旧包,偶尔就会遇到MODULE_NOT_FOUND、NODE_MODULE_VERSION不匹配之类的报错。
原生模块更明显。bcrypt、sharp、canvas、sqlite3这类包在安装时会根据当前 Node 的 ABI 版本编译二进制。你在 Node 18 下编译好,切到 Node 20 后不一定能直接复用。所以多版本管理不只是“切 node.exe”,还要考虑 npm 全局目录、原生模块缓存、命令行工具入口是否隔离。nvm 方案之所以受欢迎,就是因为它把每个 Node 版本的全局目录也分开了,切换后各用各的,不容易串味。
1.3 两种方案怎么选:手动多目录 vs nvm
手动多版本的本质是:把不同 Node 版本解压到不同目录,通过环境变量PATH或自定义NODE_HOME决定当前用哪一个。它的优点是依赖少、可控、适合离线机器和权限受限的电脑;缺点是切换麻烦,全局包隔离弱,PATH 容易越配越乱。
nvm 的本质是:用一个管理工具把多个 Node 版本统一放在自己的目录里,再通过符号链接或路径映射把“当前版本”暴露给系统。它的优点是切换快、版本隔离清楚、全局包跟着版本走;缺点是需要先清理旧 Node,安装时可能涉及管理员权限,Windows 上还容易遇到符号链接和 PowerShell 执行策略问题。
| 对比项 | 手动多目录方案 | nvm 方案 |
|---|---|---|
| 额外工具 | 不需要 | 需要 nvm-windows |
| 切换速度 | 改环境变量或脚本,较慢 | nvm use一条命令 |
| 版本隔离 | 目录隔离,全局包容易共享 | 版本目录隔离,全局包各自独立 |
| 安装难度 | 低,但 PATH 容易配乱 | 中等,需清理旧 Node |
| 适合场景 | 离线、权限受限、临时测试 | 日常多项目、长期维护 |
| 常见坑 | PATH 顺序、全局包冲突 | 权限、符号链接、执行策略 |
提示:不管你选哪种方案,都建议先想清楚“当前默认版本”和“项目专用版本”的关系。默认版本用来跑日常命令,项目专用版本用脚本或 nvm 临时切换,不要把所有项目都绑死在同一个版本上。
2. 方法一:手动安装多个 Node.js 版本并自由切换
2.1 下载与目录规划:让多个版本互不打架
手动方案我强烈建议用免安装 zip 包,而不是反复运行 MSI 安装程序。原因很简单:MSI 安装程序默认会写系统 PATH,还会创建快捷方式、注册卸载信息。你装第二个版本时,它可能覆盖第一个版本的 PATH,或者两个版本都往 PATH 里塞路径,最后node -v指向谁全看运气。zip 包解压即用,目录独立,删起来也干净。
目录规划建议统一放在一个父目录下,比如:
D:\dev\node\ v18.20.4\ v20.12.2\ global\ v18\ v20\版本目录不要有中文、空格和特殊符号。虽然 Node 本身能处理一部分空格路径,但 npm 脚本、原生模块编译、旧工具链对空格路径的支持参差不齐,能避就避。把v18.20.4、v20.12.2这种带完整版本号的目录名作为解压目标,后面切换时一眼就能看出用的是哪个版本。全局包目录也建议单独放,避免不同 Node 版本共用同一批全局包。
2.2 安装第一个版本与基础环境变量配置
先下载 Node 的 Windows 64 位 zip 包,解压到D:\dev\node\v20.12.2。解压后你应该能看到node.exe、npm、npx、corepack等文件。接着配置用户环境变量:
- 新建
NODE_HOME,值为D:\dev\node\v20.12.2。 - 编辑
Path,加入%NODE_HOME%。 - 再加入全局包目录,比如
D:\dev\node\global\v20,如果你打算按版本隔离全局包。 - 保存后重新打开终端。
验证命令:
node -v npm -v where.exe node npm config get prefixwhere.exe node很关键,它会列出当前 PATH 里所有能找到的node.exe。如果只出现一条指向D:\dev\node\v20.12.2\node.exe,说明配置正确;如果出现C:\Program Files\nodejs\node.exe,说明旧安装残留还在,后面切换一定出问题。
2.3 安装第二个版本:选择不同路径与跳过快捷方式
把第二个版本解压到D:\dev\node\v18.20.4。此时不要急着改 PATH,先用绝对路径验证它能跑:
D:\dev\node\v18.20.4\node.exe -v D:\dev\node\v18.20.4\npm.cmd -v如果这里能正常输出版本号,说明文件本身没问题。注意在 PowerShell 里直接敲npm可能调用的是npm.ps1,而绝对路径下用npm.cmd更接近命令行环境。两个版本都验证通过后,再考虑切换逻辑。
为什么不建议两个版本都用 MSI 安装到默认目录?因为默认目录会固定成C:\Program Files\nodejs,第二个安装程序会覆盖第一个,或者提示已存在。即使你手动改安装路径,MSI 也可能往注册表和 PATH 里写东西。zip 方案没有这些问题,代价只是需要自己配环境变量。
2.4 通过环境变量切换版本的完整步骤
手动切换的核心就是改NODE_HOME,并确保 PATH 里引用的是%NODE_HOME%,而不是写死的版本路径。图形界面操作是:系统属性 → 高级 → 环境变量 → 编辑用户变量NODE_HOME→ 改成D:\dev\node\v18.20.4→ 确定 → 重新打开终端。
命令行可以用setx:
setx NODE_HOME "D:\dev\node\v18.20.4"注意:
setx写入的是长期环境变量,但当前终端不会立刻生效。你必须关掉终端重新开一个,或者在当前窗口临时覆盖:
$env:NODE_HOME = "D:\dev\node\v18.20.4" $env:Path = "$env:NODE_HOME;" + (($env:Path -split ';' | Where-Object { $_ -notmatch 'nodejs|dev\\node\\v' }) -join ';') node -v这段 PowerShell 的做法是:先把NODE_HOME指到目标版本,再把 PATH 里旧的 Node 路径过滤掉,重新拼成新的 PATH。这样当前窗口立刻生效,不需要重启。但它只对当前窗口有效,关了窗口还是以长期环境变量为准。如果你觉得每次敲这么长太麻烦,可以封装成switch-node.ps1,参数传18或20,内部自动改用户环境变量并刷新当前会话。
2.5 手动切换的脚本化与快捷方式
我常用的做法是写两个批处理文件放在桌面或工具目录:
@echo off set NODE_HOME=D:\dev\node\v18.20.4 set PATH=%NODE_HOME%;%PATH% echo 当前 Node 版本: node -v cmd /k另一个把18.20.4换成20.12.2。双击后会在新命令行窗口里临时切到对应版本,cmd /k让窗口保留,方便继续执行命令。这个方案不修改系统环境变量,适合临时跑旧项目、临时测试某个包。缺点是每个窗口都要手动开,不能全局影响其他终端。
如果你希望双击后永久改默认版本,就在 bat 里加setx NODE_HOME "D:\dev\node\v18.20.4",但记得提醒自己:setx有长度限制,PATH 太长时可能截断。更稳妥的方式是用 PowerShell 操作[Environment]::SetEnvironmentVariable,并在脚本里做去重和备份。
2.6 手动方案的核心注意点与坑
第一,PATH 里只保留%NODE_HOME%,不要同时写多个版本目录。很多人的问题不是没配环境变量,而是 PATH 里既有D:\dev\node\v20.12.2,又有%NODE_HOME%,结果系统永远优先命中写死的旧路径。
第二,全局包目录要提前规划。Windows 下 npm 全局包默认在%AppData%\npm,多个 Node 版本共用这个目录时,命令行入口会共享,但包内部的二进制可能不兼容。你可以给每个版本设置独立 prefix:
npm config set prefix "D:\dev\node\global\v18"切换版本后,再执行对应版本的npm config set prefix。但这样管理成本高,适合对隔离要求很严的人。普通使用可以接受共享,遇到原生模块问题再重装。
第三,卸载或迁移时清理环境变量。删除NODE_HOME、PATH 里的旧 Node 路径、%AppData%\npm下的残留命令,以及C:\Program Files\nodejs。不清干净,后面装 nvm 也会被旧路径干扰。
3. 方法二:用 nvm-windows 管理 Node.js 版本
3.1 nvm-windows 与 nvm 的区别及安装前清理
nvm 原本是 macOS/Linux 上的 Node Version Manager,Windows 上对应的常用实现是 nvm-windows。它不是简单移植,而是用 Go 写的独立工具,命令接近但细节有差异。nvm-windows 会把每个 Node 版本下载到自己的根目录,例如D:\dev\nvm\v20.12.2,然后把一个符号链接目录D:\dev\nodejs指向当前版本。PATH 里只需要放这个符号链接目录,切换时改链接目标即可。
安装 nvm-windows 前,先清理已有 Node.js。控制面板卸载官方 Node,删除C:\Program Files\nodejs残留目录,检查用户和系统 PATH 里所有nodejs路径。如果你之前用过手动多版本方案,也要删掉NODE_HOME和手动加的版本路径。为什么不建议和已有 Node 共存?因为 nvm-windows 也会往 PATH 里写自己的路径,旧 Node 路径如果排在前面,node -v就会指向旧版本,nvm 切了也没用。
%AppData%\npm目录可以保留也可以删除。保留的话,里面旧的全局命令可能还会在 PATH 里生效;删除更干净,但之前全局装的工具要重装。我的建议是先备份npm ls -g --depth=0的输出,再清理,后面按需重装。
3.2 nvm 安装详细步骤与镜像加速
下载 nvm-windows 的nvm-setup.exe或 zip 包。安装时它会问两个路径:
NVM_HOME:nvm 自己的安装目录,建议D:\dev\nvm。NVM_SYMLINK:当前 Node 的符号链接目录,建议D:\dev\nodejs。
两个路径都尽量避开中文和空格。安装完成后,打开D:\dev\nvm\settings.txt,写入或修改以下内容:
root: D:\dev\nvm path: D:\dev\nodejs node_mirror: https://npmmirror.com/mirrors/node/ npm_mirror: https://npmmirror.com/mirrors/npm/这里配置镜像地址是为了让 Node 和 npm 包下载更顺畅,减少超时和中断。改完保存,重新打开管理员终端,执行:
nvm version nvm root能看到版本号和根目录就说明安装成功。如果nvm命令找不到,检查 PATH 里是否有%NVM_HOME%和%NVM_SYMLINK%,然后重开终端。
3.3 nvm 常用命令:安装、切换、别名、卸载
先查看可用版本:
nvm list available安装两个常用 LTS 版本:
nvm install 20.12.2 nvm install 18.20.4查看已安装版本:
nvm list切换版本:
nvm use 20.12.2 node -v npm -v给常用版本建别名:
nvm alias default 20.12.2 nvm use default卸载某个版本:
nvm uninstall 18.20.4注意:
nvm use在 Windows 上经常需要管理员权限,因为它要修改符号链接。如果普通终端报错,换成管理员 PowerShell 再执行。切换成功后,node -v和npm -v应该立刻变成目标版本。
nvm-windows 的全局包是按版本隔离的。你在 Node 20 下执行npm i -g pnpm,切到 Node 18 后pnpm命令可能就没了,需要重新安装。这不是 bug,而是隔离带来的副作用。好处是原生模块不会串版本,坏处是每个版本都要维护一遍全局工具。
3.4 全局包与 Node 版本绑定关系处理
我习惯在每个常用 Node 版本下装同一套基础全局包:pnpm、yarn、typescript、nodemon、serve。安装命令:
npm install -g pnpm yarn typescript nodemon serve装完导出清单,方便以后对照:
npm ls -g --depth=0如果你用corepack,可以在每个版本下执行:
corepack enable corepack prepare pnpm@latest --activatecorepack会随 Node 一起提供,能减少手动全局安装的步骤。但不同 Node 版本自带的 corepack 版本不同,激活的 pnpm 版本也可能不同。团队协作时,最好在项目里固定packageManager字段,例如:
{ "packageManager": "pnpm@9.0.0" }这样别人用 corepack 时会自动使用指定包管理器版本,减少“我这能跑,你那跑不了”的问题。
3.5 nvm 切换后 npm 报错的经典排查
nvm 切完后最常见的报错是 PowerShell 执行策略拦截npm.ps1,完整报错类似:
npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本这通常不是 Node 装坏了,而是 PowerShell 默认执行策略不允许运行脚本。解决办法在后面的常见问题里详细讲。另一个常见问题是nvm use成功但node -v没变,多半是 PATH 里旧 Node 路径排在前面,或者切换终端没刷新。用where.exe node看命中顺序,把旧路径删掉。
还有一种情况是 nvm 安装 Node 成功,但npm命令不可用。可能是下载的 npm 包不完整,或者镜像地址返回异常。重新执行nvm uninstall再nvm install,或者手动清理%NVM_HOME%\v20.12.2后重装。
3.6 nvm 在多项目中的实战工作流
我的日常工作流是这样的:默认nvm use 20.12.2,保证新项目、脚手架、全局工具都用新版本;进入老项目目录后,先看package.json的engines或项目根目录的.nvmrc,然后执行对应版本切换。如果项目有.nvmrc,可以写一个小脚本:
$version = (Get-Content .nvmrc -Raw).Trim() nvm use $version node -vnvm-windows 本身不会自动读取.nvmrc,所以脚本或手动切换更可靠。切换后第一件事是node -v,第二件事是npm -v,第三件事是npm ls -g --depth=0确认全局工具是否可用。如果这个项目需要pnpm,而当前版本没装,就补装一次。多项目之间切换时,不要嫌这一步麻烦,它比事后排查原生模块崩溃快得多。
4. 两个方法的关键参数、目录与命令速查
4.1 环境变量与目录对照表
| 项目 | 手动多目录方案 | nvm 方案 |
|---|---|---|
| Node 安装位置 | D:\dev\node\v20.12.2 | D:\dev\nvm\v20.12.2 |
| 当前版本入口 | NODE_HOME指向版本目录 | NVM_SYMLINK指向符号链接目录 |
| PATH 关键项 | %NODE_HOME% | %NVM_HOME%、%NVM_SYMLINK% |
| 全局包目录 | 可配置为D:\dev\node\global\v20 | 随版本目录隔离 |
| 切换方式 | 改NODE_HOME或脚本临时改 PATH | nvm use 20.12.2 |
| 常用配置文件 | 系统环境变量 | D:\dev\nvm\settings.txt |
4.2 常用命令速查表
| 目的 | 手动方案 | nvm 方案 |
|---|---|---|
| 查看当前版本 | node -v | node -v |
| 查看 node 路径 | where.exe node | where.exe node |
| 切换版本 | setx NODE_HOME "D:\dev\node\v18.20.4" | nvm use 18.20.4 |
| 查看已装版本 | 看目录列表 | nvm list |
| 安装版本 | 解压 zip 到新目录 | nvm install 18.20.4 |
| 卸载版本 | 删除目录并清 PATH | nvm uninstall 18.20.4 |
| 设置别名 | 无 | nvm alias default 20.12.2 |
| 查看全局包 | npm ls -g --depth=0 | npm ls -g --depth=0 |
4.3 版本切换后的验证清单
每次切换后,按这个清单走一遍,能省掉大量“为什么启动不了”的排查:
node -v是否为目标版本。npm -v是否正常输出版本号。where.exe node第一条是否指向当前版本入口。npm config get prefix是否指向预期全局目录。npm ls -g --depth=0是否有项目需要的全局工具。- 进入项目执行
npm install或pnpm install是否正常。 - 运行
npm run dev或构建命令,看是否有原生模块 ABI 报错。
如果第 3 步出现多个路径,优先解决 PATH 顺序。不要带着多个 Node 路径继续跑项目,问题只会延后爆发。
5. 常见问题与排查技巧实录
5.1 npm : 无法加载文件 npm.ps1,因为在此系统上禁止运行脚本
这是 Windows 上最高频的 Node 报错之一,路径可能是c:\program files\nodejs\npm.ps1,也可能是d:\program files\nodejs\npm.ps1。原因不是 npm 坏了,而是 PowerShell 执行策略默认是Restricted,不允许运行.ps1脚本。你敲npm时,PowerShell 优先找npm.ps1,于是被拦下。
先查看当前策略:
Get-ExecutionPolicy -List如果CurrentUser或LocalMachine是Restricted,可以在当前用户范围放开:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser执行后会提示确认,输入Y回车。然后重开终端,再试npm -v。如果公司电脑有统一策略,改了又会被重置,那就在 cmd 里执行命令,或者显式使用npm.cmd install。在 cmd 中不会加载npm.ps1,所以不会触发这个执行策略问题。另一个临时办法是Unblock-File,但它只对单个文件有效,不如调执行策略直接。
注意:不要把执行策略改成
Unrestricted,RemoteSigned已经足够日常使用。它允许本地脚本运行,同时要求远程下载的脚本带签名,安全边界更清楚。
5.2 切换后 node -v 没变或仍指向旧版本
这种情况先看where.exe node。如果输出多条,说明 PATH 里有多个 Node 入口。按照顺序,最上面的会被优先使用。你要把旧版本路径、C:\Program Files\nodejs、手动写死的版本目录全部删掉,只保留 nvm 的符号链接目录或手动方案的%NODE_HOME%。
第二个原因是终端没刷新。环境变量修改后,已经打开的终端、编辑器内置终端、IDE 里的终端都可能还拿着旧 PATH。关掉重开,或者重启 IDE。VS Code 的集成终端尤其容易这样,改完环境变量后最好完全退出 VS Code 再打开。
第三个原因是 nvm 符号链接没有切成功。用管理员终端执行nvm use,看是否有权限报错。如果符号链接目录被别的进程占用,也可能失败。关闭正在运行的 Node 进程、编辑器、终端,再切换。
5.3 nvm use 权限不足、乱码、下载失败
nvm use需要修改NVM_SYMLINK指向,普通用户权限有时不够。最直接的办法是用管理员身份打开 PowerShell 或 cmd。如果报乱码,通常是终端编码问题,执行:
chcp 65001然后重试。下载失败优先检查settings.txt里的镜像地址是否正确,保存后重开终端。如果某个版本一直下不下来,可以换一个具体版本号,不要反复重试同一个包。
安装路径也值得检查。NVM_HOME和NVM_SYMLINK如果包含中文、空格或特殊符号,可能在某些旧版本 nvm-windows 上出现奇怪问题。虽然新版本改善了很多,但开发环境用纯英文无空格路径最省心。
5.4 全局安装的 pnpm/yarn 消失或命令找不到
用 nvm 切换版本后,之前版本的全局包不会自动跟过来。因为全局包安装在各自版本目录下,切到新版本后,pnpm、yarn命令自然找不到。解决办法不是修 PATH,而是重新安装:
npm install -g pnpm yarn如果你经常在多个版本间切换,建议维护一个global-packages.txt:
pnpm yarn typescript nodemon serve然后写一个安装脚本,在每个版本下跑一遍:
Get-Content .\global-packages.txt | ForEach-Object { npm install -g $_ }手动方案如果共享%AppData%\npm,命令可能还在,但执行时可能因为原生模块 ABI 不匹配报错。遇到这种情况,先确认当前 Node 版本,再重新安装出问题的全局包。
5.5 node-sass/node-gyp 等原生模块编译失败
这类问题通常不是 Node 版本管理本身,而是某个版本和原生模块不匹配。比如node-sass对 Node 版本非常敏感,Node 18 下可能需要node-sass@8以上,老项目却锁在node-sass@4,那就只能切回 Node 14 或 16。先查项目文档或package-lock.json,再决定切哪个版本。
如果必须在新 Node 上编译,Windows 还需要 Python 和 C++ 构建工具。安装windows-build-tools已经过时,更推荐手动装 Visual Studio Build Tools 的 C++ 工作负载和 Python 3。然后配置:
npm config set python python3 npm config set msvs_version 2022但我要说句实话:老项目能切旧 Node 就切旧 Node,不要硬在新版本上编译旧原生模块。版本管理工具就是用来省这个时间的。
5.6 PATH 污染与卸载残留
环境变量一旦被多个安装程序改过,很容易留下垃圾路径。排查时在 PowerShell 里执行:
$env:Path -split ';' | Where-Object { $_ -match 'node|npm|nvm' }把输出里不再使用的路径删掉。重点检查:
C:\Program Files\nodejsC:\Users\你的用户名\AppData\Roaming\npm- 手动解压的旧版本目录
- nvm 的
NVM_HOME和NVM_SYMLINK
卸载 Node 后,如果node -v还能输出,一定是 PATH 或某个目录残留。用where.exe node反查位置,删目录、清 PATH、重开终端。不要小看残留,它会让 nvm 切换看起来“失效”,实际是旧版本一直在抢优先级。
6. 实操心得:我如何给团队定一套轻量规范
6.1 项目里加 .nvmrc 和 engines
团队协作最怕“我这里能跑,你那里报错”。我的做法是每个前端项目根目录都放一个.nvmrc,内容写主版本号或完整版本号:
18.20.4同时在package.json里写:
{ "engines": { "node": ">=18.20.0 <21" } }如果想让版本不满足时直接报错,可以在项目.npmrc里加:
engine-strict=true这样新人克隆项目后,npm install会先检查 Node 版本,不满足就明确报错,比装到一半失败更容易定位。.nvmrc不是万能的,nvm-windows 不会自动读取,但至少给人一个明确提示,配合脚本也能一键切换。
6.2 新机器初始化流程
我现在给新 Windows 机器配 Node 环境,基本固定这套流程:
- 卸载系统里已有的 Node.js,清理 PATH 残留。
- 安装 nvm-windows 到
D:\dev\nvm,符号链接目录设为D:\dev\nodejs。 - 修改
settings.txt,配置 Node 和 npm 镜像。 - 管理员终端执行
nvm install 20.12.2、nvm install 18.20.4。 nvm alias default 20.12.2,然后nvm use default。- 在每个版本下安装团队统一全局包,例如
pnpm、typescript、nodemon。 - 解决 PowerShell 执行策略,确保
npm -v正常。 - 用
where.exe node、node -v、npm ls -g --depth=0做最终检查。
这套流程跑下来大概十几分钟,后面半年都省心。手动方案也可以用于临时机器,但日常多项目我还是更推荐 nvm,因为切换成本低,版本隔离清楚。
6.3 什么时候不需要 nvm
如果你只维护一个项目,而且团队用 Docker 或 CI 固定了 Node 版本,本地不一定需要 nvm。比如项目提供Dockerfile,本地只负责写代码,构建和运行都在容器里,那直接用官方安装包装一个匹配版本就够了。再比如某些权限很严的电脑,不允许安装额外工具,也不允许改符号链接,那就用手动 zip 方案,配好NODE_HOME,写两个切换脚本,也能满足基本需求。
工具是拿来解决问题的,不是拿来增加负担的。nvm 的优势在多版本、多项目、频繁切换;手动方案的优势在简单、可控、依赖少。你可以先用手动方案理解 PATH 和版本目录的关系,再上 nvm,后面遇到切换问题就不会一头雾水。
最后分享一个我踩过几次坑之后养成的习惯:每次切换 Node 版本后,不要只看node -v,一定顺手执行where.exe node和npm -v。这两个命令能在十秒内告诉你当前到底用的是哪个版本、PATH 有没有冲突、npm 是否被执行策略拦住。很多看似复杂的构建失败,根源就是切了版本但终端实际没切过去。把验证动作固定成肌肉记忆,比收藏一堆排查文章有用得多。