Setiap kali kita menjalankan node berkas.mjs, sebuah proses baru lahir di sistem operasi — dan object global process adalah jendela kita ke proses itu. Lewat object inilah kode JavaScript membaca argumen command line, mengakses environment variable, mengetahui direktori kerja dan platform, menulis ke stream output, sampai mengatur bagaimana proses berakhir. Tidak ada import yang diperlukan karena process tersedia di mana saja, dan pada chapter ini kita membedah bagian-bagiannya satu per satu dalam konteks pembuatan alat CLI yang nyata.
Argumen CLI dengan process.argv #
Property process.argv adalah array berisi seluruh kata yang diketik pengguna saat menjalankan program. Dua elemen pertama bersifat teknis: indeks 0 berisi path ke executable node dan indeks 1 berisi path ke berkas skrip — keduanya absolut dan nilainya berbeda di setiap komputer, sehingga hampir semua program hanya peduli pada elemen indeks 2 ke atas. Berkas argumen-cli.mjs memperlihatkan strukturnya:
const argumen = process.argv;
console.log("jumlah elemen:", argumen.length);
console.log("argv.slice(2):", argumen.slice(2));
console.log("tipe elemen :", typeof argumen[2]);Output yang Dihasilkan:
jumlah elemen: 4
argv.slice(2): [ 'laporan.csv', '--kirim' ]
tipe elemen : stringProgram di atas dijalankan dengan perintah node argumen-cli.mjs laporan.csv --kirim, sehingga array argv berisi empat elemen: dua path teknis di depan, lalu "laporan.csv" dan "--kirim" dari pengguna. Dua hal perlu dicermati dari outputnya. Pertama, slice(2) adalah cara standar membuang bagian teknis dan mengambil murni masukan pengguna. Kedua, tipe setiap elemen selalu string — angka yang diketik pengguna pun tiba sebagai teks dan perlu dikonversi sebelum dihitung. Untuk memilah flag dan nilai opsi dari array mentah ini, kita sudah punya alat yang lebih tinggi tingkatnya: parseArgs() dari module node:util pada chapter sebelumnya.
Environment Variable lewat process.env #
Environment variable adalah kumpulan pasangan kunci-nilai yang disiapkan sistem operasi untuk setiap proses — cara klasik menyimpan konfigurasi di luar kode, misalnya mode aplikasi atau alamat layanan eksternal. Property process.env membaca dan menulis kumpulan tersebut. Berkas env-variabel.mjs mendemonstrasikan perilaku dasarnya dengan variable yang dibuat di dalam skrip sendiri:
process.env.MODE_APLIKASI = "pengembangan";
console.log("MODE_APLIKASI:", process.env.MODE_APLIKASI);
console.log("tipe nilai :", typeof process.env.MODE_APLIKASI);
process.env.BATAS_UANG = 500;
console.log("BATAS_UANG :", process.env.BATAS_UANG, "(", typeof process.env.BATAS_UANG, ")");
delete process.env.MODE_APLIKASI;
console.log("setelah delete:", process.env.MODE_APLIKASI);Output yang Dihasilkan:
MODE_APLIKASI: pengembangan
tipe nilai : string
BATAS_UANG : 500 ( string )
setelah delete: undefinedTiga perilaku penting terlihat dari output di atas. Penugasan process.env.BATAS_UANG = 500 menyimpan string "500", bukan angka — semua nilai environment variable berupa string, sama seperti argv, sehingga konversi tipe kembali menjadi tanggungan kita. Operator delete melepas variable dan membuat pembacaan berikutnya menghasilkan undefined. Terakhir, process.env memang terlihat seperti object biasa, tetapi implementasinya khusus: penulisan hanya memengaruhi proses berjalan dan proses anak yang kita lahirkan, bukan environment variable shell induk.
Keluar dengan process.exit #
Proses berakhir dengan sebuah kode keluar (exit code): angka 0 berarti sukses, selain itu berarti gagal. Skrip shell, CI, dan tool lain membaca kode ini untuk memutuskan langkah berikutnya. Method process.exit(kode) mengakhiri proses seketika dengan kode pilihan kita — berguna untuk berhenti lebih awal saat masukan tidak layak diproses. Berkas keluar.mjs menolak berjalan tanpa argumen:
import { parseArgs } from "node:util";
const { positionals } = parseArgs({ allowPositionals: true });
if (positionals.length === 0) {
console.error("Nama berkas wajib diberikan sebagai argumen.");
process.exit(1);
}
console.log(`Memproses berkas: ${positionals[0]}`);Output yang Dihasilkan:
Nama berkas wajib diberikan sebagai argumen.Pesan penolakan sengaja dikirim lewat console.error agar tertulis ke process.stderr — stream yang memang diperuntukkan bagi pesan galat — bukan ke process.stdout tempat hasil program biasa mengalir. Pemisahan dua stream ini penting supaya pemakai program tetap bisa memipakan output standarnya ke tool lain tanpa tercemar pesan error. Dari sisi shell, kode keluar tersebut bisa diperiksa langsung:
node keluar.mjs
echo "kode keluar: $?"Bila argumen diberikan, program berjalan normal dan keluar dengan kode 0:
node keluar.mjs laporan.csvOutput yang Dihasilkan:
Memproses berkas: laporan.csvDirektori Kerja, Platform, dan Stream Output #
Tiga kelompok informasi lain sering dibutuhkan program CLI. Property process.cwd() berisi direktori kerja — folder tempat perintah node dijalankan, yang bisa berbeda dari lokasi berkas skrip; nilainya absolut, jadi berkas contoh di bawah hanya mencetak nama folder terakhirnya lewat path.basename(). Property process.platform dan process.arch melaporkan sistem operasi dan arsitektur CPU, pasangan yang menentukan perilaku kode lintas platform. Adapun process.stdout dan process.stderr adalah stream tempat console.log() dan console.error() menulis. Berkas info-proses.mjs merangkum semuanya:
import path from "node:path";
console.log("cwd (nama folder):", path.basename(process.cwd()));
console.log("platform :", process.platform);
console.log("arsitektur :", process.arch);
console.log("versi Node.js :", process.version);
process.stdout.write("ditulis lewat ");
process.stdout.write("process.stdout");
console.log(" tanpa baris baru");Output yang Dihasilkan:
cwd (nama folder): module-process
platform : linux
arsitektur : x64
versi Node.js : v24.21.0
ditulis lewat process.stdout tanpa baris baruNilai linux, x64, dan nama folder pada output adalah kondisi komputer tempat contoh diuji — di komputer lain nilainya bisa win32 atau darwin, arm64, dan nama folder yang berbeda. Baris terakhir memperlihatkan process.stdout.write(): method yang menulis persis apa adanya, tanpa menambahkan baris baru seperti console.log(), dan berguna saat kita merangkai output sepotong-sepotong seperti indikator progres.
Event Siklus Akhir Proses #
Object process adalah emitter — kita bisa memasang listener untuk event siklus hidupnya, dan dua yang terpenting menandai akhir proses. Event beforeExit terpicu saat event loop kosong dan proses hendak berakhir secara alami; inilah kesempatan terakhir menjalankan pekerjaan ringan. Event exit terpicu tepat sebelum proses benar-benar berakhir, dan di dalamnya hanya kode sinkron yang dijamin berjalan. Berkas siklus-proses.mjs memasang kedua listener sekaligus:
process.on("beforeExit", (kode) => {
console.log(`beforeExit dengan kode ${kode}`);
});
process.on("exit", (kode) => {
console.log(`exit dengan kode ${kode}`);
setTimeout(() => {
console.log("baris ini tidak pernah tampil");
}, 0);
});
console.log("kode utama selesai");Output yang Dihasilkan:
kode utama selesai
beforeExit dengan kode 0
exit dengan kode 0Urutan outputnya rapi: kode utama selesai, beforeExit menyala karena event loop kosong, lalu exit menyala sebagai penutup. setTimeout() di dalam listener exit sengaja dipasang untuk membuktikan bahwa pekerjaan asynchronous yang didaftarkan pada tahap itu tidak pernah dijalankan — proses tidak menunggu event loop terisi kembali. Satu konsekuensi praktisnya: pemanggilan process.exit() yang eksplisit melewati beforeExit, seperti dibuktikan snippet berikut:
process.on("beforeExit", () => console.log("tidak akan tampil"));
console.log("segera keluar");
process.exit(0);Output yang Dihasilkan:
segera keluarHanya segera keluar yang tercetak; listener beforeExit tidak pernah terpanggil karena proses diakhiri lewat process.exit(), bukan oleh event loop yang kosong.
Dengan process, program kita kini sadar diri: tahu argumen yang diberikan, konfigurasi dari environment, di folder mana berjalan, di platform apa, dan kapan harus pergi dengan kode keluar yang sopan. Satu lapisan informasi masih tersisa di bawah proses: sistem operasi itu sendiri. Chapter penutup section ini membedah node:os — sumber informasi platform, CPU, memori, dan akhir baris yang benar untuk tiap sistem.
Referensi lanjutan untuk topik chapter ini: