Node.js 18の気になる点を挙げてみる

## はじめに

こんにちは、NamedPythonです。
ちょっと個人開発の熱が戻ってきたのもあり、技術選定も兼ねて色々調べているところです。
BunとかDenoもあるけど、一周回って **次のLTSなNode.js(18.x)が気になる** という気持ちになったので、公式ドキュメントを読みくだしながら気になったところをちょ〜〜っとだけ深掘ってピックアップしようと思います。

Node.js 18がActive LTSになるのは **2022-10-25** からなので、実はもう結構近いのです。

https://github.com/nodejs/release#release-schedule

## 読むドキュメントたち

### Node.js v18 のリリースニュース

https://nodejs.org/de/blog/announcements/v18-release-announce/

### リリースブログのうちのNode.js v18.x.y についてのもの

https://nodejs.org/ja/blog/release/

## ピックアップ

### グローバルなfetch APIが標準に

```js
const res = await fetch('https://nodejs.org/api/documentation.json');
if (res.ok) {
  const data = await res.json();
  console.log(data);
}
```

- BunやDenoもここを強調するシーンはよく見ますが、とうとうNode.jsも
    - 現在は [node-fetch](https://github.com/node-fetch/node-fetch) とか使ってますね
- [undici](https://github.com/nodejs/undici) というコアパッケージとして開発が進行中
    - HTTP/1.1 なクライアントということで、 1.1 -> 11 -> Eleven -> Undici(イタリア語)という命名のようです
        - Stranger Thingsネタも被せている様子。僕はわからず :baby:
- experimental
    - まだWHATWGの仕様を満たすには至っていないようで、[`fetch`タグのついたIssue](https://github.com/nodejs/undici/issues?q=is%3Aissue+is%3Aopen+label%3Afetch)　が満たせていない項目とのこと

### Blob, BroadcastChannelがグローバルに

- experimentalを抜けるとのこと
- Blobはたまに見ますが、追加パッケージ不要はありがたいですね

### テストランナー追加

```js
import test from 'node:test';

test('top level test', async (t) => {
  await t.test('subtest 1', (t) => {
    assert.strictEqual(1, 1);
  });

  await t.test('subtest 2', (t) => {
    assert.strictEqual(2, 2);
  });
});
```

- `node:test` というものが追加される様子
- 接頭辞の `node:` がコアモジュールから読み込むことを示すものらしい
- [テストランナーのリファレンス](https://nodejs.org/dist/latest-v18.x/docs/api/test.html) を軽く見てましたが、最低限のAPIだけの雰囲気ですね。
    - 個人的には [Jestの `test.each(table)(name, fn, timeout)`](https://jestjs.io/ja/docs/api#testeachtablename-fn-timeout) が好きなので、サポートされると嬉しい

### ツールチェインとコンパイラのアップグレード

- Node.jsは色々なビルド済みバイナリを提供していますが、メジャーアップデートごとにバイナリの動作環境を再評価し、引き上げなどを行っているとのこと
- macOSに関しては10.15以上が必要となるようです
- 雑に読んだだけですが、32-bit Windowsは初期は動かず、V8のアップデートとともに32-bit向けバイナリも復刻させたい旨の記述がありました

#### 余談

- 謝辞の記述があったんですが、色々な会社名があったので挙げておきます
    - Digital Ocean
    - Rackspace
    - ARM
    - Cloudflare
    - Equinix
    - IBM
    - Intel
    - Joyent
    - Macstadium
    - Microsoft
    - Oregon State University Open Source Lab
        - オレゴン州立大学...!
        - **Open Source Lab** があるの、素敵ですね
            - https://osuosl.org/
            - (僕が知らないだけでJAISTとかにもあるかも...?)
            - AARCH64アーキテクチャ向けの開発やテスト、ホスティングを支えるサービスを持っているようで、以下のようなプロジェクトの名前がありました
                - Eclipse
                - Minio
                - Tor
                - [現行のプロジェクト一覧](https://osuosl.org/services/aarch64/current-projects/)
- インフラの提供に感謝、という感じでした

### V8 10.1へのアップデート

- 17.9.0と比較し、以下のような新機能があるようです
    - 実態としてはV8 9.9で追加された機能
    - 配列向けメソッドの `findLast()`, `findLastIndex()`
        - `find()` や `findIndex()` の逆順走査っぽいですね
    - `ja-JP`などのロケールを提供する `Intl.Locale` APIにプロパティが7個増えたようです(結構面白い)
        - calendars
        - collations
        - hourCycles
        - numberingSystems
        - timeZones
        - textInfo
            - 字をどちらから読むか、の情報
            - ltr: left-to-right
            - rtl: right-to-left
        - weekInfo
            - 週がいつから始まるか、週末がいつかの情報
    - `Intl.supportedValuesOf(code)` の追加
        - 上の７つのプロパティでサポートされている値の一覧を出すもの
            - 例えば `Intl.supportedValuesOf('calendar')` だと
                - `['buddhist', 'chinese', 'coptic', 'dangi', ...]`
    - クラス変数とクラスのプライベートメソッドのパフォーマンス改善
        - 初期化の速度が、非プライベートのものと同等になったとのこと
            - むしろ今まで差があったんですね

### iOSに埋め込まれるNode.js

https://github.com/nodejs/node/pull/44210

https://github.com/Tencent/puerts

- 正直目を疑ったんですが、Node.jsのAPIをiOSのネイティブで使おうとする動きをサポートするものでした
    - Node.jsのC++実装が`libnode`にあたるんですが、ビルド対象としてiOSをサポートするMRがマージされていました
- 加えて、MR内でテンセントのリポジトリがリンクされているんですが、なんと **ネイティブのゲームをTypeScriptで書く** というものでした
    - TypeScriptの型検査システムによるメンテナビリティの高さと、UE4やUnityなどのパワーを両立するためのものでした
    - ちなみにテンセントはあの **League of Legends** や **VALORANT** を開発・運営しているRiot Gamesを2011年に買収しているスゲー企業です
- TypeScriptがWeb以外の領域でも使われているのを見てとてもワクワクしました

## 他の記事

Node.js Core Collaboratorの方による記事。Undiciについてはより詳細に深堀りされています。

https://shisama.hatenablog.com/entry/2022/04/20/011103

## おわりに

読む前はパフォーマンス向上について期待していたりしたのですが、どちらかというとWeb標準への準拠を頑張っているようでした。
おそらくパフォーマンスについて期待するのであればV8のバージョンごとの差分を追えば細かいものはわかりそうです。
こういった情報を追っていると、沸々とContribute欲が湧いてきますね。精進します。