Temukan paket npm yang tidak digunakan di package.json

231

Apakah ada cara untuk menentukan apakah Anda memiliki paket di file package.json Anda yang tidak lagi diperlukan?

Misalnya, ketika mencoba suatu paket dan kemudian mengomentari atau menghapus kode, tetapi lupa untuk menghapusnya, saya berakhir dengan beberapa paket yang dapat dihapus.

Apa cara yang efisien untuk menentukan apakah suatu paket dapat dihapus dengan aman?

Josh C
sumber

Jawaban:

258

Anda dapat menggunakan modul npm yang disebut depcheck (membutuhkan setidaknya Node versi 10).

  1. Pasang modul:

    npm install depcheck -g
    
    or
    
    yarn global add depcheck
  2. Jalankan dan temukan dependensi yang tidak digunakan:

    depcheck

Hal yang baik tentang pendekatan ini adalah Anda tidak harus mengingat perintah findatau grep.

Untuk menjalankan tanpa menginstal gunakan npx:

npx depcheck
Attanasio Jerman
sumber
11
depcheck-es6 sekarang bergabung ke depcheck
cyberwombat
47
tidak terlihat berguna. Saya menggunakan setup standar angular2 cli dan depcheckdaftar setiap paket unusedyang salah
phil294
5
NB. depcheck tidak memperhitungkan paket akun yang digunakan dalam skrip yang ditentukan dalam package.json
Javier Arias
17
Untuk menjalankannya sekali saja (tanpa instalasi) - gunakan npx :npx depcheck
Kiril
6
Tidak bekerja untuk saya. Itu terdaftar semua paket sebagai tidak terpakai.
dev27
131

Ada juga paket yang disebut npm-check:

npm-cek

Periksa dependensi yang usang, salah, dan tidak digunakan.

masukkan deskripsi gambar di sini

Ini cukup kuat dan dikembangkan secara aktif. Salah satu fitur itu memeriksa dependensi yang tidak digunakan - untuk bagian ini menggunakan depcheckmodul yang disebutkan dalam jawaban lain.

alecxe
sumber
8
Tampaknya memberi saya hasil yang sama dengan depcheck. Sepertinya bahkan menggunakan depcheck untuk menemukan dependensi yang tidak digunakan.
Alex K
3
npm outdatedmemeriksa dan mendaftar versi paket saat ini, yang diinginkan, dan terbaru. Tidak ada daftar paket yang tidak digunakan.
mgarde
1
tidak terlihat berguna juga. Saya menggunakan pengaturan sudut standar dan ini juga mencantumkan setiap paket sebagai tidak terpakai yang sama salahnya
Kyle Burkett
5

Jika Anda menggunakan Unix like OS (Linux, OSX, dll) maka Anda dapat menggunakan kombinasi finddan egrepuntuk mencari pernyataan yang membutuhkan yang berisi nama paket Anda:

find . -path ./node_modules -prune -o -name "*.js" -exec egrep -ni 'name-of-package' {} \;

Jika Anda mencari seluruh require('name-of-package')pernyataan, ingatlah untuk menggunakan jenis tanda kutip yang benar:

find . -path ./node_modules -prune -o -name "*.js" -exec egrep -ni 'require("name-of-package")' {} \;

atau

find . -path ./node_modules -prune -o -name "*.js" -exec egrep -ni "require('name-of-package')" {} \;

Kelemahannya adalah itu tidak sepenuhnya otomatis, artinya tidak mengekstrak nama paket dari package.jsondan memeriksanya. Anda perlu melakukan ini untuk setiap paket sendiri. Karena package.jsonhanya JSON, ini dapat diatasi dengan menulis skrip kecil yang digunakan child_process.execuntuk menjalankan perintah ini untuk setiap ketergantungan. Dan buatlah modul. Dan menambahkannya ke repo NPM ...

fiskeben
sumber
Bagaimana dengan .jsxfile dan .tsfile dll: D
OZZIE
1
Rupanya menggunakan pendekatan ini kita tidak menggunakan modul reaksi di aplikasi Bereaksi kita: D
OZZIE
4

fiskeben menulis:

Kelemahannya adalah itu tidak sepenuhnya otomatis, artinya tidak mengekstrak nama paket dari package.json dan memeriksanya. Anda perlu melakukan ini untuk setiap paket sendiri.

Mari kita buat jawaban Fiskeben terotomatisasi jika karena alasan apa pun depchecktidak berfungsi dengan benar! (Misalnya saya mencobanya dengan Typefteks dan memberikan kesalahan parsing yang tidak perlu)

Untuk parsing package.jsonkita dapat menggunakan perangkat lunak jq. Skrip shell di bawah ini membutuhkan nama direktori tempat untuk memulai.

#!/bin/bash
DIRNAME=${1:-.}
cd $DIRNAME

FILES=$(mktemp)
PACKAGES=$(mktemp)

find . \
    -path ./node_modules -prune -or \
    -path ./build -prune -or \
    \( -name "*.ts" -or -name "*.js" -or -name "*.json" \) -print > $FILES

function check {
    cat package.json \
        | jq "{} + .$1 | keys" \
        | sed -n 's/.*"\(.*\)".*/\1/p' > $PACKAGES

    echo "--------------------------"
    echo "Checking $1..."
    while read PACKAGE
    do
        RES=$(cat $FILES | xargs -I {} egrep -i "(import|require).*['\"]$PACKAGE[\"']" '{}' | wc -l)
        if [ $RES = 0 ]
        then
            echo -e "UNUSED\t\t $PACKAGE"
        else
            echo -e "USED ($RES)\t $PACKAGE"
        fi
    done < $PACKAGES
}

check "dependencies"
check "devDependencies"
check "peerDependencies"

Pertama itu menciptakan dua file sementara di mana kita bisa men-cache nama paket dan file.

Dimulai dengan findperintah. Baris pertama dan kedua membuatnya mengabaikan node_modulesdanbuild folder (atau apa pun yang Anda inginkan). Baris ketiga berisi ekstensi yang diizinkan, Anda dapat menambahkan lebih banyak di sini misalnya file JSX atau JSON.

Suatu fungsi akan membaca tipe dependendy.

Pertama cats package.json. Kemudian, jqdapatkan grup ketergantungan yang diperlukan. (Apakah {} +ada sehingga tidak akan melempar kesalahan jika misalnya tidak ada dependensi rekan dalam file.)

Setelah itu, sedekstrak bagian-bagian di antara tanda kutip, nama paket. -ndan .../pmemberitahu itu untuk mencetak bagian yang cocok dan tidak ada yang lain dari jqoutput JSON. Kemudian kita membaca daftar nama paket ini menjadi satu whilelingkaran.

RESadalah jumlah kemunculan nama paket dalam tanda kutip. Saat ini import/ require... 'package'/ "package". Itu melakukan pekerjaan untuk sebagian besar kasus.

Kemudian kita cukup menghitung jumlah baris hasil kemudian mencetak hasilnya.

Peringatan:

  • Tidak akan menemukan file dalam berbagai impor, mis. tsconfig.jsonFile (lib opsi)
  • Anda harus grepsecara manual hanya ^USEDdan UNUSEDfile.
  • Ini lambat untuk proyek besar - skrip shell sering tidak skala dengan baik. Tapi semoga Anda tidak akan menjalankan ini berkali-kali.
gombosg
sumber
1
Editor terkadang menyebabkan impor terbungkus menjadi beberapa baris. Apakah skrip ini akan menangkap pernyataan di mana 'impor' atau 'mengharuskan' berada di jalur yang berbeda dengan 'dari "PACKAGE_NAME"'? Dengan kata lain, apakah itu mengabaikan spasi putih di impor atau memerlukan pernyataan?
vdiaz1130
1

Kita dapat menggunakan modul npm di bawah ini untuk tujuan ini:

https://www.npmjs.com/package/npm-check-unused

pengguna11403389
sumber
itu mengungkapkan beberapa yang tidak digunakan tetapi juga yang digunakan, masih membantu saya kira :-) Ini tidak mengerti loader webpack ;-)
OZZIE
1

banyak jawaban di sini adalah bagaimana menemukan barang yang tidak digunakan.

Saya ingin menghapusnya secara otomatis .

  1. Instal proyek simpul ini.

    $ npm install -g typescript tslint tslint-etc


  1. Di direktori root, tambahkan file baru tslint-import.json

    { "extends": [ "tslint-etc" ], "rules": { "no-unused-declaration": true } }


  1. Jalankan ini dengan risiko Anda sendiri, buat cadangan :)

    $ tslint --config tslint-imports.json --fix --project .

transformator
sumber
Tapi ini akan dihapus dari file js saja. Tapi ya masih bagus.
Ayon Nahiyan
bagaimananpx depcheck --json | jq '.dependencies[]' | xargs -L1 npm rm
alex