Node.js 26.1.0 がリリースされました

Node.js 26.1.0 がリリースされました

2026.05.09

製造ビジネステクノロジー部の小林です。

2026 年 5 月 7 日、Node.js 26.1.0(Current)がリリースされました。実験的なライブラリ連携機能(FFI)の追加をはじめ、暗号処理・HTTP・ファイル操作など幅広い領域で機能が追加・強化されています。本記事では、主要な変更点について紹介します。

リリース内容

Node.js 26.1.0 は 2026 年 4 月の Node.js 26.0.0 に続くマイナーアップデートです。実験的機能から安定機能までバランス良く含まれており、特にファイル操作やネットワーク処理の制御性が向上しています。

主要な変更点

1. 実験的機能:node:ffi モジュールの追加

今回のリリースで注目すべき変更は、node:ffi モジュールの追加です。

何ができるの?

C/C++ などで作られた既存のライブラリを、JavaScript から直接呼び出せるようになります。

従来、OS やサードパーティが提供する共有ライブラリ(.so (Linux)、.dll (Windows)、.dylib (macOS))を Node.js から利用するには、C/C++ でアドオンを書いてコンパイルする手間がかかりました。FFI を使えば、そのコンパイル作業なしに JavaScript だけで直接呼び出せます。

実装例

--experimental-ffi フラグをつけて実行します。

--experimental-ffi フラグとは実験的機能を有効にするためのフラグです。

node --experimental-ffi demo-05-ffi.mjs

OS 標準の数学ライブラリ(libm)の sqrt()(平方根)を JavaScript から呼び出す例です。

import { dlopen } from "node:ffi";

const { lib, functions } = dlopen("/usr/lib/libSystem.B.dylib", {
  sqrt: { result: "double", parameters: ["double"] },
});

console.log(functions.sqrt(9)); // => 3
console.log(functions.sqrt(16)); // => 4

lib.close();

実行結果

nodejs-26-1-0 %node --experimental-ffi demo-05-ffi.mjs
(node:73874) ExperimentalWarning: FFI is an experimental feature and might change at any time
(Use `node --trace-warnings ...` to show where the warning was created)
3
4

実行時に実験的機能の警告が表示されました。また、JavaScript から macOS のネイティブライブラリ関数 sqrt を呼び出し、sqrt(9) = 3sqrt(16) = 4 の計算結果が返されました。

セキュリティ上の注意点

公式ドキュメントに記載されているとおり、FFI を使う際は慎重に行う必要があります。

C 言語のライブラリを扱うため、以下のような誤りはプロセス全体をクラッシュさせ、通常の JavaScript の try-catch では捕捉できません。

  • 不正なメモリアクセス → 存在しないアドレスを参照してしまう
  • 型定義の誤り → 関数の引数・戻り値の型を間違える
  • 解放済みメモリへのアクセス → すでに解放されたメモリを読み書きする

さらに、読み込んだライブラリは Node.js のセキュリティモデル外で動作するため、悪意あるライブラリを読み込めばシステム全体に影響が及びます。

向いているケース 避けるべきケース
既存の安定した C ライブラリの活用 不特定多数が利用する Web サーバー
ローカルツール・CLI の高速化 信頼できないライブラリの読み込み
Node-API アドオンの移行検討 プロダクション環境(非推奨)

FFI は実験的機能のため、本番環境での使用は公式ドキュメントの推奨事項を確認した上で、慎重に行なったほうがよさそうです。

2. crypto.randomUUIDv7() の追加

crypto モジュールとは?

crypto は暗号化・ハッシュ生成・乱数生成などを扱う Node.js の標準モジュールです。パスワードのハッシュ化や、一意な ID の生成など、セキュリティ関連の処理で広く使われます。

UUID v4 と v7 の違い

データベースの ID として UUID は広く使われています。しかし従来の UUID v4 はランダムなため、データベースのインデックス性能が低下する問題がありました。今回追加された UUID v7 はこの問題を解決します。

UUID v4(従来)は完全にランダムな値のため、並べても時系列順にはなりません。一方 UUID v7 はタイムスタンプが埋め込まれており、生成順にソート可能です。

実装例

import { randomUUIDv7, randomUUID } from "node:crypto";

// UUID v4(ランダム)
const id4_1 = randomUUID();
const id4_2 = randomUUID();

// UUID v7(タイムスタンプ埋め込み)
const id7_1 = randomUUIDv7();
const id7_2 = randomUUIDv7();

console.log("UUID v4:");
console.log(`  ${id4_1}`);
console.log(`  ${id4_2}`);

console.log("UUID v7:");
console.log(`  ${id7_1}`);
console.log(`  ${id7_2}`);

実行結果:

$ nodejs-26-1-0 %node demo-01-uuid-v7.mjs
UUID v4:
  be518d36-78a6-477d-a62d-cbc1e25b3048
  a1017e24-e9a7-4733-a3d9-b9b22f7ddb47
UUID v7:
  019e086e-315b-7daa-81dc-d5ddbf26883f
  019e086e-315b-7e5d-a7fd-a0c03e43341a

3. http モジュールの強化:req.signal の追加

http モジュールとは?

http は HTTP サーバー・クライアントを作るための Node.js 標準モジュールです。http.createServer() で Web サーバーを立てられます。Express や Fastify などの Web フレームワークも、内部ではこのモジュールを使っています。

import http from "node:http";

const server = http.createServer((req, res) => {
  // req: リクエスト情報(URL・ヘッダー・ボディなど)
  // res: レスポンスを返すためのオブジェクト
  res.end("Hello World");
});

server.listen(3000);

今回の変更:req.signal の追加

長時間実行される API では、クライアントが途中で接続を切断することがあります。これまで Node.js はそれを検知しても処理を続けてしまい、無駄なリソース消費につながっていました。今回の改善でこの問題が解決します。

http.createServer() のコールバックに渡される req(リクエストオブジェクト)に signal プロパティが追加されました。クライアントが接続を切断すると signal.abortedtrue になり、abort イベントが発火します。

4. その他の主要な変更点

fs.stat()signal オプションが追加

fs.stat() はファイルのメタ情報(サイズ・更新日時など)を取得する関数です。今回 signal オプションが追加され、AbortController でキャンセル制御できるようになりました。ネットワークストレージなど、ハングする可能性のあるファイル操作で役立ちます。

import { stat } from "node:fs/promises";

const controller = new AbortController();
setTimeout(() => controller.abort(), 2000); // 2 秒後にキャンセル

try {
  const stats = await stat("/slow/network/path", { signal: controller.signal });
  console.log(stats.size);
} catch (err) {
  if (err.name === "AbortError") {
    console.log("stat がキャンセルされました");
  }
}

テストランナー(node:test)の強化

テストの実行順序をランダム化できるようになりました(--test-randomize-order フラグ)。テスト間の意図しない依存関係を発見するのに役立ちます。

また、AbortSignal.timeout のモックに対応し、タイムアウト処理のテストが簡単に書けるようになりました。

util.styleText() が Hex カラーに対応

ターミナル出力に任意のカラーコードで色を付けられるようになりました。

import { styleText } from "node:util";

console.log(styleText("#ff6600", "Orange text"));
console.log(styleText("#0066ff", "Blue text"));
console.log(styleText("bold", "Bold text")); // 従来のスタイルも利用可能

stream.duplexPair() の破棄伝播

双方向ストリームのペアで、一方を破棄すると他方にも破棄が伝わるようになりました。メモリリークの防止に役立ちます。

process の改善

execve(2) の失敗時にプロセスが強制終了(abort)していた挙動が、通常の例外(throw)に変更されました。エラーハンドリングがより直感的になります。

依存ライブラリのアップデート

Node.js 26.1.0 に含まれる主要な依存ライブラリ:

ライブラリ バージョン 用途
npm 11.13.0 パッケージマネージャー
undici 8.2.0 HTTP クライアント
OpenSSL 3.5.6 暗号化・TLS
SQLite 3.53.0 軽量 DB(node:sqlite
corepack 0.34.7 npm/yarn 管理

まとめ

Node.js 26.1.0 の主要な変更点をまとめます。

機能 効果
node:ffi C ライブラリの直接呼び出しが可能に(実験的)
randomUUIDv7() ソート可能 UUID で DB インデックス性能向上
req.signal クライアント切断検知で無駄な処理をキャンセル
fs.stat() signal ファイル操作をキャンセル制御可能に
テストランナー強化 ランダム実行でテスト品質向上
styleText() Hex 対応 ターミナルの表示が豊かに

参考リンク

この記事をシェアする

関連記事