Suchen Sie nicht verwendete npm-Pakete in package.json

231

Gibt es eine Möglichkeit festzustellen, ob Ihre package.json-Datei Pakete enthält, die nicht mehr benötigt werden?

Wenn ich zum Beispiel ein Paket ausprobiere und später Code kommentiere oder lösche, aber vergesse, ihn zu deinstallieren, habe ich ein paar Pakete, die gelöscht werden könnten.

Was wäre ein effizienter Weg, um festzustellen, ob ein Paket sicher gelöscht werden kann?

Josh C.
quelle

Antworten:

258

Sie können ein npm-Modul namens depcheck verwenden (erfordert mindestens Version 10 von Node).

  1. Installieren Sie das Modul:

    npm install depcheck -g
    
    or
    
    yarn global add depcheck
  2. Führen Sie es aus und suchen Sie die nicht verwendeten Abhängigkeiten:

    depcheck

Das Gute an diesem Ansatz ist, dass Sie sich nicht an den Befehl findoder erinnern müssen grep.

Um ohne Installation zu laufen , verwenden Sie npx:

npx depcheck
Deutscher Attanasio
quelle
11
depcheck-es6 ist jetzt in depcheck
cyberwombat
47
sieht nicht nützlich aus. Ich verwende das Standard-Angular2-CLI-Setup und liste depcheckjedes Paket als unusedfalsch auf
phil294
5
NB. depcheck berücksichtigt keine Pakete, die in Skripten verwendet werden, die in package.json angegeben sind
Javier Arias
17
Um es nur einmal auszuführen (ohne Installation) - verwenden Sie npx :npx depcheck
Kiril
6
Hat bei mir nicht funktioniert. Alle Pakete wurden als nicht verwendet aufgeführt.
Dev27
131

Es gibt auch ein Paket namens npm-check:

npm-check

Suchen Sie nach veralteten, falschen und nicht verwendeten Abhängigkeiten.

Geben Sie hier die Bildbeschreibung ein

Es ist ziemlich mächtig und aktiv entwickelt. Eine seiner Funktionen ist die Überprüfung auf nicht verwendete Abhängigkeiten - für diesen Teil wird das depcheckin der anderen Antwort erwähnte Modul verwendet .

Alecxe
quelle
8
Scheint mir die gleichen Ergebnisse wie depcheck zu geben. Es sieht so aus, als würde es sogar depcheck verwenden, um die nicht verwendeten Abhängigkeiten zu finden.
Alex K
3
npm outdatedprüft und listet aktuelle, gesuchte und neueste Paketversionen auf. Keine Liste nicht verwendeter Pakete.
mgarde
1
sieht auch nicht nützlich aus. Ich verwende das Standard-Winkel-Setup und dies listet auch jedes Paket als unbenutzt auf, was genauso falsch ist
Kyle Burkett
5

Wenn Sie ein Unix wie OS (Linux, OSX usw.) verwenden, können Sie eine Kombination aus findund verwenden egrep, um nach erforderlichen Anweisungen zu suchen, die Ihren Paketnamen enthalten:

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

Wenn Sie nach der gesamten require('name-of-package')Anweisung suchen , denken Sie daran, die richtigen Anführungszeichen zu verwenden:

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

oder

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

Der Nachteil ist, dass es nicht vollautomatisch ist, dh es werden keine Paketnamen extrahiert package.jsonund überprüft. Sie müssen dies für jedes Paket selbst tun. Da package.jsones sich nur um JSON handelt, kann dies behoben werden, indem ein kleines Skript geschrieben wird, mit child_process.execdem dieser Befehl für jede Abhängigkeit ausgeführt wird. Und mach daraus ein Modul. Und fügen Sie es dem NPM-Repo hinzu ...

fiskeben
quelle
Was ist mit .jsxDateien und .tsDateien usw .: D
OZZIE
1
Anscheinend verwenden wir diesen Ansatz und verwenden kein Reaktionsmodul in unserer Reaktions-App: D
OZZIE
4

fiskeben schrieb:

Der Nachteil ist, dass es nicht vollautomatisch ist, dh es packt keine Paketnamen aus package.json und überprüft sie. Sie müssen dies für jedes Paket selbst tun.

Lassen Sie uns Fiskebens Antwort automatisieren, wenn sie aus irgendeinem Grund depchecknicht richtig funktioniert! (ZB habe ich es mit Typescript versucht und es gab unnötige Analysefehler)

Zum Parsen können package.jsonwir die Software verwenden jq. Für das folgende Shell-Skript ist ein Verzeichnisname erforderlich, mit dem begonnen werden soll.

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

Zuerst werden zwei temporäre Dateien erstellt, in denen Paketnamen und -dateien zwischengespeichert werden können.

Es beginnt mit dem findBefehl. In der ersten und zweiten Zeile werden die Ordner node_modulesund build(oder was auch immer Sie wollen) ignoriert . Die dritte Zeile enthält zulässige Erweiterungen. Sie können hier weitere hinzufügen, z. B. JSX- oder JSON-Dateien.

Eine Funktion liest abhängige Typen.

Zuerst ist es catdaspackage.json . Ruft jqdann die erforderliche Abhängigkeitsgruppe ab. ( {} +Ist vorhanden, damit kein Fehler ausgegeben wird, wenn z. B. keine Peer-Abhängigkeiten in der Datei vorhanden sind.)

Danach, sedextrahiert die Teile zwischen den Anführungszeichen, der Paketnamen. -nund.../p weist es an, die passenden Teile und nichts anderes aus jqder JSON-Ausgabe zu drucken . Dann lesen wir diese Liste der Paketnamen in eine whileSchleife.

RESist die Anzahl der Vorkommen des Paketnamens in Anführungszeichen. Im Moment ist es import/require ... 'package'/ "package". Es macht den Job in den meisten Fällen.

Dann zählen wir einfach die Anzahl der Ergebniszeilen und drucken das Ergebnis aus.

Vorsichtsmaßnahmen:

  • Es werden keine Dateien in verschiedenen Importen gefunden, z tsconfig.json Dateien (lib Option)
  • Sie müssen grepnur für ^USEDund manuellUNUSED Dateien .
  • Bei großen Projekten ist es langsam - Shell-Skripte lassen sich oft nicht gut skalieren. Aber hoffentlich rennst du nicht so oft.
gombosg
quelle
1
Editoren führen manchmal dazu, dass Importe in mehrere Zeilen eingeschlossen werden. Würde dieses Skript Anweisungen abfangen, bei denen 'import' oder 'require' in einer anderen Zeile stehen würde als 'from' PACKAGE_NAME ''? Mit anderen Worten, ignoriert es Leerzeichen beim Import oder erfordert es Anweisungen?
vdiaz1130
1

Wir können das folgende npm-Modul für diesen Zweck verwenden:

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

user11403389
quelle
es enthüllte einige nicht benutzte, aber auch gebrauchte, immer noch hilfreich, denke ich :-) Es versteht keine Webpack-Lader ;-)
OZZIE
1

Viele der Antworten hier sind, wie man unbenutzte Gegenstände findet.

Ich wollte sie automatisch entfernen .

  1. Installieren Sie dieses Knotenprojekt.

    $ npm install -g typescript tslint tslint-etc


  1. Fügen Sie im Stammverzeichnis eine neue Datei tslint-imports.json hinzu

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


  1. Führen Sie dies auf eigenes Risiko durch, erstellen Sie ein Backup :)

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

Transformator
quelle
Dies wird jedoch nur aus den js-Dateien entfernt. Aber du bist immer noch gut.
Ayon Nahiyan
Wie wäre esnpx depcheck --json | jq '.dependencies[]' | xargs -L1 npm rm
Alex