Homebrew版NodeをやめてnvmにNode.jsを一本化する

  • nvm
  • Node.js
  • npm
  • Setup

この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。

HomebrewでインストールしてたNode.jsを消して、nvmに一本化した。

結論

  • Homebrew版のNodeとnvm版のNodeを共存させると、PATHの優先順位が環境依存で曖昧になる。素直にbrew版は消してnvmに一本化した方がいい
  • brew uninstall nodeは依存してるFormula(今回はcorepackとdevcontainer)があると拒否される。--ignore-dependenciesで強制removeせず、依存側を先に消す
  • nvmで入れたNode 24系にはnpm 11系が同梱される。npm本体はnpm 12が2026年7月にリリース済みだけど、Node側のバンドルにはまだ反映されてない
  • npm 12へ手動で上げる場合は、installスクリプト・Git依存・リモートURL依存がデフォルトで止まるようになるので、CIやビルド周りは事前確認が要る

Homebrew版Node.jsを消す

brew uninstall node

依存してるFormulaがあると、以下のようなエラーで拒否される。

Error:
Refusing to uninstall /opt/homebrew/Cellar/node/26.7.0 because it is required by corepack and devcontainer, which are currently installed.

依存エラーの対処

--ignore-dependenciesで強制的に消すと、依存してるFormulaのバイナリだけ残って実行時にエラーになる。先に依存側を消すのが安全。

brew uninstall corepack devcontainer
brew uninstall node

削除後は念のためHomebrew側のシンボリックリンクが残ってないか確認する。

which -a node

何も出てこなければOK。

nvmのインストール

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.4/install.sh | bash

新しいシェルを開くと.zshrc(または.bashrc)にnvmの読み込み処理が追記されてる。

Node.jsのインストールとデフォルト設定

nvm install --lts
nvm alias default --lts

固定したいバージョンが決まってるならnvm install v24.19.0のように直接指定してもいい。

動作確認

% which -a node
/Users/example/.nvm/versions/node/v24.19.0/bin/node
% node -v
v24.19.0
% npm -v
11.17.0

which -a nodeでnvmのパス以外何も出てこなければ、Homebrew側の消し残しはない。

npmのバージョンについて

nvmで入れたNode 24系のnpmが11.17.0だったので一瞬「あれ、12じゃないんだ」と思ったけど、これは正常。npm 12は2026年7月8日にリリース済みだけど、Node.js本体へのバンドルはまだ反映されてない。過去の実績だと新しいnpmメジャーがNode側に取り込まれるまで数リリース分ラグがあるので、しばらくは11系のままのはず(実機での反映タイミングは未確認)。

npm 12へ上げる場合の注意点

手動でnpm install -g npm@12すれば先取りできるけど、npm 12はサプライチェーン攻撃対策としてデフォルト挙動がいくつか変わる。

  • allowScriptsがデフォルトoff。依存パッケージのpreinstall/install/postinstallが自動実行されなくなる(binding.gyp経由の暗黙のnode-gyp buildも含む)
  • Git依存の解決が止まる(--allow-gitが必要)
  • リモートURL依存(tarball URLなど)の解決が止まる(--allow-remoteが必要)

ネイティブモジュールをビルドするパッケージやCIパイプラインだと、これが原因でnpm installが静かに失敗する(exit code 0のまま中身だけ壊れる)ケースがあるらしい。上げる前に対象を洗い出しておくと安全。

npm approve-scripts --allow-scripts-pending

で、installスクリプトを持ってるパッケージの一覧が出るので、信頼できるものだけ許可する運用に切り替えるのが本来の使い方。

flowchart TD
    A["依存Formula(corepack / devcontainer)を消す"] --> B["brew uninstall node"]
    B --> C[nvmインストール]
    C --> D["nvm install --lts"]
    D --> E["動作確認: which -a node / node -v / npm -v"]
    E --> F{npm 12へ上げる?}
    F -- はい --> G["npm approve-scripts で対象パッケージ確認"]
    F -- いいえ --> H[そのまま運用]