この投稿では、Node.jsバージョン14の新機能を紹介します。
Node.js 14
- 本日、2020年4月22日にリリースされた
- v14はLTS(long term support)という3年間の保守が約束されたバージョン。
Node.js 14の今後の予定
- Current期間: 2020年4月22日〜2020年10月19日
- 互換性が保たれる範囲で新機能が追加される。
- 企業ユーザとしては、アップグレードに備えて、この6ヶ月間にv14でのテストを実施すると良い。
- Active LTSの期間: 2020年10月20日〜2021年10月18日
- リリースラインに適切な範囲での新機能の追加、バグ修正と保守。
- 企業ユーザが、本番環境をアップグレードするのに最適な時期。
- メンテナンス期間: 2021年10月19日〜2023年4月
- 重要なバグ修正とセキュリティ更新。
ちなみに、過去のLTSの終了時期は下記の通り:
- Node.js 12: 2022年4月
- Node.js 10: 2021年4月
Node.js 14の新機能
- 診断レポート機能がstableに
- V8のアップグレード
- 非同期ローカルストレージAPI
- ストリームAPIを大きく変更
- ES Moduleの警告削除
- 非推奨APIの削除
診断レポート機能がstableに
- 診断レポートがNode.js 14でstableになった。
- Node.js 12でexperimentalとして導入されていたもの。
- 診断レポートは、問題特定のために、スタックトレースやヒープの統計情報、プラットフォームの情報、リソースの仕様状況、クラッシュ、メモリリーク、パフォーマンスの低下などをレポートとして収集できる機能。
- Diagnostic Report | Node.js v14.0.0 Documentation
V8のアップグレード
- V8をv8.1にアップグレードした。
- 「V8 of V8」(V8のバージョン8)というユーモアがある。
- V8 of V8の情報
V8アップグレードにより使えるようになったJavaScriptの新機能
Optional Chaining - オプショナルチェイニング
?.
演算子を使うことで、ネストされたオブジェクトで、プロパティのnullチェックをいちいちせずに、プロパティを深くまでたどって行ける機能。
// beforeletnameLength;if(db&&db.user&&db.user.name)nameLength=db.user.name.length;// Optional ChainingconstnameLength=db?.user?.name?.length;
Nullish Coalescing - Null合体演算子
??
: 左辺がnull
かundefined
の場合に右の値を返し、それ以外の場合は左の値を返す演算子。
constfoo=null??'default string';console.log(foo);// expected output: "default string"constbaz=0??42;console.log(baz);// expected output: 0
Intl.DisplayNames
- 言語、地域、文字体系の表示名の一貫した翻訳を可能にするオブジェクト。
// 国/地域コードから国名/地域名を出力する例letregionNames=newIntl.DisplayNames(['en'],{type:'region'});console.log(regionNames.of('US'));//=> "United States"console.log(regionNames.of('JP'));//=> "Japan"regionNames=newIntl.DisplayNames(['ja'],{type:'region'});console.log(regionNames.of('US'));//=> "アメリカ合衆国"console.log(regionNames.of('JP'));//=> "日本"
Intl.DateTimeFormat
のcalendar
オプションとnumberingSystem
オプションの有効化
Intl.DateTimeFormat
のoptions
引数にて、calendar
とnumberingSystem
が使えるようになった。
consttoday=newDate('2019-05-10');console.log(newIntl.DateTimeFormat('ja',{calendar:'japanese'}).format(today));//=> R1/5/10console.log(newIntl.DateTimeFormat('ja',{calendar:'japanese',numberingSystem:'jpan'}).format(today));//=> R一/五/十console.log(newIntl.DateTimeFormat('ja',{calendar:'japanese',numberingSystem:'jpanfin'}).format(today));//=> R壱/伍/拾console.log(newIntl.DateTimeFormat('ja',{calendar:'japanese',numberingSystem:'jpanyear'}).format(today));//=> R元/5/10console.log(newIntl.DateTimeFormat('ja',{calendar:'japanese',numberingSystem:'jpan',era:'long'}).format(today));//=> 令和元年五月十日console.log(newIntl.DateTimeFormat('ja',{calendar:'japanese',numberingSystem:'jpanfin',era:'long'}).format(today));//=> 令和元年伍月拾日console.log(newIntl.DateTimeFormat('ja',{calendar:'japanese',numberingSystem:'jpanyear',era:'long'}).format(today));//=> 令和元年5月10日
- Intl.DateTimeFormat - JavaScript | MDN
- Intl.Locale.prototype.calendar - JavaScript | MDN
- Intl.Locale.prototype.numberingSystem - JavaScript | MDN
非同期ローカルストレージAPIの実験導入
- 実験的に非同期ローカルストレージAPIが導入された。
- Async Hooks | Node.js v14.0.0 Documentation
ストリームAPIを大きく変更
- ストリームAPI全体の一貫性を改善した。
http.OutgoingMessage
はstream.Writable
と一貫するように、net.Socket
はstream.Duplex
と一貫するように変更された。
- 大きな変更だが、ほとんどのアプリケーションに影響はないと思われる。
- エッジケースのみが変更されているため。
- ただし、ストリームに大きく依存している場合は、Node.js 14のCurrent期間にしっかりテストしたほうがいい。
ES Moduleの警告削除
- Node.jsでは、ECMAScript Modules(ESM)が使える。
- ESM =
require()
やmodule.exports
の代わりに、import
やexport
を使うアレのこと。
- ESM =
- Node.js 13では
--experimental-modules
フラグなしにES Modulesが使えるようになった。- しかし、それでも「ExperimentalWarning: The ESM module loader is experimental.」という警告は出し続けていた。
- Node.js 14では、上記の警告を出さないようにした。
- ただし、ESMはNode.js14でも「実験的機能」扱い。
- 実験的=将来的に互換性のない変更や削除があるかもしれない、ということ。
- 本番環境でESMを使う場合は要注意。