Pour découvrir ce qui alourdit l'installation d'un projet Node sur macOS, mesurez les paquets installés, puis remontez la trace des plus volumineux à travers l'arbre de dépendances de npm. Dans Terminal, commencez par le répertoire du projet : du affiche l'utilisation du disque, npm ls liste l'arbre installé et npm explain montre pourquoi un paquet est présent. Ces commandes répondent à des questions différentes : la taille indique ce qui occupe de l'espace ; la chaîne de dépendances indique ce qui l'a introduit.

Mesurer les paquets installés sur macOS

Ouvrez Terminal, placez-vous dans le dossier du projet et vérifiez qu'il contient bien node_modules avant de mesurer. Les commandes suivantes fonctionnent dans le zsh par défaut de macOS et évitent de dépendre du comportement des jokers (wildcards) du shell :

cd "/path/to/your/project"
ls -ld node_modules
find node_modules -mindepth 1 -maxdepth 1 -type d -prune -exec du -sh {} + | sort -h

du -sh renvoie un total lisible par l'humain pour chaque répertoire de premier niveau, et sort -h classe ces totaux du plus petit au plus grand. Lisez depuis le bas pour repérer les éléments les plus volumineux. La commande find mesure chaque répertoire de premier niveau une seule fois : par exemple, elle indique node_modules/@example comme un seul dossier de périmètre (scope) combiné, et non chaque paquet du périmètre séparément. Il s'agit d'une première passe utile, et non d'un rapport sur le coût individuellement attribuable à chaque dépendance.

Si la commande indique que node_modules n'existe pas, il se peut que le projet n'ait pas encore d'arbre de dépendances installé, ou que vous soyez dans le mauvais répertoire. Vérifiez le gestionnaire de paquets du projet et le fichier lock avant d'installer quoi que ce soit juste pour le mesurer. Le fichier lock de npm décrit un arbre de dépendances résolu, tandis que les fichiers installés correspondent à ce que du mesure. Documentation de npm sur package-lock

Retracer un dossier volumineux jusqu'à sa chaîne de dépendances

Utilisez npm ls pour inspecter l'arbre logique de dépendances de npm. Sa sortie par défaut se concentre sur les paquets de premier niveau ; --all étend la liste aux dépendances transitives. Documentation de npm ls

npm ls --all

Pour un projet de grande envergure, la liste complète peut être difficile à exploiter. Dès que vous avez repéré le nom d'un paquet candidat dans l'arbre, demandez à npm pourquoi il est installé :

npm explain package-name

Remplacez package-name par le nom réel, par exemple some-library. La sortie remonte la chaîne de dépendances vers la racine du projet. Si npm signale plusieurs copies ou versions, repérez l'emplacement d'installation concerné dans la liste et transmettez ce chemin à npm explain, par exemple :

npm explain node_modules/parent-package/node_modules/package-name

La documentation de npm décrit npm explain comme le moyen de retracer la chaîne qui entraîne l'installation d'un paquet, y compris pour un dossier précis lorsqu'une dépendance est imbriquée. Documentation de npm explain

Inspecter les paquets sous un scope et les dossiers imbriqués

La première mesure regroupe un périmètre comme @example dans un seul répertoire. Pour inspecter ses sous-dossiers de paquets immédiats, exécutez :

find node_modules/@example -mindepth 1 -maxdepth 1 -type d -prune -exec du -sh {} + | sort -h

Remplacez @example par le périmètre observé lors de la première mesure. Mettez le chemin du périmètre entre guillemets si vous utilisez une variable ou un chemin contenant des espaces. Pour un paquet sans préfixe de périmètre, mesurez directement son dossier, par exemple du -sh "node_modules/some-library". Le dossier d'un paquet peut inclure ses propres dépendances imbriquées ; mesurer à la fois le répertoire parent et un répertoire imbriqué comptera certains fichiers deux fois si vous additionnez les totaux. Utilisez ces chiffres pour cibler des candidats, et non pour calculer la part exacte de chaque branche.

Ensuite, exécutez npm explain sur un paquet volumineux ou sur le chemin d'un paquet imbriqué apparaissant dans le répertoire mesuré. Si l'explication mène à une dépendance directe, ce paquet de premier niveau constitue la branche à examiner. Un paquet transitif volumineux peut également être partagé par plusieurs branches, de sorte que sa présence sous un chemin précis ne signifie pas nécessairement que seule cette dépendance directe l'utilise. npm décrit npm ls comme un arbre logique, qui peut différer de l'agencement physique de node_modules ; fiez-vous à la sortie explicative pour comprendre la relation au lieu de considérer l'imbrication des dossiers comme l'intégralité du graphe.

Séparer les dépendances de développement des dépendances de production

Un outil de développement volumineux peut être inutile dans une installation de production, alors qu'une dépendance d'exécution importante peut être indispensable à l'application. Inspectez la chaîne et vérifiez si elle provient d'une dépendance de développement ou de production dans la sortie de npm. Si vous souhaitez comparer avec une installation npm réservée à la production, npm ls --omit=dev omet les dépendances de développement de la vue de l'installation sur le disque ; cela ne les supprime pas de package.json ni du fichier lock. Confirmez le comportement et la version de npm avant d'utiliser les options d'omission dans des scripts d'automatisation. Documentation de npm install

Considérez une grande taille comme une piste, et non comme la preuve qu'un paquet est inutile. Vérifiez ce dont vos imports d'application, vos scripts de build et votre processus de déploiement ont besoin avant de supprimer ou de remplacer une dépendance. Si un fichier lock est présent, gardez-le à l'esprit lors de la comparaison des installations : il enregistre l'arbre résolu et aide à comprendre pourquoi une autre installation peut différer du dossier actuel.

Un point d'arrêt pratique

Vous obtenez une réponse utile dès lors que vous pouvez nommer le plus grand répertoire mesuré, identifier le ou les paquets qu'il contient, et utiliser npm explain pour remonter jusqu'à la dépendance racine qui les introduit. Vous disposez ainsi d'une branche concrète à examiner. L'utilisation du disque ne permet pas à elle seule de déterminer si la branche peut être supprimée en toute sécurité, et les commandes de dépendances de npm ne calculent pas la part exclusive d'un paquet lorsque des fichiers ou des dépendances sont partagés.

Sources