できない.dev

nvm use で切り替えた Node.js のバージョンが新しいターミナルで元に戻る

nvm use はそのシェルセッションだけを書き換えるため、新しいターミナルでは default エイリアスのバージョンに戻る。
恒久的に固定したいなら nvm alias default を設定する。

公開: 更新:

実行例あり(2026-09-24 に実環境で検証)

要約

nvm use 22 で切り替えたのにターミナルを開き直すと node -v が別のバージョンを返すのは、nvm use が そのシェルセッションの PATH を書き換えるだけ の仕組みだからです。
設定ファイルには何も保存されないため、新しいシェルは default エイリアスが指すバージョンで起動します。

恒久的に切り替えたいなら default エイリアス自体を張り替えます。

nvm alias default 22   # 新しいシェルは v22 系の最新で起動する

nvm の公式ドキュメントも「新しいシェルは default のバージョンで起動する」と明記しています。nvm use は一時的な切り替え、nvm alias default は恒久的な既定値、と役割が分かれていると考えると整理しやすいです。

実行例

node:20 のコンテナに nvm で 18 → 22 の順に入れると default は 18 を指したままで、nvm use 22 で切り替えても新しいシェルの node -v は v18.20.8 に戻った。nvm alias default 22 の後は新しいシェルも v22.23.3 で起動し、読み込み行に --no-use を付けるとイメージ同梱の /usr/local/bin/node(v20.20.2)に落ちるが、下に nvm use default を追記すれば v22.23.3 に戻る。

$ nvm alias default
default -> 18 (-> v18.20.8 *)
$ nvm use 22; node -v
Now using node v22.23.3 (npm v10.9.9)
v22.23.3
$ node -v
v18.20.8
$ nvm alias default 22
default -> 22 (-> v22.23.3 *)
$ node -v
v22.23.3
$ grep -n 'nvm.sh' ~/.bashrc
21:[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" --no-use  # This loads nvm
$ node -v; which node
v20.20.2
/usr/local/bin/node
$ tail -n 1 ~/.bashrc
nvm use default
$ node -v; which node
v22.23.3
/root/.nvm/versions/node/v22.23.3/bin/node

— 2026-09-24 時点の出力

検証環境

検証日
実行環境
node:20Debian GNU/Linux 12 (bookworm)
バージョン
  • Node.js 20.20.2
  • npm 10.8.2
  • Python 3.11.2
  • Git 2.39.5

この記事の「実行例」は、上記の環境で実際にコマンドを実行して得られた出力をそのまま掲載しています。 再現手順はリポジトリの検証スクリプトとして管理し、定期的に再実行して出力を更新しています。

よくある原因

  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 するだけにすると、ターミナルごとの差が出にくくなります。

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