Cuando estamos programando en JavaScript u otro lenguaje que haga uso de nodejs se crea un subdirectorio en nuestra carpeta de desarrollo llamada node_modules. En esta carpeta, si nos atrevemos a echar un vistazo en su interior, podemos encontrar decenas de otros subdirectorios que corresponden a los diferentes módulos que nuestra aplicación necesitara para funcionar.
En principio no hay ningún problema con esto, pero en algún momento, tras empezar decenas de proyectos o hacer diferentes pruebas de concepto nos encontramos con que existen demasiados de estos directorios llamados node_modules y quizás nos planteemos el borrarlos.
Por la propia estructura de los archivos de node_modules los archivos en ella tienen varias características. Algunos de los módulos que podemos encontrar estarán duplicados en otros proyectos en los que también estemos trabajando, ocupando un espacio innecesario en disco mientras los proyectos estén ahí inertes. Una vez retomemos el trabajo con ellos en el caso de que node_modules no exista podemos forzar a reinstalar los módulos necesarios en el proyecto con un npm install.
Además, siendo la mayoría de los archivos en node_modules ficheros de código en JavaScript o TypeScript, estos no suelen tener un tamaño muy grande, buena parte de ellos en el rango de kilobytes o menos pero su almacenamiento en disco implica que pueden ocupar un clúster entero, siendo fácilmente que hoy en día encontremos clústeres de de 8 kilobytes o incluso 16kb siendo esto es muy muy ineficiente. El sistema operativo inteligentemente almacenará estos archivos en el $MFT donde los archivos pequeños ocuparán solo lo que es necesario, pero su acceso y modificación es más lenta y fomenta la fragmentación del $MFT teniendo esto incluso un impacto global en el sistema.
Podemos apreciar esto cuando tratamos de borrar manualmente una carpeta node_modules mediante el Explorador de Windows y observamos lo lento que puede llegar a ser borrar los cientos de archivos y carpetas que se alojan allí. Por ejemplo, un proyecto recién iniciado de Nestjs tiene casi 30.000 ficheros y casi 3.000 subdirectorios y ocupa unos 265 megabytes. Incluso con almacenamiento SSD borrar node_modules para este proyecto requiere en mi equipo alrededor de 30 segundos.
Una vez visto que el directorio node_modules en aquellos proyectos inertes ocupa un considerable espacio, aloja multitud de archivos duplicados y fomenta la fragmentación del $MFT, borrar node_modules donde se requiera es seguramente una buena decisión, pero entonces vemos que tenemos decenas de proyectos iniciados y hacerlo manualmente para cada uno de ellos es lento y tedioso y como preferimos dedicar el tiempo a tareas más provechosas o estimulantes buscamos la forma de hacerlo de forma automatizada.
Es entonces cuando a nuestro rescate viene una utilidad que podemos encontrar en las diferentes distribuciones Linux, el programa find. Pero estarás pensando, en Windows no tenemos los comandos de Linux, y esto es verdad salvo que hayas instalado git para hacer control de versiones para tu código. Cuando instalas git tienes la opción de instalar bash también y es entonces cuando se instala find y otros comandos propios de Linux en nuestro Windows.
Ya casi estamos llegando al final, pero quisiera mencionar algo antes de mostrarte la línea de comando que hace la magia de borrar todo, y es que va a borrar todas las carpetas node_modules a partir de donde ejecutes el comando. Tendrás que tener bien claro que es esto lo que quieres hacer, borrar todos los node_modules y hacerlo exactamente en el directorio deseado de donde quieres que parta el borrado de todos los node_modules. Si quieres que borre solo algunas carpetas node_modules pero no todas tendrás que adecuar lo que aquí se explica a tu caso particular o quizás usar lo que al final de todo este texto te mostraré también.
Es conveniente también que antes de copiar y pegar un comando en un terminal trates de entender que es lo que el comando hace realmente. Es algo que ya sabes porque o eres un usuario avanzado o un profesional y conoces de los riesgos de copiar, pegar y ejecutar comandos a ciegas, pero no hay daño en recordarlo por si acaso.
Para terminar aquí tienes las instrucciones. Ejecutaremos el comando en la carpeta raíz donde se alojan los proyectos que contienen los directorios node_modules que queramos borrar. Todos los node_modules que penden de ese directorio serán borrados definitivamente. Abrimos un terminal de bash, que como comentamos antes deberás haber instalado con con git y ahí ejecutamos:
find . -name 'node_modules' -type d -prune -exec rm -rf '{}' +
Y ya no tienes que hacer nada más. Unos segundos después no habrá node_modules bajo ese directorio.
Si te preguntas que hace el comando, simplemente, lo que hace es que a partir del directorio donde estamos ( . ) ejecuta el comando rm -rf '{}' (con -exec ) tantas veces como se encuentra un fichero de tipo directorio ( -type d ) y con nombre node_modules ( -name ‘node_modules’ ) sustituyendo ‘{}’ por la ruta al fichero encontrado. La opción prune hace que no se entre en el directorio node_modules encontrado para seguir buscando a dentro de él. Es decir como vamos a borrar el node_modules con su contenido no tiene sentido buscar también dentro del node_modules que va a ser borrado.
Bueno, esto es todo. Espero que todo esto te solucione algún problema y haya servido también para conocer el comando find que es una utilidad muy potente y adecuada para resolver múltiples problemas con ficheros.
Para terminar, en el caso de que todo esto no te convenza mucho échale un ojo a npkill que tiene una línea de comando como :
npx npkill
y mediante un sencillo menú te permite seleccionar los proyectos de los que quieres que se borre el node_modules.