Menjalankan Kode Program Native Di Node.js
Ada kalanya modul bawaan Node.js tidak cukup dan programmer perlu mengakses fitur native di sistem operasi. Untuk itu, Node.js memiliki fasilitas
memanggil kode program native yang ditulis dalam bahasa C/C++. Untuk mengetahui package yang menggunakan kode program native, saya dapat mencari
file berakhiran *.node
di node_modules
. Sebagai contoh, package fsevents
yang popular berisi kode program native dalam C untuk memberikan
notifikasi bila file di folder tertentu berubah di sistem operasi Mac. Pada artikel ini, saya akan mencoba memanggil kode program native C yang
menggunakan Xlib untuk menampilkan sebuah window di dekstop Linux.
Salah satu tool yang sangat membantu dalam proses kompilasi kode program C/C++ di aplikasi Node.js adalah node-gyp
. Karena akan sering menggunakannya di berbagai proyek yang berbeda, saya dapat meng-install node-gyp
secara global dengan menggunakan perintah npm install -g node-gyp
. Pada sistem operasi Ubuntu yang saya pakai, semua yang dibutuhkan oleh node-gyp
seperti Python, make
dan GCC
sudah tersedia.
Berikutnya, saya akan membuat sebuah kode program C bernama jendela.c
yang akan menggunakan Xlib untuk menampilkan sebuah window di desktop Linux. Isi kode program untuk jendela.c
terlihat seperti berikut ini:
Pada kode program C di atas, saya menggunakan Node-API yang menyediakan abstraksi untuk dalam berinteraksi dengan JavaScript (runtime V8).
Salah satu tujuan dari Node-API adalah untuk menghindari perubahan di kode program C setiap kali terjadi perubahan Node.js (saat versi baru dirilis). Sebagai contoh, pada kode program di atas, saya menggunakan napi_value
untuk mewakili nilai di JavaScript, menggunakan napi_get_value_string_utf8
untuk mengubah string yang dikirim dari JavaScript menjadi char*
(string di C) yang dapat dipakai di kode program C. Untuk informasi lebih lanjut mengenai apa saja yang disediakan oleh Node-API, saya dapat membaca dokumentasi Node.js di bagian C/C++ addons with Node-API.
Bagian yang paling pertama kali dikerjakan di kode program C di atas adalah NAPI_MODULE
yang mendaftarkan module dengan me-referensi-kan function Init
. Ini menyebabkan function Init
akan dikerjakan saat kode program JavaScript melakukan require()
module ini. Pada function Init
, saya mendaftarkan sebuah method yang dapat dipanggil di JavaScript dengan nama tampilkan()
. Bila method ini dipanggil di JavaScript, maka function Tampilkan
di C akan dikerjakan. Kode program function Tampilkan
akan membaca sebuah argumen string dari JavaScript dan menuliskannya ke layar melalui function XDrawString
dari Xlib.
Sebagai langkah berikutnya, saya akan membuat sebuah file baru dengan nama binding.gyp
dengan isi seperti berikut ini:
Ini adalah file konfigurasi yang dibutuhkan oleh node-gyp
. Saya menunjukkan lokasi file C saya di sources
dan juga nama output yang dihasilkan di target_name
. Karena kode program C saya tergantung pada library Xlib, saya menambahkan -lX11
pada link_settings.libraries
sama seperti saat saya melakukan kompilasi manual (yang biasanya diberikan ke linker seperti ld
). Setelah ini, saya bisa menjalankan perintah:
Perintah ini akan menghasilkan Makefile
di folder build. Saya hanya tinggal melakukan building saya dengan memberikan perintah berikut ini:
Hasil akhir dari proses ini adalah sebuah file dengan nama jendela.node
di folder build/Release
. Ini adalah kode program native yang bisa langsung saya pakai di kode program JavaScript. Sebagai contoh, saya membuat file latihan.js
dengan isi seperti berikut ini:
Bila saya menjalankan kode program ini dengan:
Saya akan mendapatkan hasil seperti berikut ini:
Selain mendemonstrasikan bagaimana Node.js dapat di-extend secara mudah melalui kode program native C/C++, hasil akhir di atas juga menunjukkan bahwa Node.js juga dapat menampilkan GUI native di sistem operasi yang menjalankannya.