Trouvez les paquets npm inutilisés dans le paquet.json

Existe-t-il un moyen de déterminer si vous avez des paquets dans votre paquet.fichier json qui ne sont plus nécessaires?

Par exemple, lorsque vous essayez un paquet et que vous commentez ou supprimez du code, mais que vous oubliez de le désinstaller, je me retrouve avec quelques paquets qui pourraient être supprimés.

Quel serait un moyen efficace de déterminer si un paquet peut être supprimé en toute sécurité?

104
demandé sur danwellman 2014-03-27 04:10:45

4 réponses

Vous pouvez utiliser un module npm appelé depcheck .

  1. Installer le module:

    npm install depcheck -g
    
  2. Exécutez-le et trouvez les dépendances inutilisées:

    depcheck
    

La bonne chose à propos de cette approche est que vous n'avez pas à vous souvenir de la commande find ou grep.

91
répondu German Attanasio 2014-12-14 06:47:28

Il y a aussi un paquet appelé npm-check:

Npm-check

Vérifiez les dépendances obsolètes, incorrectes et inutilisées.

entrez la description de l'image ici

, Il est assez puissant et activement développé. L'une de ses fonctionnalités vérifie les dépendances inutilisées - pour cette partie, il utilise le depcheck module mentionné dans l'autre réponse.

73
répondu alecxe 2014-12-14 06:53:01

Si vous utilisez un système D'exploitation Unix comme (Linux, OSX, etc), Vous pouvez utiliser une combinaison de find et egrep pour rechercher des instructions require contenant le nom de votre paquet:

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

Si vous recherchez l'instruction require('name-of-package') entière, n'oubliez pas d'utiliser le type correct de guillemets:

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

Ou

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

L'inconvénient est qu'il n'est pas entièrement automatique, c'est-à-dire qu'il n'extrait pas les noms de paquets de package.json et ne les vérifie pas. Vous devez le faire pour chaque paquet vous-même. Depuis package.json est - ce juste JSON cela pourrait être corrigé en écrivant un petit script qui utilise child_process.exec pour exécuter cette commande pour chaque dépendance. Et d'en faire un module. Et ajoutez - le au dépôt NPM...

3
répondu fiskeben 2014-03-27 09:08:46

Fiskeben a écrit:

L'inconvénient est qu'il n'est pas entièrement automatique, c'est à dire il n'extrait pas les noms de paquet du paquet.json et les vérifier. Vous devez le faire pour chaque paquet vous-même.

Faisons automatiser la réponse de Fiskeben si pour une raison quelconque depcheck ne fonctionne pas correctement! (Par exemple, je l'ai essayé avec Typescript et il a donné des erreurs d'analyse inutiles)

Pour l'analyse de package.json on peut utiliser le logiciel jq. Le script shell ci-dessous nécessite un nom de répertoire par où commencer.

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

Tout d'abord, il crée deux fichiers temporaires où nous pouvons mettre en cache les noms et les fichiers des paquets.

Il commence par la commande find. La première et la deuxième ligne le font ignorer les dossiers node_modules et build (ou ce que vous voulez). La troisième ligne contient des extensions autorisées, vous pouvez en ajouter d'autres ici, par exemple des fichiers JSX ou JSON.

Une fonction va lire les types dependendy.

D'abord c'est cat le package.json. Ensuite, jq obtient le groupe de dépendance. ({} + est là pour ne pas lancer d'erreur si, par exemple, il n'y a pas de dépendances pairs dans le fichier.)

Après cela, sed extrait les parties entre les guillemets, le nom du paquet. -n et .../p lui dit d'imprimer les parties correspondantes et rien d'autre à partir de la sortie JSON de jq. Ensuite, nous lisons cette liste de noms de paquets dans une boucle while.

RES est le nombre d'occurrences du nom du paquet entre guillemets. En ce moment c'est import/require ... 'package'/"package". Il fait le travail pour la plupart des cas.

Ensuite, nous comptons simplement le nombre de lignes de résultat puis imprimons le résultat.

Mises en garde:

  • ne trouvera pas de fichiers dans différentes importations, par exemple tsconfig.json files (lib option)
  • Vous devez grep manuellement uniquement pour les fichiers ^USED et UNUSED.
  • c'est lent pour les grands projets - les scripts shell ne s'adaptent souvent pas bien. Mais j'espère que vous ne courrez pas autant de fois.
1
répondu gombosg 2018-09-17 19:32:46