TL;DR

Pull request #57761 (ffi: Initial implementation) vừa được merge vào main của nodejs/node ngày 15/04/2026. Node.js giờ có module node:ffi built-in — JavaScript gọi trực tiếp thư viện C-ABI, không cần node-gyp, không cần viết N-API addon. SST (công ty đứng sau OpenCodeOpenTUI) đã sponsor phần lớn công việc này để OpenTUI có thể chạy trên Node. Theo Dax Raad, feature sẽ có trong release kế tiếp, khoảng 1 tháng nữa.

Có gì mới

Node.js bổ sung một module core hoàn toàn mới: node:ffi. API bề mặt gồm:

  • dlopen(path, symbols) — load shared library (.so, .dylib, .dll) với map symbol đã gắn type.
  • UnsafeCallback — wrap một function JS để C gọi ngược lại vào JS.
  • UnsafePointerUnsafePointerView — pointer arithmetic và read memory thô.
  • Type system: i8/u8i64/u64, f32/f64, pointer, buffer, void.

Ví dụ load User32 trên Windows:

const { dlopen } = require('node:ffi');
const lib = dlopen('user32', {
  EnumWindows: { result: 'i32', parameters: ['pointer', 'u64'] }
});

Feature là experimental, phải bật đồng thời hai flag: --experimental-ffi (bật API) và --allow-ffi (cấp quyền trong Permission Model). Build Node từ source cần thêm --with-ffi; binary chính thức từ nodejs.org sẽ tự include.

Vì sao quan trọng

Trước đây, muốn gọi thư viện C từ Node bạn có ba lựa chọn, đều khó chịu:

  • Viết N-API addon — phải có C/C++, node-gyp, rebuild theo version Node, đau đầu với prebuilt binary.
  • Dùng ffi-napi userland — nhanh bị bỏ rơi mỗi lần Node lên major, hiệu năng chậm do phải đi qua lớp N-API + bridge JS.
  • Chuyển sang Bun hoặc Deno — cả hai đều có FFI built-in từ lâu, nhưng không phải team nào cũng đổi runtime được.

Với node:ffi, Node cuối cùng cũng có API cùng hình dạng với Bun và Deno. Library ship một file .so C-ABI là chạy được trên cả ba runtime với binding gần như giống hệt — giảm fragmentation trong ecosystem JS.

Chi tiết kỹ thuật

PropertyGiá trị
PRnodejs/node#57761
Tác giảtianxiadys (với SST sponsor)
Merged15/04/2026
Backendlibffi (vendored)
Build flag--with-ffi
Runtime flags--experimental-ffi + --allow-ffi
PlatformsWin x64/arm32/arm64, Linux x86/x64/arm32/arm64, macOS x64/arm64
Không hỗ trợWindows x86 (32-bit)

So sánh với các runtime khác

PropertyNode node:ffiffi-napiBun bun:ffiDeno FFI
Nằm ở đâuNode corenpm userlandBun coreDeno core
Backendlibffilibffi + N-APITinyCC JITlibffi
Build stepKhôngnode-gypKhôngKhông
OverheadThấpCaoRất thấpThấp
Callback C → JS
Trạng tháiExperimentalStaleStableStable

Use cases

  • OpenTUI trên Node — động cơ chính của PR này. Core render của OpenTUI viết bằng Zig, compile ra shared lib C-ABI, hôm nay load qua Bun.dlopen(). Với node:ffi, chính file .so/.dylib/.dll đó chạy được trên Node bằng một shim mỏng.
  • OpenCode và terminal.shop — cả hai đều dùng OpenTUI, giờ có thể phục vụ cả người dùng Node, không ép cài Bun.
  • Terminal UI frameworks — Ink (React TUI) và đồng bọn có thể mượn rendering core native mà không cần N-API addon.
  • Thư viện native dùng chung — GPU (wgpu), audio (miniaudio), crypto (libsodium), OS API (Win32, Cocoa) — ship một C-ABI binary là dùng được cho cả Node, Bun, Deno.

Hạn chế & giá

  • Hoàn toàn free, open source, là feature core của Node.js.
  • Experimental: API có thể đổi, phải bật flag mới chạy.
  • Yêu cầu --allow-ffi trong Permission Model — gọi C tuỳ ý tương đương chạy code tuỳ ý, nên Node coi đây là một capability cần cấp quyền riêng.
  • Chưa có async / non-blocking call trong v1 — C call lâu sẽ block event loop. Workaround hiện tại: worker threads.
  • Không hỗ trợ Windows x86 32-bit.
  • Custom build không bật --with-ffi sẽ không có module.

Tiếp theo là gì

Node release train: feature sẽ vào current line (dự kiến v25.x) trong khoảng 1 tháng nữa, cuối tháng 5/2026. Sau đó sẽ có các PR follow-up bù các thứ v1 còn thiếu: threadSafe callback, non-blocking async call, UnsafePointerView method parity với Deno, và cuối cùng là promote sang stable, về LTS.

Về phía SST, Dax Raad xác nhận OpenTUI sẽ có adapter @opentui/node chính thức ngay khi release Node lên. Nghĩa là trong vòng một tháng tới, bạn sẽ có thể npm i @opentui/core @opentui/node và viết TUI React/Solid chạy bằng node --experimental-ffi --allow-ffi app.js — không cần Bun.

Nguồn: nodejs/node#57761, @thdxr trên X, OpenTUI DeepWiki, OpenTUI docs.