

Homebrew版NodeをやめてnvmにNode.jsを一本化する
この記事は、構成と文章の整理に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 devcontainerbrew 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 --ltsnvm alias default --lts固定したいバージョンが決まってるならnvm install v24.19.0のように直接指定してもいい。
動作確認
% which -a node/Users/example/.nvm/versions/node/v24.19.0/bin/node% node -vv24.19.0% npm -v11.17.0which -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[そのまま運用]