Trova i pacchetti npm inutilizzati in package.json


231

Esiste un modo per determinare se nel file package.json sono presenti pacchetti che non sono più necessari?

Ad esempio, quando provo un pacchetto e successivamente commentando o eliminando il codice, ma dimenticandomi di disinstallarlo, finisco con un paio di pacchetti che potrebbero essere eliminati.

Quale sarebbe un modo efficace per determinare se un pacchetto potrebbe essere eliminato in modo sicuro?

Risposte:


259

È possibile utilizzare un modulo npm chiamato depcheck (richiede almeno la versione 10 di Node).

  1. Installa il modulo:

    npm install depcheck -g
    
    or
    
    yarn global add depcheck
  2. Eseguilo e trova le dipendenze non utilizzate:

    depcheck

La cosa buona di questo approccio è che non devi ricordare il comando findo grep.

Per eseguire senza installare utilizzare npx:

npx depcheck

11
depcheck-es6 è ora unito a depcheck
cyberwombat il

47
non sembra utile. Sto usando la configurazione standard di angular2 cli ed depcheckelenco tutti i pacchetti unusedche sono semplicemente sbagliati
phil294

5
NB. depcheck non tiene conto dei pacchetti utilizzati negli script specificati in package.json
Javier Arias,

17
Per eseguirlo solo una volta (senza installazione), utilizzare npx :npx depcheck
Kiril

6
Non ha funzionato per me. Elenca tutti i pacchetti come inutilizzati.
dev27

131

C'è anche un pacchetto chiamato npm-check:

NPM-check

Verificare la presenza di dipendenze obsolete, errate e non utilizzate.

inserisci qui la descrizione dell'immagine

È abbastanza potente e sviluppato attivamente. Una delle sue caratteristiche è la verifica delle dipendenze non utilizzate - per questa parte utilizza ildepcheck modulo menzionato nell'altra risposta.


8
Sembra darmi gli stessi risultati di depcheck. Sembra che usi persino depcheck per trovare le dipendenze non utilizzate.
Alex K,

3
npm outdatedcontrolla ed elenca le versioni attuali, desiderate e più recenti del pacchetto. Nessun elenco di pacchetti inutilizzati però.
mgarde,

1
non sembra utile. Sto usando la configurazione angolare standard e questo elenca anche ogni pacchetto come inutilizzato, il che è altrettanto sbagliato
Kyle Burkett,

5

Se si utilizza un sistema operativo Unix come (Linux, OSX, ecc.), È possibile utilizzare una combinazione di finde egrepper cercare istruzioni obbligatorie contenenti il ​​nome del pacchetto:

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

Se cerchi l'intera require('name-of-package')istruzione, ricorda di utilizzare il tipo corretto di virgolette:

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

o

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

Il rovescio della medaglia è che non è completamente automatico, cioè non estrae i nomi dei pacchetti da package.jsone li controlla. È necessario farlo da soli per ogni pacchetto. Dato che package.jsonè solo JSON, questo potrebbe essere risolto scrivendo un piccolo script che utilizza child_process.execper eseguire questo comando per ogni dipendenza. E trasformalo in un modulo. E aggiungilo al repository NPM ...


Che dire di .jsxfile e .tsfile ecc: D
OZZIE,

1
Apparentemente usando questo approccio non stiamo usando il modulo di reazione nella nostra app React: D
OZZIE

4

fiskeben ha scritto:

Il rovescio della medaglia è che non è completamente automatico, cioè non estrae i nomi dei pacchetti da package.json e li controlla. È necessario farlo da soli per ogni pacchetto.

Rendiamo automatizzata la risposta di Fiskeben se per qualsiasi motivo depcheck non funziona correttamente! (Ad esempio, l'ho provato con Typescript e ha dato errori di analisi non necessari)

Per l'analisi package.jsonpossiamo usare il software jq. Lo script di shell sottostante richiede un nome di directory da cui iniziare.

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

Innanzitutto crea due file temporanei in cui è possibile memorizzare nella cache nomi e file dei pacchetti.

Si inizia con il findcomando. La prima e la seconda riga lo fanno ignorare node_modulesebuild cartelle (o qualunque cosa tu voglia). La terza riga contiene estensioni consentite, puoi aggiungerne altre qui, ad es. File JSX o JSON.

Una funzione leggerà i tipi dipendenti.

Prima è catil package.json. Quindi, jqottiene il gruppo di dipendenze richiesto. ( {} +esiste in modo tale da non generare un errore se ad esempio non ci sono dipendenze tra pari nel file.)

Successivamente, sedestrae le parti tra virgolette, il nome del pacchetto. -ne gli .../pdice di stampare le parti corrispondenti e nient'altro jqdall'output JSON di. Quindi leggiamo questo elenco di nomi di pacchetti in un whileciclo.

RESè il numero di occorrenze del nome del pacchetto tra virgolette. In questo momento è import/ require... 'package'/"package" . Fa il lavoro per la maggior parte dei casi.

Quindi contiamo semplicemente il numero di righe del risultato, quindi stampiamo il risultato.

Avvertenze:

  • Non troverai file in diverse importazioni, ad es. tsconfig.jsonFile (lib opzione)
  • Devi grepmanualmente solo per ^USEDe UNUSEDfile.
  • È lento per progetti di grandi dimensioni: gli script di shell spesso non si adattano bene. Ma spero che non correrai così tante volte.

1
I redattori talvolta causano il riavvolgimento delle importazioni in più righe. Questo script catturerebbe le dichiarazioni in cui 'import' o 'richiedono' si troverebbero su una riga diversa rispetto a 'da "PACKAGE_NAME"'? In altre parole, ignora gli spazi bianchi nell'importazione o richiede istruzioni?
vdiaz1130,


1

molte delle risposte qui sono come trovare oggetti inutilizzati.

Volevo rimuoverli automaticamente .

  1. Installa questo progetto nodo.

    $ npm install -g typescript tslint tslint-etc


  1. Nella directory principale, aggiungere un nuovo file tslint-imports.json

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


  1. Esegui questo a tuo rischio, fai un backup :)

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


Ma questo rimuoverà solo dai file js. Ma sei ancora bravo.
Ayon Nahiyan,

che ne dicinpx depcheck --json | jq '.dependencies[]' | xargs -L1 npm rm
alex
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.