Masalah dependensi sering baru terasa ketika aplikasi dipindahkan ke komputer lain atau masuk ke server produksi. Kode yang kemarin berjalan normal tiba-tiba gagal dibangun karena versi paket berubah, dependensi transitif berbeda, atau ada library yang sudah memiliki celah keamanan.
Di sinilah lockfile berperan. Lockfile adalah berkas yang mencatat versi pasti dari paket-paket yang dipakai sebuah proyek, termasuk dependensi tidak langsung. Pada ekosistem Node.js, berkas ini biasanya bernama package-lock.json. Banyak developer pemula menganggapnya sebagai file otomatis yang boleh dihapus. Padahal, untuk sebagian besar proyek, lockfile adalah bagian penting dari sumber kode.
Apa fungsi lockfile sebenarnya?
File package.json biasanya menyimpan rentang versi yang boleh digunakan. Contohnya, penulisan ^4.18.0 memberi ruang bagi npm untuk memilih versi minor atau patch yang masih dianggap kompatibel. Fleksibilitas ini berguna, tetapi juga berarti hasil instalasi dapat berubah seiring waktu.
Hari ini, proyek mungkin mendapatkan versi 4.18.2. Beberapa minggu kemudian, tanpa perubahan pada kode aplikasi, proses instalasi dapat mengambil versi yang lebih baru selama masih memenuhi aturan tersebut. Dependensi dari paket lain juga bisa berubah dan membawa kombinasi paket yang berbeda.
Menurut dokumentasi npm, package-lock.json menggambarkan pohon dependensi yang benar-benar dihasilkan sehingga instalasi berikutnya dapat menghasilkan pohon paket yang sama. Dengan kata lain, package.json menjelaskan paket apa yang boleh dipakai, sedangkan lockfile mencatat paket mana yang benar-benar dipakai. Dokumentasi npm menjelaskan bahwa lockfile sebaiknya disimpan di repositori agar rekan satu tim, server deployment, dan sistem CI mendapatkan dependensi yang konsisten.
Jangan menghapus lockfile hanya karena terlihat besar
Ukuran lockfile memang bisa mencapai ribuan baris. Itu bukan berarti isinya tidak berguna. Setiap entri membantu package manager mengetahui versi, lokasi paket, serta hubungan antar-dependensi.
Lockfile juga membuat perubahan dependensi lebih mudah ditinjau. Ketika seseorang memperbarui sebuah library, perubahan pada file ini dapat terlihat dalam pull request. Tim bisa memeriksa apakah pembaruan hanya menyentuh satu paket atau ikut mengganti banyak dependensi transitif.
Namun, lockfile bukan jaminan bahwa semua paket aman. Ia hanya membuat komposisi dependensi lebih dapat diprediksi. Paket yang sudah dikunci pada versi lama tetap bisa memiliki kerentanan. Karena itu, konsistensi dan keamanan harus diperlakukan sebagai dua pekerjaan yang saling melengkapi.
Bedakan npm install dan npm ci
Kesalahan umum dalam pipeline deployment adalah menggunakan perintah yang tidak sesuai. npm install dirancang untuk memasang paket sekaligus menyelesaikan atau memperbarui lockfile bila diperlukan. Jika isi package.json dan lockfile tidak cocok, npm dapat melakukan resolusi ulang.
Sementara itu, npm ci ditujukan untuk instalasi yang bersih dan konsisten di lingkungan otomatis seperti CI atau server build. npm mendokumentasikan bahwa perintah ini mengharuskan package.json dan lockfile berada dalam kondisi sinkron. Ia tidak dimaksudkan untuk mengubah manifest proyek selama proses instalasi.
Contoh alur sederhana di mesin developer:
npm install
npm testContoh alur yang lebih ketat untuk pipeline:
npm ci
npm test
npm run buildPendekatan ini membantu memastikan hasil build berasal dari versi dependensi yang sama dengan yang sudah disetujui tim. Jika lockfile tidak sinkron, pipeline gagal lebih awal. Itu lebih baik daripada deployment berhasil tetapi menghasilkan perilaku berbeda di server.
Lockfile dan keamanan: apa hubungannya?
Setiap dependensi tambahan memperluas attack surface, yaitu area yang berpotensi menjadi pintu masuk masalah. Bahkan paket yang tidak dipanggil langsung oleh kode kita dapat membawa dependensi lain yang ikut terpasang.
Karena itu, lakukan audit berkala dengan perintah:
npm audit
npm outdatednpm audit membantu menemukan kerentanan yang diketahui dalam pohon dependensi. Hasilnya tetap perlu dibaca dengan hati-hati: tidak semua peringatan memiliki dampak yang sama terhadap aplikasi, dan pembaruan otomatis kadang dapat memicu perubahan perilaku.
Untuk proyek yang disimpan di GitHub, Dependabot dapat memberi peringatan ketika dependensi rentan ditemukan dan membuat pull request pembaruan keamanan. GitHub juga menyediakan konfigurasi dependabot.yml untuk mengatur ekosistem paket dan jadwal pembaruan. Fitur tersebut bukan pengganti pengujian, tetapi dapat mengurangi kemungkinan pembaruan penting terlupakan. Panduan GitHub tentang pengamanan dependensi menjelaskan perbedaan antara alert, security update, dan version update.
Yang bisa dilakukan sekarang
- Commit lockfile ke repositori. Untuk proyek npm yang digunakan sebagai aplikasi, jangan memasukkan
node_modules, tetapi simpanpackage-lock.json. - Gunakan versi Node.js dan npm yang disepakati. File seperti
.nvmrcatau pengaturan versi di pipeline dapat membantu mengurangi perbedaan lingkungan. - Pakai
npm cidi CI dan deployment. Pastikan proses build memang dimulai dari instalasi bersih. - Tinjau setiap perubahan lockfile. Perhatikan paket baru, perubahan versi besar, dan skrip instalasi yang ikut berubah.
- Jadwalkan pembaruan kecil. Pembaruan rutin biasanya lebih mudah diuji daripada menunggu berbulan-bulan lalu melakukan upgrade besar sekaligus.
- Hapus dependensi yang tidak dipakai. Paket yang tidak lagi diperlukan hanya menambah ukuran proyek, waktu instalasi, dan potensi risiko.
Jangan mengejar “semua harus versi terbaru”
Versi terbaru tidak selalu menjadi pilihan terbaik pada hari pertama rilis. Pembaruan perlu dilihat dari changelog, kompatibilitas, hasil pengujian, dan dampaknya terhadap aplikasi. Untuk library yang menyentuh autentikasi, database, pembayaran, atau proses build, pemeriksaan manual tetap penting.
Praktik yang sehat bukan mengunci proyek selamanya, melainkan mengunci kondisi yang sedang digunakan lalu memperbaruinya secara terencana. Lockfile memberi titik acuan yang jelas. Pengujian memastikan perubahan tidak merusak fitur. Audit keamanan membantu menemukan masalah yang tidak terlihat dari kode aplikasi sendiri.
Bagi developer solo maupun tim kecil, kebiasaan ini mungkin terasa seperti pekerjaan tambahan. Namun, beberapa menit untuk menjaga dependensi tetap rapi jauh lebih murah daripada menghabiskan satu hari mencari tahu mengapa build produksi berbeda dari laptop lokal.
Sumber & bacaan lebih lanjut
- npm Docs: package-lock.json
- npm Docs: npm install
- GitHub Docs: Securing your dependencies
- GitHub Docs: About the dependabot.yml file
– Rio Yotto @rioyotto
