Package.json içindeki kullanılmayan npm paketlerini bulun


232

Package.json dosyanızda artık gerekli olmayan paketlerin olup olmadığını belirlemenin bir yolu var mı?

Örneğin, bir paketi denerken ve daha sonra yorum yaparken veya kodu silerken, ancak kaldırmayı unuturken, silinebilecek birkaç paketle sonuçlanırım.

Bir paketin güvenli bir şekilde silinip silinemeyeceğini belirlemenin etkili bir yolu ne olabilir?

Yanıtlar:


260

Sen adlı bir npm modülünü kullanabilirsiniz depcheck (Düğüm en azından sürümü 10 gerektirir).

  1. Modülü takın:

    npm install depcheck -g
    
    or
    
    yarn global add depcheck
  2. Çalıştırın ve kullanılmayan bağımlılıkları bulun:

    depcheck

Bu yaklaşımla ilgili iyi olan şey, findveya grepkomutunu hatırlamak zorunda olmamanızdır .

Yüklemeden çalıştırmak için npx kullanın:

npx depcheck

11
depcheck-es6 şimdi depcheck ile birleştirildi
cyberwombat

48
yararlı görünmüyor. Standart angular2 cli kurulumunu kullanıyorum ve depcheckher paketi unusedyanlış olarak listeliyorum
phil294

5
NB. depcheck, package.json içinde belirtilen komut dosyalarında kullanılan paketleri dikkate almaz
Javier Arias

17
Sadece bir kez çalıştırmak için (kurulum olmadan ) - npx kullanın :npx depcheck
Kiril

6
Benim için çalışmadı. Tüm paketleri kullanılmamış olarak listeledi.
dev27

132

Ayrıca bir paket var npm-check:

NPM-çek

Eski, yanlış ve kullanılmayan bağımlılıkları kontrol edin.

resim açıklamasını buraya girin

Oldukça güçlü ve aktif olarak geliştirildi. Bunlardan biri kullanılmayan bağımlılıkları kontrol ettiği özelliklerden biridir - bu kısım depcheckiçin diğer cevapta belirtilen modülü kullanır .


8
Depcheck ile aynı sonuçları veriyor gibi görünüyor. Kullanılmayan bağımlılıkları bulmak için depcheck kullanıyor bile.
Alex K

3
npm outdatedgüncel, istenen ve en son paket sürümlerini kontrol eder ve listeler. Kullanılmayan paketlerin listesi yok.
mgarde

1
de yararlı görünmüyor. Standart açısal kurulumu kullanıyorum ve bu da her paketi kullanılmamış olarak listeliyor; bu da aynı şekilde yanlış
Kyle Burkett

5

OS gibi bir Unix (Linux, OSX, vb.) Kullanıyorsanız , paket adınızı içeren zorunlu ifadelerin bir kombinasyonunu findve egreparamasını kullanabilirsiniz :

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

İfadenin tamamını require('name-of-package')ararsanız, doğru türde tırnak işareti kullanmayı unutmayın:

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

veya

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

Dezavantajı, tam otomatik olmamasıdır, yani paket adlarını çıkarmaz package.jsonve kontrol etmez. Bunu her paket için kendiniz yapmanız gerekir. Yana package.jsonadildir JSON bu kullanımları bu küçük senaryoyu yazarak giderildiği olabilir child_process.execher bağımlılık için bu komutu çalıştırmak için. Ve bir modül yap. Ve NPM deposuna ekleyin ...


Hakkında ne .jsxdosya ve .tsD: dosyaları vb
Ozzie

1
Görünüşe göre bu yaklaşımı kullanarak React uygulamamızda tepki modülü kullanmıyoruz: D
OZZIE

4

fiskeben şunu yazdı:

Dezavantajı, tam otomatik olmamasıdır, yani package.json'dan paket adlarını çıkarmaz ve kontrol etmez. Bunu her paket için kendiniz yapmanız gerekir.

Herhangi bir nedenle depcheckdüzgün çalışmıyorsa Fiskeben'in cevabını otomatik hale getirelim ! (Örn, Typescript ile denedim ve gereksiz ayrıştırma hataları verdi)

Ayrıştırma package.jsoniçin yazılımı kullanabiliriz jq. Aşağıdaki kabuk betiği, nereden başlayacağınız için bir dizin adı gerektirir.

#!/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"

İlk olarak, paket adlarını ve dosyalarını önbelleğe alabileceğimiz iki geçici dosya oluşturur.

findKomut ile başlar . Birinci ve ikinci satır, node_modulesve buildklasörlerini (veya ne istersen) görmezden gelmesini sağlar . Üçüncü satır izin verilen uzantıları içerir, buraya daha fazlasını ekleyebilirsiniz, örneğin JSX veya JSON dosyaları.

Bir fonksiyon bağımlı tipleri okuyacaktır.

İlk catönce package.json. Ardından, jqgerekli bağımlılık grubunu alır. ( {} +örneğin dosyada eş bağımlılığı yoksa hata atmayacak şekilde).

Bundan sonra sed, tırnak işaretleri arasında paket adı çıkarılır. -nve .../pona eşleşen parçaları yazdırmasını ve jqJSON çıkışından başka bir şey yazmamasını söyler . Sonra bu paket adları listesini bir whiledöngü halinde okuyoruz .

RES, paket adının tırnak işareti cinsinden tekrar sayısıdır. Şu anda import/ require... 'package'/ "package". Çoğu durumda bu işi yapar.

Sonra sonuç satırlarının sayısını sayarız ve sonucu yazdırırız.

Uyarılar:

  • Farklı içe aktarmalardaki tsconfig.jsondosyaları bulamazlar, örneğin dosyalar (lib isteğe bağlı)
  • grepSadece ^USEDve UNUSEDdosyalar için manuel olarak yapmanız gerekir .
  • Büyük projeler için yavaştır - kabuk komut dosyaları genellikle iyi ölçeklenmez. Ama umarım bunu birçok kez çalıştırmazsınız.

1
Editörler bazen ithalatın birden fazla satıra sarılmasına neden olur. Bu komut dosyası, "içe aktar" veya "zorunlu" ifadelerinin "PACKAGE_NAME" klasöründen farklı bir satırda olduğu ifadeleri yakalar mı? Başka bir deyişle, içe aktarma işlemindeki boşluk alanını yoksayar mı yoksa deyimler gerektirir mi?
vdiaz1130


1

cevabın birçoğu kullanılmayan öğelerin nasıl bulunacağıdır.

Onları otomatik olarak kaldırmak istedim .

  1. Bu düğüm projesini yükleyin.

    $ npm install -g typescript tslint tslint-etc


  1. Kök dizinine tslint-imports.json adlı yeni bir dosya ekleyin

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


  1. Bunu kendi sorumluluğunuzda çalıştırın, yedekleyin :)

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


Ancak bu yalnızca js dosyalarından kaldırılacaktır. Ama hala iyisin.
Ayon Nahiyan

ne dersinnpx depcheck --json | jq '.dependencies[]' | xargs -L1 npm rm
alex
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.