Daily-It

개발, AI, 인프라, 자동화와 일상 IT 제품 후기를 직접 써보며 정리하는 기술 블로그입니다.

Mac Silicon に NVM をインストール:Node.js バージョン管理とよくあるトラブル

概要

Apple Silicon Mac に nvm をインストールすること自体は難しくありません。つまずきやすいのはインストール後です。nvm: command not found、VS Code のターミナルとシステムターミナルで Node のバージョンが違う、Homebrew の Node が先に見つかる、古いプロジェクトで arm64 上の Node 14 が必要になる、といった問題がよくあります。

最初から再インストールするのではなく、公式スクリプトで nvm を入れ、zsh が設定を読み込んでいるかを確認し、必要な Node.js LTS をインストールして、プロジェクトには .nvmrc を置くのが基本です。結果が違う場合は shell、CPU アーキテクチャ、実際に実行されている Node のパスを確認します。

この記事の内容

Mac で Node バージョン管理が必要な理由

古いプロジェクトは Node 18 を必要とし、新しいプロジェクトは Node 22 や 24 を要求することがあります。システム全体で1つの Node だけを使うと、npm install は成功してもビルドで失敗したり、一部パッケージの挙動が変わったりします。

# プロジェクト A
nvm use 18

# プロジェクト B
nvm use 24

Apple Silicon Mac では、zsh 設定、arm64 対応、古い Node に Rosetta や x86_64 環境が必要かどうかが重要です。

nvm のインストールと Node.js 設定

手順 1. 現在の shell と CPU アーキテクチャを確認する

echo $SHELL
uname -m

最近の macOS では通常 /bin/zsharm64 が表示されます。その場合、主に ~/.zshrc を確認します。

手順 2. 公式スクリプトで nvm をインストールする

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.5/install.sh | bash
# wget を使う場合
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.5/install.sh | bash

インストールスクリプトは通常 ~/.nvm を作成し、shell 設定ファイルに nvm の読み込みコードを追加します。

手順 3. zsh を再読み込みする

source ~/.zshrc
command -v nvm

正常なら nvm と表示されます。何も出ない場合は設定ファイルを確認します。

手順 4. zsh の読み込み設定を確認する

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"

会社で dotfiles や XDG パスを統一している場合は、$XDG_CONFIG_HOME を使う公式 README の形式も確認します。

手順 5. Node.js LTS をインストールする

nvm install --lts
node -v
npm -v
nvm alias default node

特定のメジャーバージョンをデフォルトにするなら nvm alias default 24 のように指定します。

手順 6. プロジェクトに .nvmrc を追加する

24

最新 LTS に追従したい場合は次のようにも書けます。

lts/*

プロジェクトに入ったら次を実行します。

nvm install
nvm use
npm install

手順 7. ディレクトリ移動時に自動で nvm use する

必要なら zsh hook を追加できますが、必須ではありません。ターミナル起動が遅くなる、余計な出力が出る、と感じる人もいるため、チーム強制ではなく個人設定に向いています。

autoload -U add-zsh-hook
load-nvmrc() {
  local node_version="$(nvm version)"
  local nvmrc_path="$(nvm_find_nvmrc)"
  if [ -n "$nvmrc_path" ]; then
    local nvmrc_node_version="$(nvm version "$(cat "$nvmrc_path")")"
    if [ "$nvmrc_node_version" = "N/A" ]; then
      nvm install
    elif [ "$nvmrc_node_version" != "$node_version" ]; then
      nvm use
    fi
  elif [ "$node_version" != "$(nvm version default)" ]; then
    nvm use default
  fi
}
add-zsh-hook chpwd load-nvmrc
load-nvmrc

Apple Silicon で Rosetta が必要になる場面

現在の Node.js LTS を使うなら、通常 Rosetta を先に考える必要はありません。nvm ドキュメントでは Node.js v16.0.0 以降に Apple Silicon の arm64 Darwin バイナリが提供されると説明されています。

Node.js バージョン Apple Silicon での意味
Node.js 16 以上 arm64 Darwin バイナリを利用可能
Node.js 14.17 以上 ソースビルドで実験的 arm64 サポートに言及
さらに古い Node.js 14 以下 Rosetta 2 または x86_64 環境が必要になる場合あり
node -p "process.arch"

Homebrew で nvm を入れてよいか

nvm については公式インストールスクリプトを使う方が安全です。nvm README は Homebrew インストールをサポート対象としていません。

nvm、Volta、fnm の選び方

ツール 特徴 向いている場面
nvm 広く使われる shell ベースの Node バージョン管理ツール 既存資料と .nvmrc 互換性を重視する場合
Volta Node、npm、yarn、pnpm などのツールバージョン固定が得意 チームで JavaScript ツールチェーンを厳密に揃えたい場合
fnm Rust 製で高速、.nvmrc にも対応 nvm に近い使い方で起動速度も重視する場合

プロジェクトとチームでのベストプラクティス

.nvmrc をコミットする

.nvmrc は小さなファイルですが効果的です。Node のメジャーバージョン違いによるインストール失敗を減らせます。

README に初回実行コマンドを書く

nvm install
nvm use
npm install
npm run dev

CI とローカルの Node バージョンを合わせる

ローカルが Node 24、CI が Node 20 だと結果が変わることがあります。GitHub Actions、Jenkins などの CI でも .nvmrc と合わせます。

古い Node を使う理由を残す

Node 14 や 16 を継続する必要があるなら、パッケージ互換性や本番制約など理由を README に書きます。

よくある間違い

which nvm で確認する

nvm は通常 shell 関数として読み込まれるため、command -v nvm を使います。

読み込みコードを違う設定ファイルに書く

zsh の Mac ではまず ~/.zshrc を確認します。

grep NVM_DIR ~/.zshrc

Homebrew Node と nvm Node の混在に気づかない

which node
node -v

nvm が有効なら通常パスに .nvm が含まれます。Apple Silicon の Homebrew Node は /opt/homebrew/bin/node がよく使われます。

.nvmrc を作っただけで nvm use しない

nvm use

VS Code とシステムターミナルが同じ設定を読むと思い込む

echo $SHELL
command -v nvm
node -v

トラブル事例と解決

ケース 1. インストール後に nvm: command not found

source ~/.zshrc
command -v nvm
grep NVM_DIR ~/.zshrc

設定がなければ nvm の読み込みコードを追加して再読み込みします。

ケース 2. システムターミナルでは使えるが VS Code では使えない

VS Code の Terminal: Select Default Profile で zsh を選び、~/.zshrc が読み込まれているか確認します。

ケース 3. 実際には Homebrew Node が使われている

nvm use
which node

Homebrew Node を必ず削除する必要はありませんが、現在の shell がどの Node を使っているかは把握します。

ケース 4. .nvmrc があっても自動で切り替わらない

これは正常です。自動化 hook を入れていない限り、nvm installnvm use を実行します。

ケース 5. 古い Node が Apple Silicon で失敗する

uname -m
node -p "process.arch"

可能ならサポート中の LTS へ更新し、どうしても古いバージョンが必要な理由を README に残します。

結論

Apple Silicon で nvm を使うときの主な問題は、複雑な Node 問題ではなく shell とパスです。公式スクリプトでインストールし、zsh が nvm を読み込み、which node で実行パスを確認します。チームでは .nvmrc、README、CI の Node バージョンを揃えるだけで、多くのインストール・ビルドエラーを減らせます。

参考文献

韓国語原文:この記事は韓国語原文をもとに、日本語読者向けに用語、確認手順、注意点を整理しています。韓国語原文を見る