Memahami Istilah Penting di Node.js – Node-API, Addon C/C++, FFI, ABI, POSIX, dan Evolusi Runtime JavaScript

I am an enthusiastic researcher and developer with a passion for using technology to innovate in business and education.
Dalam dunia JavaScript backend, terutama ketika membicarakan performa, integrasi native, dan kompatibilitas lintas platform, ada beberapa istilah teknis yang wajib dipahami. Artikel ini membahas secara lengkap berbagai istilah tersebut, serta hubungannya dengan Node.js dan alternatif modern seperti Bun.
🧩 1. Node-API (N-API)
Apa itu Node-API?
Node-API (sering disebut N-API) adalah abstraksi resmi dalam Node.js untuk membangun native addon dengan bahasa C atau C++.
Ini adalah API tingkat stabil yang memungkinkan kita:
memanggil fungsi C/C++
membuat modul
.nodemengakses memory native
melakukan operasi berat (misal image processing, machine learning, crypto)
Kelebihan Node-API
Stabil: tidak rusak meski Node.js update major version
Lintas-OS: binary bisa di-build untuk Linux, Mac, dan Windows
Didukung resmi: cocok untuk library besar seperti
sharp,bcrypt,node-canvas,puppeteer(Chromium bindings), dantensorflow.js-node
Contoh library yang menggunakan Node-API
Sharp (image processing)
Canvas (render)
Bcrypt native
TensorFlow.js Node binding
SQLite native addons
ZeroMQ
libusb
Inilah alasan Node.js sangat kuat di ekosistem native.
🧩 2. Node Addon C/C++
Apa itu addon?
Addon adalah file binary dengan ekstensi:
.node(khusus Node.js)menggunakan Node-API atau nan
hasil compile dari C/C++ ke format binary OS
Addons menghubungkan JavaScript dengan performa native.
Contoh:
libtensorflow_linux.node
bcrypt_win32.node
canvas.node
Addon ini hanya bisa dijalankan oleh Node.js, bukan Bun, bukan Deno.
🧩 3. FFI (Foreign Function Interface)
Pengertian
FFI adalah cara memanggil library .so, .dll, .dylib langsung dari JavaScript tanpa membuat Node addon.
FFI menyediakan API seperti:
ffi.open("libexample.so").symbols.myFunction();
Kelebihan FFI
Sangat fleksibel
Tidak tergantung Node-API
Tidak perlu compile ulang
.node
Kekurangan
Tidak secepat Node-API
Bergantung pada format OS (ELF, Mach-O, PE)
Status
Node.js → ada modul pihak ketiga (
ffi-napi)Bun → punya FFI bawaan
Deno → punya FFI bawaan
🧩 4. ABI (Application Binary Interface)
ABI menentukan:
bagaimana function dipanggil (calling convention)
bagaimana register CPU dipakai
struktur memory
binary format (
.so,.dll,.dylib)cara loader memuat library
Perbedaan ABI antar OS
| OS | Format | ABI |
| Linux | ELF | glibc/musl |
| MacOS | Mach-O | libc Apple |
| Windows | PE | Win32/MSVC |
Addons Node.js untuk Linux tidak bisa dipakai di MacOS atau Windows → karena ABI berbeda.
ABI = “bahasa native” CPU/OS.
🧩 5. POSIX / POSIX-Compliant
POSIX = standar sistem operasi mirip UNIX (Portable Operating System Interface).
OS yang POSIX-compliant:
Linux
macOS
FreeBSD
OS yang TIDAK POSIX:
- Windows
Dampak Utama POSIX
Inilah sebab library seperti sharp, canvas, libvips, cairo, freetype, png, dll lebih mudah jalan:
Linux → ✔
macOS → ✔
Windows → ❌ khusus (perlu build tool yang rumit)
POSIX membuat:
filesystem mirip
permission mirip
libc mirip
syscall mirip
Karena itu dev tool Linux/Mac jauh lebih kompatibel.
🧩 6. PUB (Portable POSIX-like UNIX Binary)
PUB = binary yang kompatibel di sistem UNIX-like (Linux & macOS), karena hal seperti:
struktur folder mirip
standar libc mirip
mode file mirip
toolchain compatible (clang/gcc)
Tetapi PUB tidak kompatibel ke Windows karena format PE berbeda.
🧩 7. Hubungan Semua Istilah: Kenapa di Node Bisa, Tapi di Bun Tidak?
TensorFlow.js Node
memakai Node-API
memakai addon
.nodelibtensorflow C++ sangat besar
butuh loader
process.dlopen()milik Node.js
Node.js → bisa
Karena Node membuat ekosistem lengkap di atas:
ABI stabil
Node-API stabil
modul
.nodenode-gyp
Bun → tidak bisa
Karena Bun:
tidak 100% support Node-API
tidak support binary
.node(C++ addon)tidak punya loader native seperti Node.js
Bun cepat, tetapi bukan pengganti semua fitur Node.
🧩 8. Node.js Sekarang Mengikuti Perkembangan Bun
Dulu Node.js lambat berinovasi. Tetapi mulai Node 18–20–22:
Node sekarang punya:
--watch--env-file--experimental-loadernode:test(testing bawaan Node)ESM lebih stabil
flag modern
--run,--importruntime API lebih rapi
Untuk testing cepat → bisa pakai:
Vitest
Node:test
TAP
Node sekarang sudah modern, meski tidak secepat Bun di cold start.
🧩 9. Node.js ESM vs Bun ESM
Node ESM:
paling kompatibel
paling luas dukungannya
dipakai oleh library besar
lambat tapi stabil
Bun ESM:
sangat cepat
banyak fitur built-in
tetapi tidak mendukung native addon
.node
Sederhananya:
| Feature | Node | Bun |
| Speed | ❗ lambat | ⚡ sangat cepat |
| Native C++ addon | ✔ penuh | ❌ tidak |
| FFI | modul pihak ketiga | ✔ built-in |
| Testing built-in | ✔ | ✔ |
| Dependency cleanup | sedang berkembang | sangat bagus |
| Kompatibilitas NPM | paling lengkap | hampir lengkap |
| ML/AI Native | ✔ (tfjs-node, onnxruntime-node) | ❌ |
🧩 10. Kesimpulan Besar
✔ Node.js:
paling kompatibel
mendukung Node-API, addon
.node, native modulekuat untuk AI, gambar, multimedia, ML
lebih matang berkat ESM modern,
--watch,--env, dannode:test
✔ Bun:
paling cepat
lengkap untuk web dev (HTTP, HTMLRewriter, test, env)
tapi tidak cocok untuk native-heavy workloads seperti:
TensorFlow
FFmpeg full bindings
GPU processing
TensorRT, CUDA, OpenCV
POSIX, ABI, Node-API, FFI =
fondasi untuk mengerti mengapa library tertentu bisa jalan di Node.js tapi tidak di Bun.





