nvm use で切り替えた Node.js のバージョンが新しいターミナルで元に戻る
`nvm use` はそのシェルセッションだけを書き換えるため、新しいターミナルでは default エイリアスのバージョンに戻る。
恒久的に固定したいなら `nvm alias default` を設定する。
公開:
要約
nvm use 22 で切り替えたのにターミナルを開き直すと node -v が別のバージョンを返すのは、nvm use が そのシェルセッションの PATH を書き換えるだけ の仕組みだからです。
設定ファイルには何も保存されないため、新しいシェルは default エイリアスが指すバージョンで起動します。
恒久的に切り替えたいなら default エイリアス自体を張り替えます。
nvm alias default 22 # 新しいシェルは v22 系の最新で起動するnvm の公式ドキュメントも「新しいシェルは default のバージョンで起動する」と明記しています。nvm use は一時的な切り替え、nvm alias default は恒久的な既定値、と役割が分かれていると考えると整理しやすいです。
よくある原因
nvm useの効果範囲を誤解している: nvm はシェル関数として動き、$PATHの先頭に~/.nvm/versions/node/<version>/binを差し込みます。
プロセスが終われば当然消えます。defaultが古いバージョンを指している: 最初にインストールしたバージョンが自動的に default になるため、後から入れた新しいバージョンに追随しません。--no-useで nvm を読み込んでいる: 起動を速くするためにnvm.sh --no-useと書いていると、シェル起動時にどのバージョンも有効化されません。- セッションによって読まれる設定ファイルが違う: ログインシェルでは
~/.zprofile、対話シェルでは~/.zshrcが読まれます。
片方にしか nvm の初期化を書いていないと、IDE 内ターミナルだけ挙動が変わります。
解決策
1. default エイリアスを張り替える
もっとも確実な方法です。
バージョン番号のほか、エイリアスも指定できます。
nvm alias default node # 「インストール済みの最新」を既定にする
nvm alias default 22 # v22 系の最新を既定にする
nvm alias default 'lts/*' # 最新の LTS を既定にする設定後は nvm ls の出力に default -> 22 (-> v22.x.x) のような行が出ます。
新しいターミナルを開いて node -v を確認してください。
詳細は公式ドキュメントの Set default node version(新しいタブで開く) にあります。
2. プロジェクトごとに固定したいなら .nvmrc
マシン全体の既定値を動かしたくない場合は、プロジェクトルートに .nvmrc を置きます。
echo "22" > .nvmrc
nvm use # .nvmrc を読んで切り替えるチーム全員が同じバージョンで作業できるうえ、default を汚しません。
3. --no-use を使っているか確認する
シェル設定ファイルを開き、nvm の読み込み行を確認します。
grep -n 'nvm.sh' ~/.zshrc ~/.bashrc ~/.zprofile 2>/dev/null\. "$NVM_DIR/nvm.sh" --no-use のようになっていれば、--no-use を外すか、その下に nvm use default を追記します。
4. どのシェルでも初期化されるようにする
対話シェルで確実に読まれる ~/.zshrc(bash なら ~/.bashrc)に初期化スニペットを置き、~/.zprofile からはそれを source するだけにすると、ターミナルごとの差が出にくくなります。