概要
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/zsh と arm64 が表示されます。その場合、主に ~/.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 install と nvm 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 バージョンを揃えるだけで、多くのインストール・ビルドエラーを減らせます。
参考文献
- nvm GitHub README
- nvm latest release
- Node.js Downloads
- Apple Support: Use zsh as the default shell on your Mac
- Homebrew Official Site