Untuk menemukan apa yang membuat ukuran instalasi proyek Node menjadi besar di macOS, ukur paket-paket yang terinstal, lalu telusuri kandidat terbesar melalui pohon dependensi npm. Di Terminal, mulai dari direktori proyek: du menampilkan penggunaan disk, npm ls mencantumkan hierarki pohon yang terinstal, dan npm explain menunjukkan alasan sebuah paket ada. Perintah-perintah ini menjawab pertanyaan yang berbeda: ukuran menunjukkan apa yang memakan ruang; rantai dependensi menunjukkan apa yang membawanya masuk.
Mengukur paket yang terinstal di macOS
Buka Terminal, berpindahlah ke folder proyek, dan pastikan folder tersebut berisi node_modules sebelum melakukan pengukuran. Perintah berikut berfungsi di zsh default macOS dan menghindari ketergantungan pada perilaku wildcard shell:
cd "/path/to/your/project"
ls -ld node_modules
find node_modules -mindepth 1 -maxdepth 1 -type d -prune -exec du -sh {} + | sort -h
du -sh melaporkan total ukuran yang mudah dibaca manusia untuk setiap direktori tingkat pertama (immediate directory), dan sort -h mengurutkan total tersebut dari yang terkecil hingga terbesar. Baca dari bagian bawah untuk melihat entri terbesar. Perintah find mengukur setiap direktori tingkat atas satu kali: misalnya, perintah ini melaporkan node_modules/@example sebagai satu direktori scope gabungan, bukan setiap paket scoped secara terpisah. Ini adalah langkah awal yang berguna, bukan laporan biaya yang dapat diatribusikan secara individual ke setiap dependensi.
Jika perintah menyatakan bahwa node_modules tidak ada, proyek tersebut mungkin belum memiliki pohon dependensi yang terinstal, atau Anda mungkin berada di direktori yang salah. Periksa manajer paket dan lockfile proyek sebelum menginstal apa pun hanya untuk mengukurnya. Lockfile npm menjelaskan pohon dependensi yang telah diselesaikan (resolved), sedangkan file yang terinstal adalah apa yang diukur oleh du. Dokumentasi package-lock npm
Menelusuri direktori besar ke rantai dependensinya
Gunakan npm ls untuk memeriksa pohon dependensi logis npm. Output default-nya berfokus pada paket tingkat atas; --all memperluas daftar ke dependensi transitif. Dokumentasi npm ls
npm ls --all
Untuk proyek yang besar, daftar lengkapnya bisa sangat panjang dan sulit dikelola. Setelah Anda mendapatkan kandidat nama paket dari pohon tersebut, tanyakan kepada npm mengapa paket itu terinstal:
npm explain package-name
Ganti package-name dengan nama sebenarnya, seperti some-library. Output-nya akan mengikuti rantai dependensi menuju proyek utama (root). Jika npm melaporkan beberapa salinan atau versi, identifikasi lokasi terinstal yang relevan dalam daftar dan teruskan path tersebut ke npm explain, misalnya:
npm explain node_modules/parent-package/node_modules/package-name
npm mendokumentasikan npm explain untuk menelusuri rantai yang menyebabkan sebuah paket diinstal, termasuk folder tertentu saat dependensi bersarang (nested). Dokumentasi npm explain
Memeriksa paket scoped dan folder bersarang
Pengukuran pertama mengelompokkan scope seperti @example ke dalam satu direktori. Untuk memeriksa direktori paket tingkat pertama di dalamnya, jalankan:
find node_modules/@example -mindepth 1 -maxdepth 1 -type d -prune -exec du -sh {} + | sort -h
Ganti @example dengan scope yang Anda lihat pada pengukuran pertama. Beri tanda kutip pada path scope jika Anda menggunakan variabel atau path yang mengandung spasi. Untuk paket yang tidak memiliki scope, ukur foldernya secara langsung, misalnya du -sh "node_modules/some-library". Folder paket mungkin menyertakan dependensi bersarangnya sendiri; mengukur direktori induk dan direktori bersarang akan menghitung beberapa file dua kali jika Anda menjumlahkan totalnya. Gunakan angka-angka ini untuk menemukan kandidat, bukan untuk menghitung kontribusi pasti bagi setiap cabang.
Selanjutnya, jalankan npm explain pada paket yang berukuran besar atau pada path paket bersarang yang muncul di dalam direktori yang diukur. Jika penjelasannya mengarah melalui dependensi langsung, paket tingkat atas itulah cabang yang perlu diselidiki. Paket transitif yang besar juga dapat digunakan bersama oleh beberapa cabang, sehingga keberadaannya di bawah satu path tidak selalu berarti hanya dependensi langsung tersebut yang menggunakannya. npm mendeskripsikan npm ls sebagai pohon logis, yang dapat berbeda dari tata letak fisik node_modules; gunakan output penjelasan untuk memahami hubungan tersebut alih-alih menganggap struktur folder bersarang sebagai keseluruhan grafik.
Memisahkan dependensi pengembangan dari dependensi produksi
Alat pengembangan yang berukuran besar mungkin tidak diperlukan dalam instalasi produksi, sedangkan dependensi runtime yang besar mungkin memang dibutuhkan oleh aplikasi. Periksa rantai dependensi dan apakah rantai tersebut berasal dari dependensi pengembangan (dev) atau produksi dalam output npm. Jika Anda ingin membandingkan instalasi npm khusus produksi, npm ls --omit=dev akan mengabaikan dependensi pengembangan dari tampilan instalasi pada disk; perintah ini tidak menghapusnya dari package.json atau lockfile. Konfirmasikan perilaku dan versi npm sebelum menggunakan opsi pengabaian (omission) dalam otomatisasi. Dokumentasi npm install
Perlakukan ukuran yang besar sebagai petunjuk awal, bukan bukti bahwa suatu paket tidak diperlukan. Periksa apa yang diimpor oleh aplikasi Anda, skrip build, dan proses deployment sebelum menghapus atau mengganti dependensi. Jika lockfile tersedia, terus pantau saat membandingkan instalasi: file ini mencatat pohon yang terselesaikan dan membantu menjelaskan mengapa instalasi lain mungkin berbeda dari folder saat ini.
Titik henti praktis
Anda telah mendapatkan jawaban yang bermanfaat ketika Anda dapat menyebutkan direktori terukur terbesar, mengidentifikasi paket di dalamnya, dan menggunakan npm explain untuk menelusurinya hingga ke dependensi root yang memasukkannya. Hal itu memberi Anda cabang konkret untuk ditinjau. Penggunaan disk saja tidak dapat menentukan apakah suatu cabang aman untuk dihapus, dan perintah dependensi npm tidak menghitung porsi eksklusif suatu paket saat file atau dependensi digunakan bersama.