Node.js 26.1.0 がリリースされました
製造ビジネステクノロジー部の小林です。
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) = 3、sqrt(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.aborted が true になり、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 対応 |
ターミナルの表示が豊かに |








