perintah npm untuk menghapus atau memangkas paket yang tidak digunakan di Node.js

414

Apakah ada cara untuk menghapus instalan semua dependensi yang tidak terpakai (tidak dideklarasikan) dari proyek Node.js (yang tidak lagi didefinisikan dalam my package.json.) Ketika saya memperbarui aplikasi saya, saya ingin agar paket yang tidak direferensikan dihapus secara otomatis.

Tarion
sumber
1
Tidak terbiasa dengan apa? Apakah Anda bermaksud menghapus folder node_modulessaat dihapus dari masing-masing folder package.json?
SLaks
1
tepatnya, mhm npm ll sudah memberikan petunjuk yang baik yang merupakan kandidat.
Tarion

Jawaban:

670

Catatan : npmVersi terbaru melakukan ini secara otomatis ketika kunci-paket diaktifkan, jadi ini tidak diperlukan kecuali untuk menghapus paket pengembangan dengan --productionbendera.


Jalankan npm pruneuntuk menghapus modul yang tidak terdaftar dalam package.json.

Dari npm help prune:

Perintah ini menghapus paket "asing". Jika nama paket disediakan, maka hanya paket yang cocok dengan salah satu nama yang disediakan yang dihapus.

Paket ekstranous adalah paket yang tidak terdaftar dalam daftar dependensi paket induk.

Jika --productionflag ditentukan, perintah ini akan menghapus paket yang ditentukan dalam devDependencies Anda.

Darkhogg
sumber
3
Jika saya membacanya dengan benar, ini akan menghapus semua sub-dependensi, karena tidak tercantum di package.json. Apakah itu benar? Jadi, pembaruan atau pemasangan berikutnya harus menginstalnya kembali.
nshew
1
Ya, itu akan menghapus sub-dependensi. Sub-dependensi sebenarnya disimpan di dalam node_modulesdirektori modul itu sendiri , sehingga dihapus dengan modul.
Darkhogg
2
Izinkan saya memberi contoh. Saya menghapus karma dari saya package.json, tetapi meninggalkan bower. Ketika saya menjalankan npm prune, saya berharap semua karma, termasuk node_modulesfoldernya sendiri yang berisi dependensinya, akan dihapus. Bagaimana dengan dependensi bower (bower-json, bower-logger, chmodr, fstream, glob, et al.). Secara teknis, itu tidak tercantum dalam proyek saya package.json. Apakah itu dihapus atau tidak?
nshew
3
Tidak, mereka bukan. Perhatikan bahwa mereka tidak di Anda sendiri node_modules, tetapi di dalam node_modules/bower/node_modules , "dilindungi" oleh node_modules/bower/package.json. Ketergantungan paket Anda dan dependensi paket Anda tidak tercampur .
Darkhogg
2
dan hapus shrinkwrap Anda sebelum menginstal npm, seharusnya dalam instruksi di atas.
Andy Ray
306

Jika Anda tidak khawatir tentang waktu beberapa menit untuk melakukannya, solusi akan menjadi rm -rf node_modulesdan npm installlagi untuk membangun kembali modul lokal.

Pyrce
sumber
93
Alangkah baiknya jika orang berhenti downvoting ini tanpa komentar .. itu adalah strategi yang valid untuk mengatur ulang dependensi proyek simpul sebagai alternatif untuk jawaban yang diterima. Jika Anda merusak isi sub-direktori node_modules (mudah dilakukan dengan dependensi sym-linked) atau jika Anda memiliki perubahan tambahan seperti node atau npm versi bumps prune tidak akan membersihkan folder node_modules dengan benar tetapi jawaban ini akan.
Pyrce
41
Membangun kembali node_modulesjuga memverifikasi package.jsonfile yang menggambarkan grafik ketergantungan yang dapat direproduksi. Menghapus dan menginstal ulang Anda node_modulespada dasarnya adalah tes penyebaran.
joemaller
2
@ joemaller Tidak harus, sebagian besar alur kerja penggunaan, baik secara implisit atau eksplisit, semacam cache. Jika paket sudah diinstal dan sesuai dengan spesifikasi, itu disimpan. Menghapus lalu menginstal ulang akan menabrak paket ke versi terbaru yang cocok.
Darkhogg
7
npm prunetidak membantu sedikitpun, tetapi ini berhasil. Masalah saya adalah symlink yang rusak.
Eirik Birkeland
8
Dalam banyak keadaan tidak ideal yang saat ini tidak dapat dilakukan dengan npm. Selain itu, pertanyaannya jelas tidak menentukan batasan pada pekerjaan yang berulang atau pengambilan tambahan, hanya bagaimana mencapai tujuan akhir. Jawaban ini memuaskan pertanyaan sebagaimana dinyatakan, terlepas dari apa yang orang lain inginkan di luar tujuan itu.
Pyrce
10

Anda dapat menggunakan npm-prune untuk menghapus paket-paket yang tidak tersedia.

npm prune [[<@scope>/]<pkg>...] [--production] [--dry-run] [--json]

Perintah ini menghapus paket "asing". Jika nama paket disediakan, maka hanya paket yang cocok dengan salah satu nama yang disediakan yang dihapus.

Paket ekstranous adalah paket yang tidak terdaftar dalam daftar dependensi paket induk.

Jika --production bendera ditentukan atau NODE_ENV variabel lingkungan diatur untuk produksi , perintah ini akan menghapus paket yang ditentukan dalam Anda devDependencies . Pengaturan --tidak ada produksi akan meniadakan NODE_ENV diatur ke produksi .

Jika flag --dry-run digunakan maka tidak ada perubahan yang akan dibuat.

Jika flag --json digunakan maka perubahan npm prune yang dibuat (atau akan dibuat dengan --dry-run ) dicetak sebagai objek JSON.

Dalam operasi normal dengan paket-lock diaktifkan, modul asing dipangkas secara otomatis ketika modul diinstal dan Anda hanya akan memerlukan perintah ini dengan flag --produksi .

Jika Anda telah menonaktifkan kunci-paket maka modul-modul tambahan tidak akan dihapus dan terserah Anda untuk menjalankan npm prune dari waktu ke waktu untuk menghapusnya.

Gunakan npm-dedupe untuk mengurangi duplikasi

npm dedupe
npm ddp

Mencari pohon paket lokal dan mencoba menyederhanakan struktur keseluruhan dengan memindahkan dependensi lebih jauh ke pohon, di mana mereka dapat lebih efektif dibagikan oleh beberapa paket dependen.

Sebagai contoh, perhatikan grafik dependensi ini:

a
+-- b <-- depends on c@1.0.x
|    `-- c@1.0.3
`-- d <-- depends on c@~1.0.9
     `-- c@1.0.10

Dalam hal ini, npm-dedupe akan mengubah pohon menjadi:

 a
 +-- b
 +-- d
 `-- c@1.0.10

Karena sifat hirarkis modul lookup node, b dan d keduanya akan mendapatkan ketergantungan mereka dipenuhi oleh paket c tunggal di tingkat akar pohon.

Algoritma deduplikasi berjalan pohon, memindahkan setiap ketergantungan sejauh mungkin di pohon, bahkan jika duplikat tidak ditemukan. Ini akan menghasilkan pohon yang rata dan terduplikasi.

Igor Litvinovich
sumber
Saya punya LEBIH item dalam folder node_modules saya setelah menjalankan npm dedupe. Mendesah!
Neville