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é?
Vous pouvez utiliser un module npm appelé depcheck .
Installez le module:
npm install depcheck -g
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
Il existe également un package appelé npm-check
:
npm-check
Recherchez les dépendances obsolètes, incorrectes et inutilisées.
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.
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 ...
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 cat
s 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:
tsconfig.json
_ fichiers (option lib
)grep
manuellement pour seulement les fichiers _^USED
_ et UNUSED
.Nous pouvons utiliser le module npm ci-dessous à cette fin: