22
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-10-08

はじめに

こんにちは、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も
  • undici というコアパッケージとして開発が進行中
    • HTTP/1.1 なクライアントということで、 1.1 -> 11 -> Eleven -> Undici(イタリア語)という命名のようです
      • Stranger Thingsネタも被せている様子。僕はわからず :baby:
  • experimental
    • まだWHATWGの仕様を満たすには至っていないようで、fetchタグのついたIssue が満たせていない項目とのこと

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.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アーキテクチャ向けの開発やテスト、ホスティングを支えるサービスを持っているようで、以下のようなプロジェクトの名前がありました
  • インフラの提供に感謝、という感じでした

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', ...]
    • クラス変数とクラスのプライベートメソッドのパフォーマンス改善
      • 初期化の速度が、非プライベートのものと同等になったとのこと
        • むしろ今まで差があったんですね

iOSに埋め込まれるNode.js

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

他の記事

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

おわりに

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

22
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?