そろそろNode.js 14へ移行せな (新機能まとめ)

# はじめに
* 2020/4/22にNode.js14がリリースされました。
* また、2020/10/27にNode.js14のActive LTSが開始され、2020/11/30にNode.js12のMaintenance LTSに移った為、そろそろ切り替え時かなということで、この記事を残します。

[参考: Node公式リリース時期](https://nodejs.org/en/about/releases/)
![スクリーンショット 2020-11-30 13.03.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/3fc0ca82-7c67-ad89-09be-178aeeef12a4.png)


## LTSってなんだ??
LTSとは、[Long Term Support]の略を指し、長期の保守運用が約束されているバージョンになります。

### Current LTS
* 最新版だが、安定性を約束しないことで機能追加を盛り込んだバージョン

### Active LTS
* リリースラインに適切で安定していると判断された新機能、バグ修正、および更新。

**安定しているため、本番環境をアップグレードする最適な時期ともいえます**

### Maintenance LTS
* 重大なバグ修正とセキュリティアップデート

# Node14の新機能
## 診断レポートの安定
* 診断レポートは、Node14の安定した機能としてリリースされています
（Node12では、実験的な機能として追加されていました）

→ 診断レポート機能を使用すると、オンデマンドまたは特定のイベントが発生したときにレポートを生成できます。

* このレポートには、クラッシュ、パフォーマンスの低下、メモリリーク、高いCPU使用率、予期しないエラーなど、本番環境での問題の診断に役立つ情報が含まれています。

実行方法については、次のように[--report-on-fatalerror]を指定します。
また、例外がcatchされなかったときにレポートを出力する[--report-uncaught-exception]などがあります。

```
node --report-on-fatalerror server.js
```

[参照: 診断レポート機能の詳細](https://medium.com/the-node-js-collection/easily-identify-problems-in-node-js-applications-with-diagnostic-report-dc82370d8029)

## V8がV8 8.1にアップグレード
V8のバージョンが上がることで使用できるJavaScriptの構文や機能が増えます。

### Optional Chaining

Optional chainingは、参照したオブジェクトや関数の値がundefinedやnullの可能性があっても、その値が持つプロパティに安全にアクセスすることができます。

```example.js
// 使用前
let nameLength;
if (user && user.info && user.info.name)
  userName = user.info.name;

// Optional Chainingを使用
const userName = user?.info?.name;
```

[参照: MDN_Optional Chaining](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining)

### Nullish Coalescing

Nullish coalescingは、参照する値がundefined または null の時、デフォルト値を取得することができます。

```example.js

const resultString = null ?? 'default';
console.log(resultString);
// => default

const resultNumber = 0 ?? 42;
console.log(resultNumber);
// => 0
```

[参照: MDN_Nullish Coalescing](https://wiki.developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Nullish_Coalescing_Operator)

### Intl.DisplayNames

Intl.DisplayNamesは、指定したロケールとオプションに基づいた表示名称の翻訳を取得することができます。

```example.js
// 国/地域コードから国名/言語名を出力する例
const languageNamesInEnglish = new Intl.DisplayNames(['en'], { type: 'language' });
const languageNamesInFrance = new Intl.DisplayNames(['fr'], { type: 'language' });

console.log(languageNamesInEnglish.of('ja'));
// => "Japanese"
console.log(languageNamesInFrance.of('en-US'));
// => "anglais américain"
```

[参照: MDN_Intl.DisplayNames](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DisplayNames)

### Intl.DateTimeFormatのcalendar optionとnumberingSystemオプションの有効化

Intl.DateTimeFormatのoptions引数を用いて、calendarとnumberingSystemが使えるようになりました。

```example.js
const date = new Date(Date.UTC(2012, 11, 20, 3, 0, 0));

console.log(new Intl.DateTimeFormat('en-US').format(date));
// => "12/20/2012"

console.log(new Intl.DateTimeFormat('en-GB').format(date));
// => "20/12/2012"

console.log(new Intl.DateTimeFormat('ja', { calendar: 'japanese',  numberingSystem: 'jpan', era: 'long' }).format(date));
// => "平成24年十二月二十日"

```

[参照: MDN_Intl.DateTimeFormat](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat)

## 実験的にAsync Local Storage APIの追加
AsyncLocalStorageは、コールバックとプロミスチェーン内に非同期状態を作成するために使用されます。

→ これにより、Webリクエストの存続期間またはその他の非同期期間を通じてデータを保存できます。これは、他の言語のスレッドローカルストレージに似ています。

[参照: ドキュメント_AsyncLocalStorage](https://nodejs.org/api/async_hooks.html#async_hooks_class_asynclocalstorage)

## Streams API全体の一貫性を向上
変更点としては、

* [http.OutgoingMessage] → [stream.Writable]に一貫しました。

* [net.Socket] → [stream.Duplex]に一貫しました。

変更としては以上ですが、アプリケーションに影響はないと思っています。

## ES Moduleの警告を削除
### ES Modulesとは
JavaScriptにおけるモジュール機能としては、下記のものがあります。

* CommonJS
* ECMAScript Modules(ES Modules)
* etc..

#### CommonJS
CommonJSとは、言語仕様のModules解決するために主にNodeに実装されています。

```example.js
const { test } = require("./test");
```

#### ES Modules
ES Modulesとは、再利用のためにJavaScriptコードをパッケージ化するための公式の標準形式です。

```example.js
import { test } from "./test.js"
```

##### じゃあどうなったの？？

今までは、ES Modulesを使用する場合、以下の警告が表示されていました。

```
ExperimentalWarning: The ESM module loader is experimental.
```
これが、Node.js v14 からは上記の警告は表示されなくなります。
**注意点としては、あくまでまだ実験的なものであることです**