はじめに
こんにちは、NamedPythonです。
ちょっと個人開発の熱が戻ってきたのもあり、技術選定も兼ねて色々調べているところです。
BunとかDenoもあるけど、一周回って 次のLTSなNode.js(18.x)が気になる という気持ちになったので、公式ドキュメントを読みくだしながら気になったところをちょ〜〜っとだけ深掘ってピックアップしようと思います。
Node.js 18がActive LTSになるのは 2022-10-25 からなので、実はもう結構近いのです。
読むドキュメントたち
Node.js v18 のリリースニュース
リリースブログのうちのNode.js v18.x.y についてのもの
ピックアップ
グローバルなfetch APIが標準に
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 とか使ってますね
-
undici というコアパッケージとして開発が進行中
- HTTP/1.1 なクライアントということで、 1.1 -> 11 -> Eleven -> Undici(イタリア語)という命名のようです
- Stranger Thingsネタも被せている様子。僕はわからず
- HTTP/1.1 なクライアントということで、 1.1 -> 11 -> Eleven -> Undici(イタリア語)という命名のようです
- experimental
- まだWHATWGの仕様を満たすには至っていないようで、
fetch
タグのついたIssue が満たせていない項目とのこと
- まだWHATWGの仕様を満たすには至っていないようで、
Blob, BroadcastChannelがグローバルに
- experimentalを抜けるとのこと
- Blobはたまに見ますが、追加パッケージ不要はありがたいですね
テストランナー追加
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:
がコアモジュールから読み込むことを示すものらしい -
テストランナーのリファレンス を軽く見てましたが、最低限のAPIだけの雰囲気ですね。
- 個人的には Jestの
test.each(table)(name, fn, timeout)
が好きなので、サポートされると嬉しい
- 個人的には Jestの
ツールチェインとコンパイラのアップグレード
- 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
- 現行のプロジェクト一覧
- インフラの提供に感謝、という感じでした
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)
の追加- 上の7つのプロパティでサポートされている値の一覧を出すもの
- 例えば
Intl.supportedValuesOf('calendar')
だと['buddhist', 'chinese', 'coptic', 'dangi', ...]
- 例えば
- 上の7つのプロパティでサポートされている値の一覧を出すもの
- クラス変数とクラスのプライベートメソッドのパフォーマンス改善
- 初期化の速度が、非プライベートのものと同等になったとのこと
- むしろ今まで差があったんですね
- 初期化の速度が、非プライベートのものと同等になったとのこと
iOSに埋め込まれるNode.js
- 正直目を疑ったんですが、Node.jsのAPIをiOSのネイティブで使おうとする動きをサポートするものでした
- Node.jsのC++実装が
libnode
にあたるんですが、ビルド対象としてiOSをサポートするMRがマージされていました
- Node.jsのC++実装が
- 加えて、MR内でテンセントのリポジトリがリンクされているんですが、なんと ネイティブのゲームをTypeScriptで書く というものでした
- TypeScriptの型検査システムによるメンテナビリティの高さと、UE4やUnityなどのパワーを両立するためのものでした
- ちなみにテンセントはあの League of Legends や VALORANT を開発・運営しているRiot Gamesを2011年に買収しているスゲー企業です
- TypeScriptがWeb以外の領域でも使われているのを見てとてもワクワクしました
他の記事
Node.js Core Collaboratorの方による記事。Undiciについてはより詳細に深堀りされています。
おわりに
読む前はパフォーマンス向上について期待していたりしたのですが、どちらかというとWeb標準への準拠を頑張っているようでした。
おそらくパフォーマンスについて期待するのであればV8のバージョンごとの差分を追えば細かいものはわかりそうです。
こういった情報を追っていると、沸々とContribute欲が湧いてきますね。精進します。