Alat command line hidup dari argumen: node salin.mjs lama.txt baru.txt memberi tahu program berkas mana yang harus diproses dan ke mana hasilnya ditulis. Node.js menyerahkan seluruh argumen tersebut kepada kode kita melalui satu array bernama process.argv — mentah, tanpa pemilahan, persis seperti yang diketik pengguna. Pada chapter ini kita membedah anatomi array ini, memahami mengapa dua elemen pertamanya tidak pernah kita sentuh, lalu mencoba memilah flag dan argumen posisi secara manual sebagai bekal sebelum beralih ke alat parsing yang lebih tinggi tingkatnya.
Anatomi process.argv #
Property process.argv adalah array berisi perintah lengkap yang dipakai menjalankan program. Dua elemen pertama bersifat teknis dan isinya bergantung pada mesin, sedangkan elemen indeks 2 ke atas berasal dari pengguna:
| Elemen | Isi | Sumber |
|---|---|---|
argv[0] | Path ke executable node | Diisi runtime, berbeda tiap komputer |
argv[1] | Path ke berkas skrip kita | Diisi runtime, berbeda tiap komputer |
argv[2] dst. | Argumen dari pengguna | Diketik setelah nama berkas |
Berkas anatomi.mjs di bawah sengaja hanya mencetak jumlah elemen dan potongan argumen pengguna — bukan seluruh isi array:
console.log("jumlah elemen :", process.argv.length);
console.log("argumen pengguna:", process.argv.slice(2));Output yang Dihasilkan:
jumlah elemen : 4
argumen pengguna: [ 'laporan.csv', '--ringkas' ]Program di atas dijalankan dengan perintah node anatomi.mjs laporan.csv --ringkas. Mari kita cermati hasilnya: array berisi empat elemen, dua di antaranya adalah path teknis, dan slice(2) memotong tepat pada bagian yang diketik pengguna sehingga tersisa laporan.csv dan --ringkas. Inilah kontrak yang dipakai hampir semua program Node.js: process.argv.slice(2) adalah masukan pengguna yang sesungguhnya.
Semua Elemen Berjenis String #
Shell mengirim argumen sebagai teks, sehingga angka yang diketik pengguna pun tiba sebagai string. Berkas konversi.mjs menerima dua angka lalu menjumlahkannya:
const [pertama, kedua] = process.argv.slice(2);
console.log("pertama:", pertama, `(${typeof pertama})`);
console.log("jumlah :", Number(pertama) + Number(kedua));Output yang Dihasilkan:
pertama: 40 (string)
jumlah : 42Dua hal terlihat dari hasilnya. Operator typeof membuktikan bahwa 40 tiba sebagai string, bukan number — penjumlahan dua string "40" dan "2" dengan + hanya akan menempelkan keduanya menjadi "402", sehingga konversi lewat Number() wajib dilakukan lebih dulu. Kedua, destructuring const [pertama, kedua] = ... mengambil dua elemen pertama dari potongan argumen; bila pengguna tidak memberikan apa pun, keduanya bernilai undefined dan Number(undefined) menghasilkan NaN — program nyata sebaiknya memeriksa keberadaan argumen sebelum memakainya.
Memilah Flag Secara Manual #
Konvensi command line membedakan dua jenis argumen: argumen posisi (laporan.csv) dan flag yang diawali -- (--ringkas). Dengan pengetahuan slice(2) dan startsWith(), kita sudah bisa memilah keduanya. Berkas parsing-manual.mjs memisahkan flag dari argumen posisi:
const masukan = process.argv.slice(2);
const posisi = [];
const flag = [];
for (const arg of masukan) {
if (arg.startsWith("--")) {
flag.push(arg.slice(2));
} else {
posisi.push(arg);
}
}
console.log("posisi :", posisi);
console.log("flag :", flag);
console.log("mode ringkas:", flag.includes("ringkas"));Output yang Dihasilkan:
posisi : [ 'laporan.csv' ]
flag : [ 'ringkas', 'urut' ]
mode ringkas: trueMari kita telaah baris-per-baris kode di atas:
- Baris 1 (
process.argv.slice(2)): seluruh argumen pengguna diambil sekaligus ke variablemasukan; dua path teknis di depan dibuang. - Baris 5-11 (
for ... of ...): setiap argumen diperiksa. Yang diawali--dipotong awalannya lewatslice(2)lalu masuk arrayflag; sisanya dianggap argumen posisi dan masuk arrayposisi. - Baris 13-15: hasil pemilahan dicetak.
flag.includes("ringkas")menunjukkan cara termudah mengecek status sebuah flag — cukup periksa keanggotaannya di array.
Pendekatan manual ini bekerja untuk kasus sederhana, tetapi cepat menjadi rumit begitu kebutuhan bertambah: opsi bernilai seperti --prioritas=tinggi, bentuk pendek -p tinggi, kombinasi keduanya, sampai validasi opsi asing akibat salah ketik. Semua aturan itu sudah tersedia di util.parseArgs() bawaan Node.js — module yang menjadi fokus chapter berikutnya.
Referensi lanjutan untuk topik chapter ini: