Siklus pengembangan klasik Node.js berputar pada tiga ketukan: simpan berkas, tekan panah atas, tekan enter. Kecil memang, namun berlipat ribuan kali sehari — dan setiap kali server perlu dinyalakan ulang, konsol kehilangan jejak permintaan yang sedang kita amati. Watch mode memotong ketukan terakhir: dengan satu flag, Node.js memantau berkas yang dipakai program lalu memulai ulang begitu salah satunya berubah. Chapter ini menghidupkan flag tersebut, membaca keluarannya, dan melihat apa yang terjadi pada berkas dependensi — bukan hanya titik masuk.
Satu Flag, Bukan Satu Package #
Dulu, restart otomatis adalah wilayah package seperti nodemon — dipasang, dikonfigurasi, dijaga versinya. Sejak Node.js 18.11, kemampuan itu menjadi bagian runtime lewat flag --watch, dan stabil pada Node.js 19.2. Perbandingannya sederhana:
| Aspek | node --watch | package pihak ketiga |
|---|---|---|
| Pemasangan | tidak ada | devDependency tambahan |
| Yang dipantau | module graph program | bergantung konfigurasi |
| Restart | otomatis saat berkas berubah | otomatis, dengan opsi lebih kaya |
| Fitur lanjutan | minimal | ignore list, ekstensi kustom, notifikasi |
Untuk kebutuhan sehari-hari — satu server, satu titik masuk, restart cepat — tabel ini condong ke flag bawaan. Package eksternal tetap relevan saat aturan pemantauannya tidak biasa, namun kini itu pilihan, bukan prasyarat.
Menghidupkan Watch Mode #
Bahan ujinya aplikasi dua berkas: sebuah titik masuk yang mencetak nomor versi dari module konfigurasi:
export const versi = 1;import { versi } from './konfigurasi.mjs';
console.log(`aplikasi berjalan - versi ${versi}`);Jalankan sekali tanpa flag sebagai pembanding — sekali jalan, sekali selesai:
node aplikasi.mjsOutput yang Dihasilkan:
aplikasi berjalan - versi 1Sekarang dengan watch mode, sambil mengubah konfigurasi.mjs di tengah sesi — persis seperti menyimpan berkas dari editor:
node --watch aplikasi.mjs
# ...lalu di editor: ubah "versi = 1" menjadi "versi = 2" di konfigurasi.mjsOutput yang Dihasilkan:
aplikasi berjalan - versi 1
Completed running 'aplikasi.mjs'. Waiting for file changes before restarting...
Change detected in konfigurasi.mjs'
Restarting 'aplikasi.mjs'
aplikasi berjalan - versi 2
Completed running 'aplikasi.mjs'. Waiting for file changes before restarting...Mari kita baca urutan peristiwanya:
aplikasi berjalan - versi 1: program jalan pertama kali, sama seperti tanpa flag.Waiting for file changes before restarting...: proses anak selesai (program kita memang selesai begitu mencetak), namun watcher — proses induk yang memantau — tetap hidup menunggu.Change detected in 'konfigurasi.mjs': kita mengubah dependensi, bukan titik masuk — dan tetap terdeteksi. Watch mode memantau seluruh module graph: berkas yang diimpor, diimpornya lagi, seterusnya. Inilah bagian yang membuatnya berguna pada proyek multi-berkas.Restarting 'aplikasi.mjs': program dijalankan ulang dari awal — modul dibaca ulang,console.logmencetak versi baru, lalu kembali menunggu.
Baris sed -i pada sesi demonstrasi hanyalah cara mengubah berkas dari terminal secara terulang; pada kerja nyata, editor yang melakukan ini setiap kali kita menyimpan.
Server yang Tidak Pernah Selesai #
Contoh pertama sengaja pendek agar urutan restart terbaca jelas. Kasus sebenarnya justru kebalikannya: peladen yang hidup terus — dan di situlah watch mode paling terasa, karena tidak ada proses anak yang selesai. Berkas peladen.mjs adalah peladen HTTP terkecil yang bisa dibangun:
import http from 'node:http';
const pesanSiap = 'peladen siap menerima permintaan';
const server = http.createServer((_req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' });
res.end(pesanSiap);
});
server.listen(0, '127.0.0.1', async () => {
const jawaban = await fetch(`http://127.0.0.1:${server.address().port}/`);
console.log(pesanSiap, '- jawaban HTTP', jawaban.status);
// Peladen sungguhan dibiarkan mendengarkan terus - prosesnya
// tetap hidup selama ada koneksi yang didengarkan. Di sini kita
// menutupnya agar demonstrasi berakhir dengan rapi.
server.close();
});Output yang Dihasilkan:
peladen siap menerima permintaan - jawaban HTTP 200Perhatikan bahwa program ini memakai pola listen(0) dari seluruh demo Course ini — satu permintaan fetch sebagai bukti hidup, tanpa perlu port tetap, lalu server.close() menutup sesi dengan rapi. Peladen sungguhan justru tidak menutup: koneksi yang terus didengarkan itulah yang menjaga proses tetap hidup — dan di bawah watch mode, setiap penyimpanan berkas menghentikan peladen lama, memulai yang baru, dan baris peladen siap... tercetak lagi. Umpan balik penuh, tanpa satu pun ketukan keyboard dari kita.
Kapan Berkas Lain Ikut Dipantau #
Aturan dasarnya ringkas: berkas yang masuk ke module graph ikut dipantau; berkas yang dibaca saat runtime dengan fs.readFile tidak. Berkas .env yang termuat lewat --env-file, misalnya, tidak memicu restart — flag itu berlaku sekali saat proses menyala. Begitu pula berkas data yang dibaca program: pengubahannya tidak terdeteksi, karena Node tidak tahu berkas mana yang “penting” bagi program kita selain yang diimpor. Daftar flag yang menyertai --watch — termasuk cara memperlambat laju restart — terdokumentasi di referensi CLI Node.js
.
Kemampuan yang menyempurnakan siklus ini satu tingkat lagi adalah menjalankan test otomatis setiap perubahan — node --watch --test menggabungkan keduanya, dan akan kita singgung pada section ini juga. Sebelum itu, ada satu flag modern lain yang menghapus ritual menyalin-nilai-konfigurasi ke terminal: berkas environment dengan --env-file.