web-dev-qa-db-fra.com

Trouvez les paquets npm inutilisés dans package.json

Existe-t-il un moyen de déterminer si votre fichier package.json contient des packages qui ne sont plus nécessaires?

Par exemple, lorsque vous essayez un package et commentez ou supprimez le code ultérieurement, mais en oubliant de le désinstaller, je me retrouve avec quelques packages pouvant être supprimés.

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

161
Josh C

Vous pouvez utiliser un module npm appelé depcheck .

  1. Installez le module:

    npm install depcheck -g
    
  2. Exécutez-le et recherchez 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.

Pour exécuter sans installer , utilisez npx:

npx depcheck
171
German Attanasio

Il existe également un package appelé npm-check :

npm-check

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

enter image description here

Il est assez puissant et activement développé. L'une de ses fonctions est la recherche de dépendances inutilisées. Pour cette partie, il utilise le module depcheck mentionné dans l'autre réponse.

106
alecxe

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

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, pensez à utiliser le type de guillemets correct:

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 que ce n’est pas complètement automatique, c’est-à-dire qu’il n’extrait pas les noms de paquet de package.json et ne les vérifie pas. Vous devez le faire vous-même pour chaque paquet. Étant donné que package.json n'est que JSON, vous pouvez y remédier en écrivant un petit script qui utilise child_process.exec pour exécuter cette commande pour chaque dépendance. Et en faire un module. Et ajoutez-le au repo NPM ...

4
fiskeben

fiskeben a écrit:

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

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 analyser _package.json_, nous pouvons utiliser le logiciel jq . Le script Shell ci-dessous nécessite un nom de répertoire par lequel 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 dans lesquels nous pouvons mettre en cache les noms de package et les fichiers.

Cela commence par la commande find. Les première et deuxième lignes lui font ignorer les dossiers _node_modules_ et build (ou ce que vous voulez). La troisième ligne contient les extensions autorisées, vous pouvez en ajouter davantage ici, par exemple. Fichiers JSX ou JSON.

Une fonction lira les types dépendants.

D'abord, il s'agit de cats le _package.json_. Ensuite, jq obtient le groupe de dépendance requis. (_{} +_ existe pour qu’il ne génère pas d’erreur si, par exemple, le fichier ne contient aucune dépendance entre homologues.)

Ensuite, sed extrait les parties entre les guillemets, le nom du package. _-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. Pour le moment, c’est import/require ... _'package'_/_"package"_. Il fait le travail dans la plupart des cas.

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

Mises en garde:

  • Impossible de trouver des fichiers dans différentes importations, par exemple. _tsconfig.json_ fichiers (option lib)
  • Vous devez grep manuellement pour seulement les fichiers _^USED_ et UNUSED.
  • C'est lent pour les projets volumineux - souvent, les scripts Shell ne s'échelonnent pas bien. Mais j'espère que vous ne courrez pas autant de fois.
2
gombosg

Nous pouvons utiliser le module npm ci-dessous à cette fin:

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

1
user11403389