Node18系の変更点について

5372 ワード

簡単なまとめ

  • Node.js の 18 バージョンがリリースされた
  • 実験的機能やランタイムエンジンのアップグレードなどがあった
  • アクティブ LTS は 16 系、現在の 18 系はひとまず current となる

Current と LTS について

Node.js のメジャーアップデートには「current」と「LTS(Long-Term-Support)」が存在します。
Current は実験的機能を含むバージョンであり、Node が移行アップデートで追加を行う実験的機能を先に試すことができるバージョンになります。
LTS は長期的サポートを目的としているため、安定した機能がメインとなります。
今回の 18 系は現在 Current になります。今年末からはこちらが Active LTS、つまり安定版になっていく予定です。

変更点

ざっくりと変更点を上げます。

V8 Javascript エンジンの 10.1 への更新

V8 エンジンとは Google がオープンソースとして作っている、Javascript/WASM のエンジンです。Node.js はこれを使い Javascript を動かしています。
V8 エンジンが変わると一体何が変わるんや、、、という話ですが、V8 エンジンが変わることで Javascript の構文や機能が増えます。これは V8 エンジンのサポートする ECMA Script が変わるためです。
今回ですと

  • findLast
  • findLastIndex

が使えるようになります。配列の一番最後の要素やインデックスを取得することができるようになるメソッドです。なので今まで

const numbers = [0, 1, 2, 3, 4];

// 最後の偶数を取得する
const lastNumber = [...numbers].reverse().find((v) => v % 2 === 0);

のようにあまり美しくなかった配列の最後の要素の取得が

const numbers = [0, 1, 2, 3, 4];

const lastNumber = numbers.findLast((v) => v % 2 === 0);

と、不要な配列の展開/配列の入れ替えが不要で取得が可能になります。

テストランナーモジュール

実験的な機能ですが、サードパーティー製のライブラリが不要で node:test でテストを作成できるようになりました。
筆者がそれほどテストに明るくないのであまり詳しいことは言えないですが、ユニットテストが特にライブラリを追加せずともできるようになったようです。
詳しくは こちら の公式を見ていただけるとわかりやすいかと思います。

HTTP タイムアウト時間の制限追加

今まで HTTP タイムアウトはデフォルトが 0 、つまり無制限になっていましたが、こちらがデフォルトで 300000 、つまり 5 分になりました。
この目的は攻撃の考えてのアップデートのようです。タイムアウトを無制限にしていると攻撃が終わるまで待機をしてしまうため、5 分の制限を持たせ、接続を閉じるようにしたようです。
5 分以上通信が必要ということ自体何と無く問題がありそうですが、もしレスポンスの遅い API があると言った場合にはこちらを認識しておかないと、Node のアップデートで大変なことになりそうだなと思います。

Web Streams API の試験的実装

筆者は「そもそも Web Streams API とは、、、」というレベルでしたがざっくり説明すると、通信量の多いデータを細切れにすることで、通信速度を早くしてしまおう、という機能になります。
今までも Node ではサポートされていましたが、ブラウザとの互換性がありませんでした。
今回ブラウザ互換の Stream API が実装されたことでクライアント/サーバー環境ともに使えるようになったということになります。

fetch API がグローバルスコープで使えるように

こちらは今までも存在していた機能ですが、 fetch() 関数が今まではフラグが必要でしたが、フラグ不要で使えるようになりました。
axios などでデータを取得していたのを、こちらの fetch() を使うことで行えるようになったということです。
ただ試験的機能ではあるので、プロダクトにすぐ突っ込む、とかは避けたほうがよさそうです。

終わりに

まだ他にもアップデートの内容はありますが、そちらについては下記の記事をご覧ください(雑ですみません 🙇‍♂️)。
Node.js ChangeLog
個人的には Web で使える機能が増えた印象があって、これら技術を今後どう取り扱っていくかが気になりました(Web Stream API をどれだけ取り込むかとか)。