できない.dev

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 は恒久的な既定値、と役割が分かれていると考えると整理しやすいです。

よくある原因

  1. nvm use の効果範囲を誤解している: nvm はシェル関数として動き、$PATH の先頭に ~/.nvm/versions/node/<version>/bin を差し込みます。
    プロセスが終われば当然消えます。
  2. default が古いバージョンを指している: 最初にインストールしたバージョンが自動的に default になるため、後から入れた新しいバージョンに追随しません。
  3. --no-use で nvm を読み込んでいる: 起動を速くするために nvm.sh --no-use と書いていると、シェル起動時にどのバージョンも有効化されません。
  4. セッションによって読まれる設定ファイルが違う: ログインシェルでは ~/.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 するだけにすると、ターミナルごとの差が出にくくなります。

この記事は役立ちましたか?