- PR #57761 đưa node:ffi vào Node.js core, cho phép JS gọi thẳng vào thư viện C mà không cần node-gyp.
- SST sponsor để OpenTUI chạy trên Node, dự kiến release sau ~1 tháng.
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 OpenCode và OpenTUI) đã 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.UnsafePointervàUnsafePointerView— pointer arithmetic và read memory thô.- Type system:
i8/u8…i64/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-napiuserland — 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
| Property | Giá trị |
|---|---|
| PR | nodejs/node#57761 |
| Tác giả | tianxiadys (với SST sponsor) |
| Merged | 15/04/2026 |
| Backend | libffi (vendored) |
| Build flag | --with-ffi |
| Runtime flags | --experimental-ffi + --allow-ffi |
| Platforms | Win 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
| Property | Node node:ffi | ffi-napi | Bun bun:ffi | Deno FFI |
|---|---|---|---|---|
| Nằm ở đâu | Node core | npm userland | Bun core | Deno core |
| Backend | libffi | libffi + N-API | TinyCC JIT | libffi |
| Build step | Không | node-gyp | Không | Không |
| Overhead | Thấp | Cao | Rất thấp | Thấp |
| Callback C → JS | Có | Có | Có | Có |
| Trạng thái | Experimental | Stale | Stable | Stable |
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ớinode: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-ffitrong 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-ffisẽ 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.
