nvmで切り替わらない原因を調べたら、Node.js関連ツールが3つ競合していた話
こんにちは。いっきー(@ikirin_web)です。
コーディング作業中に、gulpを使った開発環境が突然動かなくなりました。
原因を追いかけていったら、Node.js関連ツールが3つ競合していました。
トラブルの話というより、自分のエラーとの向き合い方が変わったという話です。
ファイルを監視しようとしたら、環境が壊れていた
いつも通り作業を始めようとしたところ、こんなエラーが出ました。
Error: Cannot find module '.../node_modules/y18n/build/index.cjs'
y18nというパッケージの中にあるはずのファイルが見つからない、というエラーです。
以前の自分なら「とりあえずnode_modules消して入れ直せばいいか」で終わっていたと思います。でも今回は、まずエラーの前で立ち止まってみることにしました。
原因を調べたら、Node.js関連ツールが3つ入っていた
AIにエラー文を投げながら、コマンドを一つずつ実行していきました。
原因はNode.jsのバージョンが新しすぎたのです。当時インストールされていたのはv23。gulpやその周辺パッケージはまだv23に対応しきれていない状態でした。
それなら、nvmでv18に切り替えればいいと思ってnvm use 18を実行したのですが…
nvm use 18
# Now using node v18.20.8 と表示された
node -v
# v23.6.1 ← 変わっていない
切り替えたはずなのに、v23のまま。
さらに原因を調べていくと、echo $PATHの出力にこんなことが書かれていました。
/opt/homebrew/bin ← HomebrewのNode v23(優先)
...
~/.nvm/versions/node/v18.20.8/bin ← nvmのv18(後回し)
PATHは左から順番に優先されます。HomebrewのNode v23がnvmより先に読まれていたので、nvmで切り替えようとしても無視されていたわけです。
さらに確認していくと、~/.nodebrew/current/binという記述も出てきました。
nvm・nodebrew・Homebrew。3つ全部入っていました。
Node.jsのバージョン管理ツール2つ(nvm・nodebrew)と Homebrewが競合していました。
なぜ3つも入っていたかというと、過去にバックエンドの言語を触っていた期間にnodebrew・Homebrewをインストールしていたのです。nvmは2026年になってから導入したので、整理をせず前の環境構築が残り続けていました。
Homebrewより先にnvmを読み込んだら動いた
HomebrewのNodeを削除する方法もあったのですが、今回はHomebrewがmacOSのバージョンを認識できていないエラーも別で出ていたため、この部分に関しては後日にまわすことにしました。
本来であればNode.js関連ツールはどれか1つに絞るのが正解なので、環境が安定したタイミングで整理しようと思っています。
代わりにやったのは、.zshrcの末尾にnvmのパスをPATHの先頭に追加する一行を書き加えることでした。
その後.zprofileを整理したことで、この追記は不要になり削除しました。→ 毎朝gulpが動かない問題を解決した話|node_modules・nvm・Homebrewの競合整理
PATHは左から順番に優先されるので、これでHomebrewより先にnvmが読まれるようになります。
設定を反映させてnode -vで確認したところ、v18に切り替わっていました。そのままnpm installを実行して、無事に動作確認できました。
「なぜ」を追いかける習慣を大事にしたい
削除するのは簡単です。エラーが出たらnode_modulesを消して再インストール、それで直ることも実際あります。
でも今回立ち止まってみたことで、
- なぜそのエラーが出ているのか
- なぜそのコマンドを実行するのか
が冷静に見れるようになってきました。
そしてもう一つ気づいたことがあって、エラーが怖くなくなってきたんです。
原因がわからないから怖い。でも「なぜ」を追いかける習慣がつくと、エラーは敵じゃなくて自分の環境を理解するきっかけになります。
これからも「なぜそれをするのか」を大事にしながら、制作を続けていきたいと思っています。
最後まで読んでいただきありがとうございます。