Explorer node_modules et diagnostiquer
Lire une dépendance, npm ls/explain, npm ci.
Objectifs
À la fin de cette leçon, vous saurez :
- lire le code d'une dépendance installée ;
- identifier pourquoi une version est présente (
npm why) ; - nettoyer un arbre cassé.
🔗 Pour vous rafraîchir la mémoire : package.json et scripts npm · la méthode de débogage en six étapes · codes de retour ($?, &&, ||) · manipulation de fichiers (cp, mv, rm)
Ouvrir la boîte noire
Une dépendance n'est pas magique : c'est du code lisible chez vous. Quand pg se comporte bizarrement, allez voir :
less node_modules/pg/lib/index.js
Vous y trouverez : les classes exportées, la logique réelle, parfois des commentaires éclairants. Trois usages quotidiens :
- Comprendre une erreur dont le stack trace pointe dans node_modules.
- Vérifier une API quand la documentation est floue — le code ne ment pas.
- Évaluer avant adoption : installer dans un projet jetable, lire, décider.
npm ls : qui a amené quoi
npm ls pg
todo-api@1.0.0
└── pg@8.11.3
Version dédupliquée unique. Mais si deux versions coexistent (exigées par des dépendances différentes) :
todo-api@1.0.0
└─┬ outil-a@1.0.0
└── pg@8.5.0 ← version imbriquée pour outil-a seul
└── pg@8.11.3 ← votre version directe
npm installe alors les DEUX, imbriquée sous son consommateur : chacun reçoit ce qu'il exige. npm explain <pkg> (ou npm why) montre le chemin exact qui a amené chaque copie — indispensable avant de tenter une mise à jour.
Le nettoyage de secours
Symptômes classiques d'un arbre incohérent : « module not found » sur quelque chose d'installé, erreurs bizarres après changement de branche Git. Remède standard :
rm -rf node_modules package-lock.json # attention : lockfile regénéré !
npm install
En équipe, préférez la version douce :
rm -rf node_modules && npm ci
npm ci installe STRICTEMENT depuis le lockfile existant — reproductibilité maximale, c'est la commande des environnements propres (votre future CI utilisera celle-ci).
.gitignore rappelé
node_modules/
Jamais versionné : reconstruisible à volonté depuis le lockfile. Un dépôt propre est léger ; un dépôt avec node_modules devient clonable en minutes et illisible en diff.
Exercice
- Trouvez dans node_modules/pg où est définie la classe Pool.
- Ajoutez express puis lancez
npm explain body-parser: quel chemin remonte-t-il ? - Simulez un arbre cassé (supprimez un fichier interne), observez l'erreur, réparez avec
npm ci.
Résumé
- Les dépendances sont lisibles : ouvrez-les sans crainte.
npm ls/explain= généalogie complète de chaque version.npm ci= reconstruction fidèle au lockfile ; node_modules hors Git.
Correction disponibleCherchez d’abord par vous-même.Voir la correction
Correction
Réponses détaillées
Question 1. Dans pg/lib/index.js : class Pool y est définie puis exportée. Vous pouvez même poser un breakpoint dedans lors d'un débogage approfondi — rien n'est verrouillé.
Question 3. Erreur du type Cannot find module './interne.js' dès qu'un import passe par là. Après npm ci, tout revient : l'arbre est toujours régénérable intégralement depuis les manifestes.