Trouvez les packages npm inutilisés dans package.json

231

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

Par exemple, lorsque j'essaie un package et commente ou supprime plus tard du code, mais oubliant de le désinstaller, je me retrouve avec quelques packages qui pourraient être supprimés.

Quelle serait une manière efficace de déterminer si un paquet pourrait être supprimé en toute sécurité?

Josh C
la source

Réponses:

259

Vous pouvez utiliser un module npm appelé depcheck (nécessite au moins la version 10 de Node).

  1. Installez le module:

    npm install depcheck -g
    
    or
    
    yarn global add depcheck
  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 findor grep.

Pour exécuter sans installer, utilisez npx:

npx depcheck
Allemand Attanasio
la source
11
depcheck-es6 est maintenant fusionné dans depcheck
cyberwombat
47
ne semble pas utile. J'utilise la configuration standard angular2 cli et depcheckrépertorie tous les packages comme unusedétant tout simplement faux
phil294
5
NB. depcheck ne prend pas en compte les packages utilisés dans les scripts spécifiés dans package.json
Javier Arias
17
Pour l'exécuter une seule fois (sans installation) - utilisez npx :npx depcheck
Kiril
6
Ça n'a pas marché pour moi. Il a répertorié tous les packages comme inutilisés.
dev27
131

Il existe également un package 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 depcheckmodule mentionné dans l'autre réponse.

alecxe
la source
8
Semble me donner les mêmes résultats que depcheck. Il semble qu'il utilise même depcheck pour trouver les dépendances inutilisées.
Alex K
3
npm outdatedvérifie et répertorie les versions actuelles, souhaitées et les plus récentes des packages. Aucune liste de paquets inutilisés cependant.
mgarde
1
ne semble pas utile aussi. J'utilise la configuration angulaire standard et cela répertorie également tous les packages comme inutilisés, ce qui est tout aussi faux
Kyle Burkett
5

Si vous utilisez un système d'exploitation comme Unix (Linux, OSX, etc.), vous pouvez utiliser une combinaison de findet egreppour rechercher les 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'intégralité de l' require('name-of-package')instruction, n'oubliez pas d'utiliser le bon type 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 paquet package.jsonet ne les vérifie pas. Vous devez le faire vous-même pour chaque paquet. Étant donné qu'il ne package.jsons'agit que de JSON, cela pourrait être résolu en écrivant un petit script qui permet child_process.execd'exécuter cette commande pour chaque dépendance. Et faites-en un module. Et ajoutez-le au dépôt NPM ...

fiskeben
la source
Qu'en est-il des .jsxfichiers et des .tsfichiers, etc.: D
OZZIE
1
Apparemment, en utilisant cette approche, nous n'utilisons pas le module React dans notre application React: D
OZZIE
4

fiskeben a écrit:

L'inconvénient est qu'il 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.

Rendons la réponse de Fiskeben automatisée si, pour une raison quelconque, elle depcheckne fonctionne pas correctement! (Par exemple, je l'ai essayé avec Typescript et cela a donné des erreurs d'analyse inutiles)

Pour l'analyse, package.jsonnous pouvons 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 packages.

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

Une fonction lira les types dépendants.

C'est d'abord catle package.json. Obtient ensuite jqle groupe de dépendances requis. ( {} +est là pour ne pas générer d'erreur si par exemple il n'y a pas de dépendances entre pairs dans le fichier.)

Après cela, sedextrait les parties entre les guillemets, le nom du package. -net lui .../pdit d'imprimer les parties correspondantes et rien d'autre à partir de jqla sortie JSON de. Ensuite, nous lisons cette liste de noms de packages dans une whileboucle.

RESest le nombre d'occurrences du nom du package entre guillemets. En ce moment c'est import/ require... 'package'/ "package". Il fait l'affaire dans la plupart des cas.

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

Avertissements:

  • Impossible de trouver des fichiers dans différentes importations, par exemple des tsconfig.jsonfichiers ( liboption)
  • Vous devez grepmanuellement pour uniquement les fichiers ^USEDet UNUSED.
  • C'est lent pour les grands projets - les scripts shell ne se développent souvent pas bien. Mais j'espère que vous ne courrez pas autant de fois.
gombosg
la source
1
Les éditeurs entraînent parfois des importations sur plusieurs lignes. Ce script intercepterait-il des instructions où «importer» ou «exiger» serait sur une ligne différente de celle de «à partir de« PACKAGE_NAME »»? En d'autres termes, ignore-t-il les espaces dans l'importation ou requiert-il des instructions?
vdiaz1130
1

Nous pouvons utiliser le module npm ci-dessous à cet effet:

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

user11403389
la source
il en a révélé quelques-uns non utilisés mais également utilisés, toujours utiles je suppose :-) Il ne comprend pas les chargeurs de webpack ;-)
OZZIE
1

la plupart des réponses sont ici comment trouver les articles inutilisés.

Je voulais les supprimer automatiquement .

  1. Installez ce projet de noeud.

    $ npm install -g typescript tslint tslint-etc


  1. Dans le répertoire racine, ajoutez un nouveau fichier tslint-imports.json

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


  1. Exécutez cela à vos risques et périls, faites une sauvegarde :)

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

transformateur
la source
Mais cela ne supprimera que des fichiers js. Mais tu es toujours bon.
Ayon Nahiyan
que diriez-vousnpx depcheck --json | jq '.dependencies[]' | xargs -L1 npm rm
alex