Ménage dans les node_modules

Publié le 11 septembre 2023, par Richard Carlier
Série: Libérer de l'espace disque
#bash #node #node_modules

Il est un rituel chez moi, en fin d’année scolaire (ou parfois en début de l’année suivante). Celui de faire le ménage.

La data est partout, y compris dans les fichiers, qui a force, prennent de la place. Inutilement quand ce sont des fichiers inutiles.

Dans l’épisode du jour, je traque les dossiers node_modules

Node Quoi ?

Le dossier node_modules, dans un projet node (ou vue, ou react…) a comme rôle principal de stocker les dépendances d’un projet, c’est-à-dire les packages JavaScript externes nécessaires au bon fonctionnement de l’application ou du script en cours de développement.

Les dépendances sont généralement des bibliothèques ou des modules tiers qui étendent les fonctionnalités de votre projet ou fournissent des fonctionnalités spécifiques.

J’en ai d’ailleurs déjà parlé lors de mon article sur le Dependence Day.

Mais pourquoi les supprimer ?

En théorie, tant que le projet est actif, ce n’est pas une bonne idée.

Cela supprimera toutes les dépendances nécessaires au bon fonctionnement du projet. Ce qui signifie que le projet ne pourra plus être exécuté (à moins, bien sûr, de les réinstaller, via un npm install).

Dans mon cas, cela encombre.

Car, il s’agit pour moi de supprimer les node_modules des projets qui ne sont plus actifs. Principalement:

  • les rendus des élèves (qui sont souvent des fichiers zip à la base avec leur code, que je dézippe et installe pour les exécuter afin de les noter…) Par réflexe, j’ai pris l’habitude une fois la correction faite, de tout conserver. Mais il faut bien le dire: je pourrais ne garder que le code.
  • mes exemples de cours (une fois le cours donné, je garde les sources, mais je relance rarement le projet)
  • mes expérimentations avant les cours (qui, une fois le cours donné…)

Bref, du ménage à faire.

Les trouver…

On pourrait utiliser le finder, mais…

Cela ne m’avance pas car cela ne m’indique pas où ils sont.

Ni qui ils sont : parfois, un dossier node_modules contient des packages qui contiennent eux-même des dossiers node_modules (une sorte de multi-dépendances…).

Alors, j’ai pensé traquer en python.

Et puis je me suis dit…

Le pouvoir du Terminal

Travailler avec des fichiers est souvent un travail lent, surtout si on parcourt des répertoires, sous répertoires, en nombre (et le fait est, que les dossiers node_modules sont souvent avec beaucoup de fichiers (plus de 50000 fichiers de dépendances pour un projet react par exemple).

Le plus puissant à ce jeu, c’est le terminal, puisque on travaille en direct sans s’inquiéter d’une interface graphique.

Alors à l’attaque: on crée un script bash (car je suis sur Mac, et que bash est mon interpréteur de commande).

Plusieurs outils systèmes vont entrer en jeu:

  • find, qui comme son nom le laisse supposer permet de trouver des fichiers selon différents critères (ici, le nom)
  • du, pour disc usage pour calculer le poids
  • grep, pour filtrer les réponses qui contiendraient 2 fois node_modules (donc, les multi dépendances)
  • awk, ici utilisé pour analyser, filtrer et formater des données textuelles, et en l’occurrence calculer le total.

Le script findNodeModules.sh ?

#!/bin/bash

find . -type d -name "node_modules" -exec du -sh {} \; | grep -v '/node_modules/' | \
awk '{s+=$1; print $0} END {print "Total général : " s}'

Je le mets aussi en image, des fois que certains caractères ne passent pas. Et c’est plus coloré.

On le place dans le path, et on n’oublie pas de le rendre exécutable.

# Le rendre exécutable
chmod +x findNodeModules.sh

# Le mettre dans le path
sudo cp findNodeModules.sh /usr/local/bin

et hop, ne reste plus qu’à le lancer…

9 Go au total rien que pour l’année 22/23? Principalement des projets VueJS. Mazette… ça va vite quand même 😉

Et 14Go dans un vieux dossier de travail… Et sans doute d’autres qui trainent.

Après, un petit accès via le finder pour y accéder et les supprimer sans état d’âme

Note: finalement, le plus long a été de vider la corbeille.

Top