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é?
4 réponses
Vous pouvez utiliser un module npm appelé depcheck .
-
Installer le module:
npm install depcheck -g
-
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
.
Il y a aussi un paquet appelé npm-check
:
Npm-check
Vérifiez les dépendances obsolètes, incorrectes et inutilisées.
, 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.
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...
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
etUNUSED
. - 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.