🎉More great news! Node.js 12 to LTS and Node.js 13 is here!🎉 https://t.co/JmDiMlHgmr
— Node.js (@nodejs) 2019年10月22日
Node.jsのv12がLTSになり、v13がcurrentとしてリリースされました。 今回はNode.js v13の主な変更点を紹介したいと思います。
- assert (PR: #28263)
- build (PR: #29887)
- console (PR: #29251)
- deps (PR: #29694)
- http (PR: #29589)
- http, http2 (PR: #27558)
- ES Modules (PR: #29866)
- 最後に
ダウンロードは公式ページから行えます。
以下リリースノートにあるNotable Changesからいくつかピックアップします。
assert (PR: #28263)
assert.throws()
またはassert.reject()
でthrowされたエラーの検証にコンストラクターが使われた場合、throwされたエラーの代わりにAssertionErrorがスローされます。
コードで見た方がいいかもしれません。
build (PR: #29887)
full-icuでビルドされるようになり、i18n系の機能ですべての言語をサポートしました。
Node.jsはこれまでビルド後のバイナリサイズの増加への懸念により、--with-intl=small-icu
オプションを付けてビルドしていたバイナリを配布していました。
しかし、v13からは--with-intl=full-icu
でビルドしたバイナリを配布するようになりました。
懸念されていたバイナリのサイズですが、macOSだと35MBから49MBになります。
オプションによる言語サポートの違いは以下の表のとおりです。こちらからも確認できます。
挙動の違いに関するサンプルコードは以下のとおりです。
v12以下(small-icuでビルドされたバージョン)はM01
と出力しますが、v13以降(full-icuでビルドされたバージョン)はenero
と出力します。
console (PR: #29251)
console.timeEnd()
とconsole.timeLog()
の結果がミリ秒ではなく時分秒の単位で出力するようになりました。
単位はh
(時)、min
(分)、s
(秒)があります。
サンプルコードは以下の通りです。
v12では3001.732ms
と出力されていましたが、v13からは3.001s
と出力されます。
deps (PR: #29694)
JavaScriptエンジンのV8のバージョンが7.8になりました。
これによりObjectの分割代入のパフォーマンス、メモリ使用量、WASMの起動時間が改善されます。
詳しくはV8のブログを読んでください。
http (PR: #29589)
古いHTTPパーサーが削除されました。
v12からすでにデフォルトではllhttpが使われています。
しかし、--http-parser=legacy
とオプションをつけてnodeを起動すると古いパーサーを使うことも可能でした。
v13からはEnd-of-Lifeとなりました。オプション自体が削除されました。
llhttpはTypeScriptで書かれたhttpパーサーです。
古いHTTPパーサーは保守が難しく、またアーキテクチャ上パフォーマンスに問題がありました。
llhttpは保守性向上のためにTypeScriptで書かれています。それをCのコードやビットコードに変換しています。
古いHTTPパーサーに比べてパフォーマンスはかなり向上しています。
http, http2 (PR: #27558)
デフォルトのサーバータイムアウト時間が変わりました。
これまでサーバーのタイムアウトの時間はデフォルト2分でした。
リクエストが完了するまでに2分以上かかる場合、ソケットは閉じられ空のレスポンスを返していました。
そのため、画像の変換やサイズが大きいファイルのアップロードなど処理に時間がかかる場合、処理の途中でリクエストが閉じられることがありました。
これまでも--http-server-default-timeout=milliseconds
オプションを使うことでユーザー側でもこの時間を変更することは可能でした。0
に設定することでサーバータイムアウトを無効にすることもできました。
v13からはデフォルトで0
が設定されるようになりました。つまりサーバータイムアウトが無効になりました。
ES Modules (PR: #29866)
まだWIPでリリースされていませんが、ES Modulesもv13からフラグなしで使える予定になっています。
v13.2.0からフラグ無しで使えるようになりました 🎉 *1
とはいえ、まだexperimentalなので自己責任でご使用ください。
Node.js v12にもマイナーバージョンの更新(12月か3月ごろ?)でバックポートする議論もされています。
New Release Plan · Issue #400 · nodejs/modules · GitHub
最後に
今回紹介したのは一部の機能になります。自分が気になった変更をまとめただけですので、他にもすごい変更点はあるかもしれません。
Node.js v13は2020年6月でEnd-of-Lifeになる予定です。
次のNode.js v14は例年通りだと2020年4月にリリースされ10月末にLTSになる予定です。今回紹介したv13の機能も含まれます。
最後までお読みいただきありがとうございました。質問や不備はTwitterかブコメなどでお願いいたします。
*1:2019-12-10 追記