最後にはじめに今年2023年9月11日にNode.jsバージョン16はEOL(LTSサポート期間終了日)を迎えます。これに伴い、現在v16またはそれ以前のバージョンなどを使用している場合は次のLTSバージョンであるv18などにアップデートする作業が生じます。筆者が現在参画中のプロジェクトでもv16からv18へのアップデート作業が最近実施されました。本記事ではこちらのバージョンアップ作業に伴って発生した現象と対応策について共有させていただきます。Node.jsリリーススケジュールNode.jsは毎年4月と10月の2回、新しいメジャーバージョンがリリースされます。Support)版と呼ばれる、致命的なバグの修正などを長期間に渡ってサポートするバージョンとなります。一方で毎年10月にリリースされるメジャーバージョンは比較的サポート期間が短命であり、ここ数年の事例を見ると翌年の6月1日にEOLを迎えています。LTS)の使用が推奨されています。現時点(2023年2月)で、EOLを迎えていないLTS版はv14、v16、v18の3つ存在します。v18は2025年の4月30日までのサポートが予定されています。v18より過去にリリースされたv14系のEOLは2023年4月30日、v16は先述の通り2023年9月11日までとなっております。従いまして、アプリケーションにv16以下のバージョンを現在使用している場合、現時点(2023年2月)でのアップデート先としてはv18が主な候補となります。APIは元々はブラウザ上で(ネットワーク越しの通信を含む)リソース取得を実現するインターフェイスでした。言い換えるとブラウザ上でのみ動作する為、Node.js上で実行することは出来きませんでした。そのため、Node.jsで実行するには、whatwg-fetchのようなpolyfillを使用する必要がありました。APIが利用可能になっています。簡易な使用例fetch("https://pokeapi.co/api/v2/pokemon/ditto").then(...);名前解決v16以前では、Node.jsは名前解決の際にIpv4を優先してマッピングしていました。筆者のmacOS環境/etc/hostsは以下の通りで、localhostはIPv4である127.0.0.1が解決される仕様になっていました。localhostしかしv17以降ではIPv4優先が廃止され、実行環境の設定に依存する仕様となりました。筆者のmacOS環境で試してみると、localhostはIPv6である::1に解決されます。Worker(以下msw)を使用しています。APIのpolyfillとしてwhatwg-fetchを使用しています。v16では成功していたmswをモックサーバとして利用したHTTPリクエストを含むユニットテストが、アップデート後のv18では失敗する事象が発生しました。node:net:1300:16こちらのissueに記載されている通り、先述した名前解決の仕様変更によってmswライブラリ内で生じた不具合がテスト失敗の原因となります。(※ブラウザ上でアプリケーションを実行する際のモックサーバとしての利用であればv18であっても問題なくmswを使用出来ます。)対応法Vitestのバージョンを最新(2022/02/14時点で0.28.5)にアップデートした上で、テスト実行コマンドに--no-experimental-fetchオプションを付与することで、暫定的に問題を回避いたしました。APIに関してのみv18にアップデートされる以前の状態を再現させています。APIを呼び出す前後のコード範囲についてはテストできている状態になるため、暫定対応として良しとしました。これはあくまでも暫定策のため、今後も先ほどのissueを確認しておく必要があります。最後にNode.jsに限った話ではございませんが、依存しているライブラリなどのメジャーバージョンアップデートを実施いたしますと、今回ご紹介したように何かしらの動作不良がしばしば発生します。本記事が、何かのお役に立てば幸いに存じます。ウェブサービス株式会社(DWS)公式ブログ記事URLをコピーしました。