2024年10月から2025年4月にかけて、JavaScriptの実行環境であるNode.js、Deno、Bunはそれぞれ大きな進化を遂げました。特にNode.jsはLTSバージョンの登場、Denoは初のLTSリリース、BunはNode.js互換性のさらなる向上と独自の高速APIの追加など、各ランタイムの個性と方向性が明確になった期間と言えるでしょう。
本記事では、2024年10月から2025年4月までの主要な更新ポイントをまとめ、それぞれのランタイムがどこに向かっているのかを解説します。
Node.js
Node.jsはこの半年で、最新メジャーバージョンであるv24のリリース、そして長らく利用されてきたv18のサポート終了という大きな節目を迎えました。
Node.js v24 の現状と LTS
- v24 リリース (2025年4月末): Node.js の最新メジャーバージョンがリリースされました
- 2025年10月から LTS: 今秋より長期サポート (LTS) の対象となり、本番環境での利用候補となります
- v18 サポート終了 (2025年4月末): 広く使われていた v18 がサポート終了となりました。v18 利用者は v20 (Maintenance LTS) または v22 (Active LTS) への移行を検討する必要があります
Node.js v24 注目アップデート
Node.js v24 では、V8 エンジン更新による言語機能対応や、プラットフォーム機能の強化が行われています。
1. V8 v13.6 アップデートと注目の JS 言語機能
最新のV8エンジンの搭載により、新しいJavaScript言語機能が利用可能になりました。
-
明示的リソース管理 (
using
/await using
):
リソース(ファイルハンドル、DB接続など)の解放処理を簡潔かつ安全に記述する新しい構文です。旧来のtry...finally
ブロックに代わり、スコープを抜ける際に自動的にリソースをクリーンアップします。旧方式
const handle = resource.open(); try { // handle を使用 } finally { // 必ず閉じなければならない handle.close(); }
新方式 (
using
){ // スコープ開始 using handle = resource.open(); // ここでリソースを取得 // handle を使用(スコープ内で安全に利用可能) // ... 途中で return や throw しても大丈夫 ... } // スコープ終了時、handle が自動で閉じられる
コードが簡潔になり、クリーンアップ漏れを防ぎます。
-
RegExp.escape()
メソッドの追加:
文字列を正規表現の一部として安全に埋め込む際に、特殊文字を自動でエスケープする組み込み関数です。旧方式 (手動エスケープ例)
function escapeRegExpOld(string) { // 覚えるのが大変、漏れる可能性も return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); } const pattern = escapeRegExpOld("user.name"); new RegExp(pattern);
新方式 (
RegExp.escape()
)const pattern = RegExp.escape("user.name"); // 標準で安全なエスケープ new RegExp(pattern);
より安全で標準的な正規表現の動的生成が可能になります。
-
Error.isError()
メソッドの追加:
任意の値がError
インスタンスであるかを確実に判定できる標準メソッドです。特に異なる JavaScript Realm (例: Node.js のvm
コンテキスト) 間でinstanceof Error
が正しく機能しない問題を解決しますMDN Web Docsより引用:
Error.isError()
の使用例// 以下はすべて true を返す Error.isError(new Error()); Error.isError(new TypeError()); Error.isError(new DOMException()); try { 1 + 1n; } catch (e) { console.log(Error.isError(e)); // 演算が TypeError をスローしたため、これは true を返す } // 以下はすべて false を返す Error.isError(); Error.isError({}); Error.isError(null); Error.isError(undefined); Error.isError(17); Error.isError("Error"); Error.isError(true); Error.isError(false); // これはエラーではない。なぜならオブジェクトは Error コンストラクターによって // 初期化されたプライベートプロパティを持っていないから Error.isError({ __proto__: Error.prototype });
instanceof
とError.isError()
の比較
Error
インスタンスをチェックする場合、Error.isError()
はレルムをまたいで機能するため、instanceof
よりも推奨されます。const iframe = document.createElement("iframe"); document.body.appendChild(iframe); const xError = window.frames[window.frames.length - 1].Error; const error = new xError(); // エラーの正しいチェック方法 Error.isError(error); // true // error のプロトタイプは xError.prototype であり、 // Error.prototype とは異なるオブジェクト error instanceof Error; // false
信頼性の高いエラーチェックが可能になります。
- Float16Array: 16ビット浮動小数点数配列を効率的に扱え、特定のシーンでメモリ使用量を削減できます
- WebAssembly Memory64: WebAssembly が 4GB 以上のメモリ空間を扱えるようになり、大規模データ処理が可能になります
2. 権限モデルの改善 (-permission
フラグ)
Node.js プロセスがアクセスできるファイルシステム、ネットワーク、子プロセスなどを細かく制限できるセキュリティ機能です。フラグが -experimental-permission
から -permission
に変更され、機能の安定化と本番利用への意欲が示されました。最小権限の原則を強制し、アプリケーションの安全性を高めます。
3. その他の主なアップデート
- npm v11, Undici v7 アップデート: 付属する主要ツールが更新され、パッケージ管理や HTTP クライアントの性能・互換性が向上しました
- AsyncLocalStorage 性能向上: 非同期コンテキスト追跡の基盤が効率化され、透過的に性能が改善されます
- URLPattern グローバル化: URL パターンマッチング API が require/import 不要で直接使え、利便性が向上しました
-
テストランナー強化: 内蔵の
node:test
が子テストの完了を自動で待つようになり、テストコードの記述がより直感的になりました
Deno
この半年で v2.1 → v2.3 へ進化。Node互換 & ユーザー体験がさらに向上!
- 初の LTS リリース (v2.1): 重要なマイルストーンとして、初めて長期サポート (LTS) バージョンが登場しました。これにより、安定性を重視する環境での採用が進むと期待されます
-
WASM の直接インポート:
.wasm
ファイルを JavaScript/TypeScript モジュールのように直接 import できるようになりました。手動での読み込みやパーミッションが不要になり、Wasm の利用が劇的に簡素化されました -
OpenTelemetry 組み込みサポート (v2.2, v2.3): アプリケーションのログ、メトリクス、トレース収集のための OpenTelemetry がランタイムに統合されました。
Deno.serve
や Workspace、node:http
などの API が自動的に計測され、オブザーバビリティ対応が容易になります -
node:sqlite
サポート (v2.2): Node.js のnode:sqlite
モジュールが実装され、Deno でも組み込みまたはファイルベースの SQLite データベースを簡単に扱えるようになりました -
deno compile
強化 (FFI/ネイティブアドオン) (v2.3):deno compile
でビルドしたバイナリが FFI (Foreign Function Interface) や Node.js ネイティブアドオンを使用できるようになりました。外部のネイティブライブラリを含むスタンドアロンアプリケーションの配布が可能になります - ローカル npm パッケージ対応 (v2.3): 開発中のローカルにある npm パッケージを Deno プロジェクトから参照できるようになり、npm パッケージ開発者のワークフローが改善されました
-
JavaScript 言語機能サポート (
using
など): Node.js と同様にusing
構文が JavaScript コードで利用可能になったほか、Iterator helpers など新しい標準 JS 機能のサポートが進みました
Bun
Bunは最速ランタイム+オールインワン志向でv1.2に到達。
-
Node.js 互換性の大幅向上: Node.js テストスイートの実行を開始し、多くの
node:
モジュール(http2
サーバー、dgram
、cluster
、zlib
、C++ アドオンなど)の互換性が大きく向上しました。これにより、既存の Node.js アプリケーションが Bun 上でより動作しやすくなっています -
ビルトイン S3 クライアント (
Bun.s3
) & Postgres クライアント (Bun.sql
) 追加: AWS S3 互換オブジェクトストレージと Postgres データベースへのアクセスを、Bun 独自の高性能なビルトイン API で提供します。クラウドネイティブなアプリケーション開発を効率化します -
パッケージマネージャーの改善:
-
ロックファイル形式がテキスト (
bun.lock
) に: バイナリ形式からテキスト形式に変更され、GitHub での差分確認やチーム開発でのマージが容易になりました -
bun patch
コマンド: 依存パッケージのソースコードにパッチを適用し、ローカルで修正を管理できるユニークな機能が追加されました -
その他:
package.json
でコメント/末尾カンマ対応、.npmrc
対応、bun outdated
/publish
/run --filter
など、多くの機能が追加・改善されています
-
ロックファイル形式がテキスト (
- Express ベンチマークで高速化: Node.js 互換性向上と内部最適化の結果、Express フレームワークを使った HTTP サーバのベンチマークにおいて、Node.js より最大 3 倍高速という結果が出ています。Bun の速度を象徴するアップデートです
まとめ・参考リンク
3大ランタイムともにNode/npm互換+独自機能強化が大きなトレンドです。
プロジェクト特性や今後の成長を考え、「どこまで互換性が必要か」「新機能でどんな価値を出せるか」など、選定や移行の参考にしてください。
公式情報・リリースノート
おわりに
「速度重視ならBun」「新技術好きはDeno」「互換性・エコシステム優先はNode.js」と選択肢も広がっています。自分のプロジェクトや学習に合ったランタイム選びの参考になれば幸いです。
ご意見・ご質問、コメント欄でお気軽にどうぞ!