過去にも悩まされていた(過去1、過去2)、npm install
しようとすると ECONNREFUSED のエラーになってしまうことについて原因と対処法がついに分かった。
原因
Node.js 17 から先では IPv6 接続を優先するようになり、その結果 IPv4-only のネットワークからはリクエストが通らなくなってしまったらしい。
私は ISP はエキサイト光を契約しているのだが、その接続方式が IPv4 PPPoE だった。
ホームゲートウェイなどのIPv6対応機器を使用して接続している場合、IPv6方式による自動接続が行われます。
とのことらしいが、私が持っている機器は IPv6 未対応のようだ。自身のインターネット環境が IPv6 に対応しているかどうかは test-ipv6.com というサイトで確認できる。
対処法
前項でもリンクした記事では .npmrc
を書き換える方法(オプションの中身が間違っているような気がする)と npm
に alias を与える方法を紹介しているが、個人的には下記の記事に書かれている、 NODE_OPTIONS
の環境変数を設定する方法が一番わかりやすかった。
具体的には、.bashrc
に一行追加すれば良い。
export NODE_OPTIONS=--dns-result-order=ipv4first
global にインストールしたい場合など、 sudo
で行いたい場合は環境変数が引き継がれないので --preserve-env=NODE_OPTIONS
を付け加える必要がある。例えば yarn を global にインストールしたい場合は下記のようになる。
sudo --preserve-env=NODE_OPTIONS npm install --global yarn