FFI 模組轉為預設啟用,不再需要實驗旗標
Node.js Blog · 2026-09-16
Node.js 的 node:ffi 模組不再需要額外的啟動旗標才能載入,它從一個必須手動開啟的實驗功能,變成裝好就能直接 import 的內建模組。這項改動收錄在 Node.js 26.9.0(Current)版本說明中,於 2026-09-16 發布,由 Matteo Collina 送出的 PR #65475 實作。
背景:FFI 為什麼一直掛著實驗旗標
FFI(Foreign Function Interface,外部函式介面)讓 JavaScript 能直接呼叫編譯好的原生函式庫,例如用 dlopen 載入一支 .so/.dll,再取用裡面的 C 函式。這種能力天生危險:官方文件明白寫著,傳入錯誤指標、對不上的函式簽章,或存取已經釋放的記憶體,都可能直接讓行程崩潰或造成記憶體損毀。正因如此,過去只要沒有明確加上 --experimental-ffi,node:ffi 就完全載入不了,等於用旗標當成一道「你必須知道自己在做什麼」的門檻。這也是多數帶原生互操作能力的 API(包含 Permission Model 底下的 --allow-ffi)採取的保守策略。
核心改動:旗標變成相容性空操作
26.9.0 把這道門檻拿掉。node:ffi 現在預設就在模組清單裡,不需要任何旗標即可 import 或 require;--experimental-ffi 依然存在,但只是相容性用的空操作(no-op),加不加都不影響行為。真正想關掉這個模組的專案,要改成明確加上 --no-experimental-ffi。值得注意的是,API 本身的穩定度標記並沒有跟著「轉正」:文件仍標示 Stability: 1 - Experimental,第一次載入時也照樣會印出 ExperimentalWarning,做法呼應先前 node:sqlite 的推出方式——預設可用,但仍留一道 opt-out 旗標,API 也隨時可能改動。
| 項目 | 26.9.0 之前 | 26.9.0 起 |
|---|---|---|
載入 node:ffi | 需加 --experimental-ffi | 免旗標,預設可用 |
--experimental-ffi 的作用 | 開啟模組 | 相容性空操作,不影響行為 |
| 要停用模組 | 不加旗標即可 | 需明確加 --no-experimental-ffi |
| 穩定度標記/警告 | Stability: 1,載入時有 ExperimentalWarning | 不變,仍是 Stability: 1 並會顯示警告 |
| Permission Model | 需 --allow-ffi | 不變,仍需 --allow-ffi |
呼叫方式本身沒有變,官方文件給的範例大致如下:
// 之前:一定要帶旗標啟動
// node --experimental-ffi app.js
import { dlopen, suffix } from 'node:ffi';
{
using handle = dlopen(`./mylib.${suffix}`, {
add_i32: { arguments: ['int32', 'int32'], return: 'int32' },
});
console.log(handle.functions.add_i32(20, 22)); // 42
}
// 之後:直接執行即可
// node app.js對誰有影響、該做什麼
已經在用 --experimental-ffi 呼叫原生程式碼的專案,CI/建置腳本上的旗標不會壞掉,留著或清掉都行,因為它現在什麼都不做。真正要留意的是反過來的情境:若專案原本仰賴「不加旗標等於 FFI 用不了」當成安全邊界,例如在 sandbox 執行不受信任的程式碼,26.9.0 起這個假設不再成立,必須主動加上 --no-experimental-ffi,或搭配 Permission Model 的 --allow-ffi 白名單機制維持限制。底層 API 仍標示 Stability: 1,升版時仍要留意函式簽章或 DynamicLibrary 介面是否調整。
同版本的其他變動:Web Workers 與實驗性 DTLS
26.9.0 同時收錄了 Node.js 對標準 Web Workers 的原生實作(PR #64894,作者 Aviv Keller),並附上 WPT(Web Platform Tests)測試覆蓋,讓瀏覽器規格定義的 Worker 行為在 Node.js 裡有了對應實作,不只是既有的 node:worker_threads。
另外還加入實驗性的 DTLS(Datagram Transport Layer Security)API(PR #63182,作者 James M Snell)。DTLS 是把 TLS 的加密與身分驗證機制搬到 UDP 這類不保證順序、可能遺失封包的傳輸協定上,常見於 WebRTC、VPN 等場景,這次先在 src 與 lib 落地,並補上 interop 測試與統計支援。
- VFS(Virtual File System)與 CJS/ESM 模組載入器整合(PR
#63653),並新增 ZipProvider 掛載 ZIP 檔、從掛載檔案系統載入原生 addon 等能力,使用自訂 loader 或 VFS 掛載的專案升版後要重新核對行為。 - 新增
node:bench效能測試模組,同樣是實驗性質,需搭配--experimental-bench旗標才能使用。