Commande npm pour désinstaller ou élaguer les packages inutilisés dans Node.js

414

Existe-t-il un moyen de désinstaller simplement toutes les dépendances inutilisées (non déclarées) d'un projet Node.js (celles qui ne sont plus définies dans mon package.json.) Lorsque je mets à jour mon application, j'aime que les packages non référencés soient supprimés automatiquement.

Tarion
la source
1
Inutilisé par quoi? Voulez-vous supprimer les dossiers node_moduleslorsqu'ils sont supprimés de leur dossier respectif package.json?
SLaks
1
exactement, mhm npm ll donne déjà une bonne idée des candidats.
Tarion

Réponses:

670

Remarque : Les npmversions récentes le font automatiquement lorsque les verrous de package sont activés, ce n'est donc pas nécessaire, sauf pour supprimer les packages de développement avec l' --productionindicateur.


Exécutez npm prunepour supprimer les modules non répertoriés dans package.json.

De npm help prune:

Cette commande supprime les packages "étrangers". Si un nom de package est fourni, seuls les packages correspondant à l'un des noms fournis sont supprimés.

Les packages superflus sont des packages qui ne sont pas répertoriés dans la liste des dépendances du package parent.

Si l' --productionindicateur est spécifié, cette commande supprimera les packages spécifiés dans vos devDependencies.

Darkhogg
la source
3
Si je lis bien, cela supprimerait toutes les sous-dépendances, car elles ne sont pas répertoriées dans package.json. Est-ce correct? Ainsi, la prochaine mise à jour ou installation devra les réinstaller.
nshew
1
Oui, cela supprimera les sous-dépendances. Les sous-dépendances sont en fait stockées dans le propre node_modulesrépertoire du module , elles sont donc supprimées avec le module.
Darkhogg
2
Laissez-moi vous donner un exemple. J'enlève le karma de moi package.json, mais je quitte le tonneau. Quand je cours npm prune, je m'attends à ce que tout le karma, y ​​compris son propre node_modulesdossier contenant ses dépendances, soit supprimé. Qu'en est-il des dépendances de bower (bower-json, bower-logger, chmodr, fstream, glob, et al.). Techniquement, ceux-ci ne figurent pas dans mes projets package.json. Sont-ils supprimés ou non?
nshew
3
Non ils ne sont pas. Notez qu'ils ne sont pas chez vous node_modules, mais à l' intérieur node_modules/bower/node_modules , "protégés" par node_modules/bower/package.json. Les dépendances de votre package et celles des dépendances de votre package ne sont pas mixtes .
Darkhogg le
2
et supprimez votre film protecteur avant l'installation de npm, aurait dû être dans les instructions ci-dessus.
Andy Ray
306

Si vous n'êtes pas inquiet au sujet d' un couple de minutes le temps de le faire, une solution serait rm -rf node_moduleset à npm installnouveau pour reconstruire les modules locaux.

Pyrce
la source
93
Ce serait bien si les gens arrêtaient de voter en aval sans commentaire .. c'est une stratégie valide pour réinitialiser les dépendances d'un projet de nœud comme alternative à la réponse acceptée. Si vous avez endommagé le contenu d'un sous-répertoire node_modules (facile à faire avec les dépendances liées à sym) ou si vous avez eu des modifications supplémentaires comme les nœuds ou les versions de npm, prune ne nettoiera pas correctement le dossier node_modules mais cette réponse le fera.
Pyrce
41
La reconstruction node_modulesvérifie également que le package.jsonfichier décrit un graphique de dépendance reproductible. Supprimer et réinstaller votre node_modulesest essentiellement un test de déploiement.
joemaller
2
@joemaller Pas nécessairement, la plupart des workflows de déploiement ont, implicitement ou explicitement, une sorte de cache. Si un package est déjà installé et correspond aux spécifications, il est conservé. La suppression puis la réinstallation feront basculer ce ou ces packages vers la dernière version correspondante.
Darkhogg
7
npm prunen'a pas aidé un iota, mais cela a fait. Mon problème était un lien symbolique cassé.
Eirik Birkeland
8
Dans de nombreuses circonstances non idéales, cela est actuellement impossible avec npm. De plus, la question ne précisait certainement pas de contrainte sur le travail répété ou la récupération supplémentaire, juste sur la façon d'atteindre l'objectif final. Cette réponse répond à la question posée, malgré ce que d'autres peuvent souhaiter au-delà de cet objectif.
Pyrce
10

Vous pouvez utiliser npm-prune pour supprimer les packages superflus.

npm prune [[<@scope>/]<pkg>...] [--production] [--dry-run] [--json]

Cette commande supprime les packages "étrangers". Si un nom de package est fourni, seuls les packages correspondant à l'un des noms fournis sont supprimés.

Les packages superflus sont des packages qui ne sont pas répertoriés dans la liste des dépendances du package parent.

Si l' indicateur --production est spécifié ou si la variable d'environnement NODE_ENV est définie sur production , cette commande supprimera les packages spécifiés dans vos devDependencies . La définition de --no-production annulera la mise en production de NODE_ENV .

Si l' indicateur --dry-run est utilisé, aucune modification ne sera réellement effectuée.

Si l' indicateur --json est utilisé, les modifications que npm prune a apportées (ou auraient apportées avec --dry-run ) sont imprimées en tant qu'objet JSON.

En fonctionnement normal avec package-locks activé, les modules superflus sont élagués automatiquement lorsque les modules sont installés et vous n'aurez besoin que de cette commande avec l' indicateur --production .

Si vous avez désactivé les verrous de package, les modules superflus ne seront pas supprimés et c'est à vous d'exécuter npm prune de temps en temps pour les supprimer.

Utilisez npm-dedupe pour réduire la duplication

npm dedupe
npm ddp

Effectue une recherche dans l'arborescence de packages locale et tente de simplifier la structure globale en déplaçant les dépendances plus haut dans l'arborescence, où elles peuvent être partagées plus efficacement par plusieurs packages dépendants.

Par exemple, considérez ce graphique de dépendance:

a
+-- b <-- depends on c@1.0.x
|    `-- c@1.0.3
`-- d <-- depends on c@~1.0.9
     `-- c@1.0.10

Dans ce cas, npm-dedupe transformera l'arborescence en:

 a
 +-- b
 +-- d
 `-- c@1.0.10

En raison de la nature hiérarchique de la recherche de module du nœud, b et d obtiendront tous les deux leur dépendance satisfaite par le package c unique au niveau racine de l'arborescence.

L'algorithme de déduplication parcourt l'arborescence, déplaçant chaque dépendance le plus haut possible dans l'arborescence, même si aucun doublon n'est trouvé. Cela se traduira par un arbre plat et dédupliqué.

Igor Litvinovich
la source
J'ai PLUS d'éléments dans mon dossier node_modules après avoir exécuté la déduplication npm. Soupir!
Neville