23 ポイント 投稿者 GN⁺ 2025-08-04 | 3件のコメント | WhatsAppで共有
  • Node.js の開発環境はここ数年、Web 標準との高い互換性と組み込み機能の強化という面で根本的な変化を遂げている
  • ESM(ES Modules)node: プレフィックス、Top-level await などの最新モジュールシステムと非同期パターンの導入により、より直感的で安全なコードを書けるようになった
  • Fetch API、AbortController、Web Streams などにより、従来の外部ライブラリへの依存が減り、多くの機能を組み込み API で賄えるようになった
  • テストランナー、Watch モード、環境ファイル対応 などの組み込み開発ツールにより、作業のしやすさと生産性が大きく向上した
  • 権限制御、診断チャネル、単一実行ファイル配布まで可能な セキュリティおよび配布インフラ の強化により、現代の Node.js は専門的かつ汎用的なプラットフォームへと進化している

Node.js の変化と発展

  • Node.js は初期の コールバック中心・CommonJS 中心の構造 から、今日ではより 標準化された開発環境 へと生まれ変わっている
  • こうした変化は単なる見た目の変化ではなく、サーバーサイド JavaScript 全体の開発パラダイムの変化である

1. モジュールシステム: ES Modules の標準化

  • CommonJS は長らく Node.js で使われてきた方式だが、静的解析やツリーシェイキングなどの面で限界があり、Web 標準との不一致という問題もある
  • ESM(ES Modules) 方式が Node.js の新たな標準として定着した
    • importexport 構文を使用
    • 組み込みモジュール を明示的に区別するため node: プレフィックスを導入
      • 例: import { readFile } from 'node:fs/promises'
      • 組み込みと npm パッケージの区別が明確になった
  • Top-level await のサポートにより、モジュールの最上位でも await を使えるようになった
    • 即時実行の非同期関数ラッパーで囲む必要がない
    • コードがより直線的で理解しやすくなった

2. 組み込み Web API: 外部依存の削減

  • Fetch API が Node.js に組み込まれ、Axios や node-fetch のような外部依存なしに HTTP リクエストが可能になった
  • Fetch は基本的にタイムアウトとキャンセル機能(AbortSignal.timeout())をサポートする
    • 別途タイムアウト用ライブラリがなくても、一貫したエラー処理が可能
  • AbortController により、ファイルやネットワークなどさまざまな非同期処理でキャンセルパターンを実装できる
    • ユーザーの割り込みやタイムアウトに対して標準化された方法を提供する

3. 組み込みテスト: プロフェッショナルなテスト環境

  • 従来の Jest、Mocha などの外部フレームワークなしでも、Node.js 組み込みテストランナー により大半の要件を満たせる
    • node:testnode:assert で直感的なテストを書ける
  • テスト Watch モードカバレッジレポート などの開発支援機能も組み込まれている
    • コードを修正するたびに自動でテストを実行
    • Node.js 20 以降で実験的なカバレッジ機能を提供

4. 進化した非同期パターン

  • async/await は広く使われているが、現代の Node.js では並列実行と高度なエラーハンドリングパターンの活用が重視されている
    • Promise.all() で並列処理を行い、単一の try/catch でコンテキスト情報を含むエラー処理を行う
  • AsyncIterator の活用により、逐次的なイベント処理やフロー制御が容易になった

5. 高度なストリーム機能と Web 標準互換性

  • ストリーム API は Web 標準(Streams API)との互換性を備えるようになった
    • Readable.fromWebReadable.toWeb により、Node.js とブラウザ間でストリーム変換が可能
  • pipeline(Promise ベース)関数により、直感的で安全なストリームパイプラインを構築できる

6. Worker Threads: CPU 集約型処理の並列化

  • WorkerThreads を使うことで、JS の単一スレッドという限界を克服し、マルチコアを活用できる
  • メインループをブロックすることなく、複雑な計算や大規模データ処理が可能

7. 開発体験の革新

  • --watch フラグにより、nodemon なしでコード変更の検知と自動再実行が可能
  • --env-file フラグにより、dotenv は不要となり、環境変数をすぐに利用できる
  • 開発環境の構成がシンプルになり、より素早く整えられるようになった

8. セキュリティとパフォーマンス監視の組み込み

  • 実験的な Permission Model により、ファイルやネットワーク接続などアプリケーション権限を制限できる
    • 最小権限の原則を実装しやすく、セキュリティ要件の順守に有利
  • perf_hooks により、組み込みのパフォーマンス計測や低速な処理の自動分析・記録が可能

9. 配布とパッケージングの近代化

  • SEA(Single Executable Application) のサポートにより、Node.js とアプリを単一バイナリとして配布できる
    • Node.js がない環境でも容易に配布・インストールできる

10. 現代的なエラー処理と診断

  • 構造化されたエラークラス により、豊富なコンテキストと診断情報を含む一貫したエラーオブジェクトを渡せる
  • diagnostics_channel により、カスタムのイベントベース診断データ送信と監視の自動化が可能

11. モジュール解決とパッケージ管理の進化

  • Import Maps により、内部パスを別個の名前空間として管理できる
    • 内部モジュールの分離とリファクタリングのしやすさが向上
  • 動的 import により、環境や設定に応じて実行時にコードを読み込み、コード分割を行える

要点の整理と今後の展望

  • Node.js では Web 標準への準拠組み込みツールの最大活用現代的な非同期パターンの採用 が重要である
  • Worker Threads などの高性能な並列処理と、診断・セキュリティ機能 によって、専門家向けのプラットフォームへと発展している
  • 単一実行ファイル配布モジュール名前空間 などの新機能により、運用のしやすさが大きく増している
  • これらのパターンは既存コードと互換性を保ちながら、段階的に導入できる
  • 2025 年以降も Node.js は着実に進化を続け、ここで紹介したこうしたモダンなパターンは将来志向のアプリケーションの基盤となっていく見込みである

3件のコメント

 
sanori 2025-08-07

Denoでprojectを作り始めながら「わあ、こんなこともできるんだ」と思っていたのですが、node.jsも似たように変化しているんですね。

 
dnltmdwhd 2025-08-05

おお、これで axios を使わなくても、fetch でそのままできるんだね

 
GN⁺ 2025-08-04
Hacker Newsの意見
  • 最大の変化はESMではなく、NodeにfetchAbortControllerが組み込まれたことだと思う。axiosやnode-fetchを削除できて、Lambdaバンドルのサイズも減り、コールドスタートの遅延も約100ms短縮された。習慣的にnpm i axiosを使っている人にとって、2025年のNodeリリースはそれをやめるタイミングだ
    • API呼び出しとバリデーションを両方カバーするts-restをフルスタックで好んで使っている。zod/json schema系ライブラリの中で最も軽量でありながら、堅牢な型安全性を提供してくれる。HTTPクライアントも好きなものを差し替えられるし(bun、nodeエンジンではfastifyを選んでいる)、オーバーヘッドはあるものの、型安全性をコンパイル段階へ移せる点で十分に価値がある選択だと思う。もっと良い代替案や考えがあれば知りたい。見つけられる限り探したが、軽量さと型安全性の両方を満たせたのはts-restだけだった
    • fetchの文法やawait response.jsonなど追加の例外処理作業はあまり好きではなかった。axiosを使っていたときのほうがずっと直感的だ。サンプルコードでもaxiosなら単純にresponse.dataを処理できるが、fetchは自分でstatusを確認してからJSONをパースしなければならず、より煩雑だ
    • ライブラリ作者としては、むしろESM導入のほうがはるかに大変で痛みも大きかったが、それだけの価値があるアップグレードだった。fetch自体も素晴らしいが、ESMのおかげで本当に多くのものを得られた
    • node fetchはaxiosよりずっと簡単でシンプルなので、そのほうが良い。まだaxiosを使い続けている人がいることに驚いた
    • 組み込みのリクエストライブラリであるUndiciにとても期待している。undici公式サイト 参照
  • 次のように、ファイルシステムやネットワークへのアクセス権を制限して実行できるようになった
    # ファイルシステムアクセス制限の例
    node --experimental-permission \
      --allow-fs-read=./data --allow-fs-write=./logs app.js
    
    # ネットワーク制限の例
    node --experimental-permission \
      --allow-net=api.example.com app.js
    
    Denoから着想を得たように見える。本当に素晴らしい機能だ。Denoのパーミッション機能ドキュメント
  • chalkやpicocolorsをインストールしなくても、 もう 直接テキストのスタイリングができるようになった
    const { styleText } = require('node:util');
    
    公式styleTextドキュメント 参照
  • すぐに適用できることをいろいろ知れた
    1. Nodeに組み込みテストが入ったので、jestをあえて使う必要がなくなった
    2. Nodeにwatch機能も内蔵されたので、nodemonも不要になった
    • 今でもjestのほうを好んでいる。jest-extendedが使えるからだ
    • Nodeの組み込みテストシステムは品質が低いと思う。実際に数週間使えばその理由が分かるし、Issueを上げてもNodeチームはあまり関心を示さない
  • Matteo Collinaによれば、node fetchは内部的にundiciのfetchを使っている。WHATWG Web Streamsを生成しなければならないため、本質的にundiciのrequest方式より遅い。
    言及しているYouTube,
    undiciの仕組みを解説したブログ
    • 気になる人のために、ベンチマークはここで見られる。最近M3 Max MacBook Proでローカル環境とネットワーク環境の両方をテストしたところ、undiciはローカルでは最速だったが、ネットワークではAxiosのほうが速い結果になった。理由は正確には分からないが、この1年半のundici利用体験は素晴らしかった。プロダクションでも十分安定して使えるが、優れた性能を最大限引き出すには、状況に応じた検討がやはり必要だ
  • NodeのネイティブなTypeScriptトランスパイラのおかげで、TSを使う人は複雑さがかなり減る
    • 実際には型を取り除くだけで、トランスパイルではない。TS enumのようなものは正しく動かない
    • まだ実用には不十分だ。Enumは気にしないが、拡張子なしのローカルファイルimportもできないし、コンストラクタでclass propertyを定義することもできない
    • --experimental-strip-typesフラグも もう 必要なくなった
  • 新機能をこういうふうに偶然知ることが多い。ブラウザを使うときのように、「それは最新だから」という漠然とした感覚がある。昔C#だけをやっていたころは新しい言語機能の紹介を読んで本当にワクワクしたが、今はいろいろな言語を並行して使っているので、1つの言語だけを追い続けるのも簡単ではない。ほぼブログや周囲の影響によるランダム学習だ
    • Node(V8)のニュースにかなり関心があるので、2〜3か月ごとにリリースノートを読んでこうした機能を追っている。時にはECMA proposalsも読む。pipeline operatorがぜひ入ってほしい
  • しばらくNodeエコシステムから距離を置いていたが、改めて見ると本当に興味深い新機能が増えていた。DenoとBunが市場を揺さぶったことで、Node開発陣がいっそう奮起した結果だと思う
  • NodeはますますBun.jsやDenoなどとの競争の中で、侮れない存在へと変わりつつある。そうした相互競争はJSランタイムの発展にとって前向きだ
    • 変化は遅いが着実で歓迎している。それでもBunの$ shell functionはまだ恋しい。JSをスクリプトのように使えるのが本当に便利なので、サーバーに2つのランタイムを一緒に載せたいとは思わない
  • ブラウザと同じように、Nodeの新機能も2つに分けられると思う
    1. まったく新しい技術
    2. 既存機能の上に載った「見栄えを良くする」段階のレイヤー
      人々がどちらにより重きを置くのかを見るのも面白い
    • ある人にとっての「見栄えレイヤー」が、別の人にとっては使いやすさ(ergonomics)になりうる