[Node.js] 解決 nvm for Windows(nvm4w)「nvm use」切換版本沒反應的問題

問題描述

在 Windows 上使用 nvm for Windows(nvm4w) 管理多個 Node.js 版本時,執行切換版本的指令:

nvm use 20.20.2

指令執行後沒有任何反應、也不會報錯,但用 node -v 確認時,版本號卻完全沒有改變,實際上還是停留在切換前的版本。反覆重試、重開終端機都沒用。

原因分析

nvm4w 管理多版本 Node.js 的方式,是在一個固定路徑(預設為 C:\nvm4w\nodejs) 建立一個目錄連結(junction),指向實際安裝的某個版本資料夾,例如 ...\nvm\v20.20.2。 這條連結才是系統 PATH 實際指向的位置,所以只要連結指到哪個版本,node -v 就會回報哪個版本。

問題就出在這裡:nvm use 內部理應要先移除舊的 junction、再建立新的 junction 指向目標版本,但實際測試下來這個「移除舊連結 → 重建新連結」的動作偶爾會失效,導致連結沒有被更新——指令本身不報錯,版本卻沒有真正切換。

解決辦法:手動控制切換

既然問題出在 nvm use 內部重建連結的邏輯不可靠,那就繞過它,改成自己寫一支批次檔,直接用 rmdir 刪掉舊 junction,再用 mklink /J 重新建立一次,確保連結一定會指向正確版本。

把下面這支腳本存成 %USERPROFILE%\.local\bin\nvmuse.cmd%USERPROFILE% 是 Windows 的環境變數,會自動代入目前登入的使用者資料夾路徑,不需要自己改成固定的使用者名稱):

@echo off
setlocal enabledelayedexpansion

set "NVM_ROOT=%USERPROFILE%\AppData\Local\nvm"
set "NVM_LINK=C:\nvm4w\nodejs"

if "%~1"=="" (
    echo Usage: nvmuse ^<version^>   e.g. nvmuse 20.20.2
    exit /b 1
)

set "VER=%~1"
set "VER=%VER:v=%"
set "VERDIR=%NVM_ROOT%\v%VER%"

if not exist "%VERDIR%" (
    echo [Not installed: v%VER% - running nvm install...]
    nvm install %VER%
)

if not exist "%VERDIR%" (
    echo [Install failed: %VERDIR% not found - aborting]
    exit /b 1
)

if exist "%NVM_LINK%" (
    rmdir "%NVM_LINK%" >nul 2>&1
)

mklink /J "%NVM_LINK%" "%VERDIR%" >nul
if errorlevel 1 (
    echo [Failed to create junction]
    exit /b 1
)

echo.
echo Switched to:
node -v
npm -v

使用方式

  1. %USERPROFILE%\.local\bin 這個資料夾加入系統的 PATH 環境變數(如果還沒加過)。
  2. 把上面的腳本存成該資料夾底下的 nvmuse.cmd
  3. 開新的終端機視窗,之後改用以下指令切換版本即可:
nvmuse 20.20.2

如果指定的版本還沒安裝過,腳本會自動先執行 nvm install 幫你裝好,再進行切換,不用再手動分兩步操作。

補充說明

這個做法本質上是一個 workaround(繞過方案),並不是修好 nvm4w 本身的 bug,只是自己重新實作了「切版本」這個核心動作,讓它變得可靠。因為手法就是直接操作 junction,所以:

  • Node.js 版本目錄本身仍然是由官方的 nvm install 下載安裝管理,只有「切換」這個環節被取代。
  • 如果日後 nvm4w 官方修好了這個 bug,直接刪除或不使用這支腳本、改回原生的 nvm use 即可,不會有殘留設定的問題。

留言

這個網誌中的熱門文章

[C#] 無法載入檔案或組件 或其相依性的其中之一。 找到的組件資訊清單定義與組件參考不符。 (發生例外狀況於 HRESULT: 0x80131040)

[Web] Nginx+IIS+asp.net mvc 實現負載平衡(load balancing)

[SQL] 解決 DB Lock 的問題