Menjalankan kode dan REPL

Menjalankan berkas dengan node, memakai REPL, dan menulis program pertama.

Daftar isi

Setelah Node.js terpasang, kode JavaScript dapat dijalankan langsung dari command line. Topik ini membahas tiga cara utama menjalankan kode: melalui berkas .js, lewat opsi node -e dan node -p, serta melalui REPL interaktif. Sebuah program pertama berupa kalkulator baris perintah juga dibuat untuk merangkum pola pemakaian process.argv dan process.exit.

Menjalankan berkas dengan node#

Cara paling lazim menjalankan kode Node.js adalah menyimpan kode ke dalam berkas dengan ekstensi .js, lalu memanggilnya lewat perintah node. Buat berkas berikut pada direktori kerja.

js halo.js
console.log("Halo, dunia!");
text Keluaran
Halo, dunia!

Perintah node halo.js membaca berkas, mengompilasi isinya lewat V8, lalu mengeksekusi skrip pada satu thread utama. Setelah seluruh kode sinkron selesai dan tidak ada timer maupun operasi I/O tertunda, proses Node keluar dengan kode 0. Bila skrip memanggil process.exit(1) atau melempar error yang tidak tertangkap, proses keluar dengan kode bukan nol dan shell biasanya menampilkannya.

Opsi -e dan -p untuk kode sebaris#

Untuk kode yang sangat pendek, Node.js menyediakan dua opsi command line. Opsi -e (atau --eval) mengevaluasi sebuah string sebagai kode JavaScript, dan output apa pun yang dihasilkan oleh console.log dicetak ke stdout. Opsi -p (atau --print) juga mengevaluasi sebuah string, tetapi mencetak hasil ekspresi terakhir ke stdout tanpa perlu console.log.

bash
node -e "console.log(1 + 2)"
node -p "1 + 2"
text Keluaran
3
3

Kedua opsi cocok untuk pemeriksaan cepat seperti memeriksa nilai properti process.versions.v8 atau menghitung hasil ekspresi sederhana. Hindari memakai -e untuk kode yang lebih dari beberapa baris karena kutipan dan pelolosan karakter pada shell menjadi rumit. Pindahkan kode ke berkas .js begitu kompleksitasnya bertambah.

REPL Node.js#

REPL (Read-Eval-Print Loop) adalah mode interaktif yang membaca ekspresi dari stdin, mengevaluasinya, mencetak hasilnya, lalu kembali menunggu masukan berikutnya. REPL diaktifkan dengan menjalankan node tanpa argumen. Karena REPL bersifat interaktif dan memerlukan terminal, perintah berikut hanya ditampilkan sebagai rujukan dan tidak dieksekusi oleh verifikator.

bash
# tidak-dijalankan
node

Pada sesi REPL, ekspresi seperti 1 + 2 langsung dicetak hasilnya tanpa perlu console.log. REPL juga menyimpan hasil ekspresi terakhir pada variabel _. Beberapa perintah diawali dengan titik di dalam REPL. Perintah .help mencantumkan seluruh perintah REPL, .save nama.js menyimpan riwayat sesi ke sebuah berkas, .load nama.js mengevaluasi berkas baris demi baris seolah diketik manual, dan .exit keluar dari REPL.

REPL berguna untuk eksplorasi API Node.js (misalnya mencoba path.join atau crypto.randomUUID tanpa membuat berkas), menguji cuplikan kode sebelum menulisnya ke berkas, dan melakukan inspeksi cepat nilai objek. Untuk tugas yang berulang atau perlu disimpan, pindahkan ke berkas .js agar dapat dipanggil ulang.

Program pertama#

Sebagai rangkuman, buat sebuah kalkulator baris perintah sederhana yang menerima argumen operasi dan dua angka dari process.argv. Argumen baris perintah tersedia pada process.argv sebagai array, dengan dua elemen pertama adalah jalur executable node dan jalur berkas skrip. Sisa elemen mulai dari indeks dua adalah argumen yang diketik pengguna.

js kalkulator.js
const args = process.argv.slice(2);
const operasi = args[0];
const a = Number(args[1]);
const b = Number(args[2]);

if (!operasi) {
  console.log("Penggunaan: node kalkulator.js <tambah|kurang|kali|bagi> <a> <b>");
  console.log("Contoh: node kalkulator.js tambah 7 5");
  process.exit(0);
}

if (Number.isNaN(a) || Number.isNaN(b)) {
  console.error("Argumen a dan b harus berupa angka");
  process.exit(1);
}

let hasil;
switch (operasi) {
  case "tambah": hasil = a + b; break;
  case "kurang": hasil = a - b; break;
  case "kali": hasil = a * b; break;
  case "bagi": hasil = b === 0 ? "tidak terdefinisi" : a / b; break;
  default: console.error("Operasi tidak dikenal: " + operasi); process.exit(2);
}

console.log(hasil);

Bila kalkulator dipanggil tanpa argumen, skrip mencetak pesan penggunaan ke stdout dan keluar dengan kode 0. Keluaran ini dihasilkan oleh verifikator saat menjalankan berkas secara mandiri.

text Keluaran
Penggunaan: node kalkulator.js <tambah|kurang|kali|bagi> <a> <b>
Contoh: node kalkulator.js tambah 7 5

Operasi tambah menjumlahkan, sedangkan bagi membagi dan mengembalikan nilai pecahan apa adanya dari JavaScript. Jalankan kalkulator dengan dua argumen numerik berikut.

bash
node kalkulator.js tambah 7 5
node kalkulator.js bagi 10 4
text Keluaran
12
2.5

Validasi argumen di awal skrip memastikan program keluar dengan pesan jelas bila argumen tidak dikenali. Bila operasi yang diketik tidak termasuk dalam daftar tambah, kurang, kali, dan bagi, skrip mencetak pesan ke stderr dan keluar dengan kode 2.

bash
node kalkulator.js bagiku 1 2
text Keluaran
Operasi tidak dikenal: bagiku

Bila argumen numerik tidak dapat dikonversi menjadi bilangan, skrip mencetak pesan berbeda dan keluar dengan kode 1. Pemisahan kode keluar 1 (argumen tidak valid) dan 2 (operasi tidak dikenal) memudahkan shell script lain untuk membedakan jenis kesalahan.

Kesalahan umum#

Menyimpan berkas dengan ekstensi selain .js dan mengharapkan Node.js memuatnya lewat node berkas. Node.js memuat berkas dengan ekstensi .js, .mjs (modul ES eksplisit), dan .cjs (modul CommonJS eksplisit), tetapi ekstensi lain akan memicu error ERR_UNKNOWN_FILE_EXTENSION. Konsistenkan ekstensi .js untuk skrip biasa, .mjs bila modul ES diperlukan secara eksplisit, dan .cjs bila modul CommonJS harus dipaksakan pada proyek ESM.

Menganggap node -p dan node -e dapat dipakai bergantian. node -p mengevaluasi ekspresi terakhir dan mencetak hasilnya, sehingga cocok untuk ekspresi tunggal. node -e mengevaluasi seluruh kode sebagai skrip dan tidak mencetak apa pun kecuali ada console.log. Pemakaian node -p "console.log(1)" akan mencetak undefined karena nilai kembalian console.log adalah undefined, bukan hasil ekspresi yang diinginkan.

Lupa menangani error pada kode yang memakai operasi asinkron. Pada topik ini, contoh kalkulator bersifat sinkron sehingga error langsung tertangani oleh percabangan dan process.exit. Pada kode yang memakai callback atau promise, error yang tidak ditangkap akan membuat proses keluar dengan kode 1 dan pesan stack trace, meskipun kode tampak berjalan normal sebelumnya. Tangkap error lewat try/catch pada async/await, atau periksa argumen pertama callback sesuai konvensi Node.js ((err, result) => ...).

Ringkasan#

  • Berkas .js dijalankan dengan node berkas.js, dan proses keluar dengan kode 0 bila seluruh kode sinkron selesai tanpa error.
  • Opsi node -e mengevaluasi string kode dan bergantung pada console.log untuk mencetak, sedangkan node -p mengevaluasi dan langsung mencetak hasil ekspresi terakhir.
  • REPL diaktifkan dengan node tanpa argumen, mendukung perintah diawali titik (.help, .save, .load, .exit), dan menyimpan hasil terakhir pada variabel _.
  • process.argv menyimpan argumen baris perintah, dengan dua elemen pertama adalah jalur node dan jalur berkas skrip, sehingga argumen pengguna dimulai pada indeks dua. process.exit(n) mengakhiri proses dengan kode n.

Referensi#