Setiap proyek punya rangkaian perintah yang dijalankan berulang: menjalankan aplikasi, mengeksekusi pengujian, memformat berkas. Mengetik perintah-perintah itu satu per satu di terminal membosankan dan mudah salah — apalagi bila tiap anggota tim mengingat urutannya secara berbeda. Field scripts di package.json mengubah perintah-perintah itu menjadi pintasan bernama yang dapat dipanggil lewat npm run, sehingga seluruh tim menjalankan proses yang sama persis dengan satu kata. Chapter ini membahas mekanisme npm scripts mulai dari perintah dasar, hook pre dan post, penerusan argument, sampai pintasan khusus npm start dan npm test.
Field scripts dan npm run #
Bundle chapter ini adalah proyek mini bernama demo-scripts dengan lima script terdaftar:
{
"name": "demo-scripts",
"version": "1.0.0",
"description": "Demonstrasi npm scripts untuk Course Node.js",
"type": "module",
"scripts": {
"salam": "node salam.js",
"sapa": "node sapa.js",
"preuji": "echo Persiapan pengujian...",
"uji": "node uji.js",
"postuji": "echo Pengujian selesai.",
"start": "node salam.js",
"test": "node uji.js"
}
}Setiap kunci di dalam scripts adalah nama pintasan, dan nilainya adalah perintah shell yang dijalankan dari akar proyek. Pemanggilannya memakai npm run diikuti nama script:
npm run salamOutput yang Dihasilkan:
> [email protected] salam
> node salam.js
Halo dari npm scripts!Dua baris pertama output adalah banner dari npm, bukan dari kode kita: baris > [email protected] salam menyatakan proyek dan nama script yang berjalan, lalu baris > node salam.js menampilkan perintah persis yang dieksekusi. Setelah banner, output berpindah ke hasil perintah itu sendiri — pada contoh di atas, satu baris dari salam.js. Banner ini memudahkan kita membaca campuran output saat satu script menjalankan beberapa perintah berurutan.
Hook pre dan post #
Perhatikan tiga script berkaitan pada package.json di atas: preuji, uji, dan postuji. npm mengenali awalan pre dan post sebagai hook — script yang berjalan sebelum dan sesudah script utama. Cukup jalankan npm run uji, dan ketiganya berjalan berurutan:
npm run ujiOutput yang Dihasilkan:
> [email protected] preuji
> echo Persiapan pengujian...
Persiapan pengujian...
> [email protected] uji
> node uji.js
Menjalankan pengujian...
2 pengujian lulus
> [email protected] postuji
> echo Pengujian selesai.
Pengujian selesai.Urutan output memperlihatkan mekanismenya: preuji berjalan lebih dulu, baru uji, lalu postuji. Script uji sendiri menjalankan uji.js — berkas yang memuat dua pernyataan assert dari core module node:assert/strict sehingga klaim “2 pengujian lulus” memang hasil pemeriksaan nyata, bukan cetakan statis. Pola hook seperti ini lazim dipakai untuk pekerjaan persiapan dan pembersihan: membangun aset sebelum deploy, atau menghapus berkas sementara setelah pengujian.
Meneruskan Argumen dengan – #
Nilai sebuah script tidak harus berhenti pada perintah tetap. Argument tambahan dapat diteruskan lewat tanda --, dan argument tersebut tiba di program melalui process.argv:
const nama = process.argv[2] ?? "teman";
console.log(`Halo, ${nama}!`);npm run sapa -- BudiOutput yang Dihasilkan:
> [email protected] sapa
> node sapa.js Budi
Halo, Budi!Segala yang tertulis setelah -- ditempelkan ke akhir perintah script — banner memperlihatkan perintah final node sapa.js Budi. Di dalam sapa.js, process.argv memuat ["node", "sapa.js", "Budi"], sehingga process.argv[2] berisi "Budi"; operator ?? menyediakan nilai "teman" saat pemanggil tidak meneruskan argument apa pun. Mekanisme sederhana ini membuat satu script cukup untuk banyak variasi pemanggilan.
Pintasan npm start dan npm test #
Beberapa nama script begitu umum sehingga npm menyediakan pemanggilan tanpa kata run: npm start, npm test, npm stop, dan npm restart. Dua script bersangkutan telah terdaftar pada package.json kita:
npm startOutput yang Dihasilkan:
> [email protected] start
> node salam.js
Halo dari npm scripts!npm testOutput yang Dihasilkan:
> [email protected] test
> node uji.js
Menjalankan pengujian...
2 pengujian lulusPemanggilan npm start menjalankan script bernama start persis seperti npm run start — output keduanya identik karena perintah yang dieksekusi sama. Perhatikan pula bahwa npm test hanya menjalankan script test tanpa menyentuh uji, karena hook pre/post terikat pada nama: npm test mencari pretest dan posttest, bukan preuji dan postuji. Lupa membedakan keduanya adalah sumber kebingungan klasik saat script terlihat “lupa” menjalankan persiapannya.
Perintah npm run tanpa nama script menampilkan daftar seluruh pintasan yang tersedia:
npm runOutput yang Dihasilkan:
Lifecycle scripts included in [email protected]:
start
node salam.js
test
node uji.js
available via `npm run`:
salam
node salam.js
sapa
node sapa.js
preuji
echo Persiapan pengujian...
uji
node uji.js
postuji
echo Pengujian selesai.Daftar tersebut terbagi dua bagian: script lifecycle yang punya pintasan khusus, dan seluruh script lainnya yang dipanggil lewat npm run. Bagi anggota tim yang baru bergabung, satu kali npm run langsung memetakan semua kemampuan proyek — tidak perlu membaca dokumentasi untuk menemukan cara menjalankan aplikasi atau pengujian.
Proyek kita kini lengkap sebagai konsumen package: dependencies terkelola, versi terbaca, perintah terpintaskan. Satu langkah tersisa untuk menutup Section ini — membalik peran menjadi penyedia: membungkus kode sendiri menjadi package yang punya nama, versi, dan pintu masuk yang rapi. Prosesnya menanti pada Chapter Membuat Package Sendiri.