Para averiguar qué está haciendo que la instalación de un proyecto de Node sea grande en macOS, mida los paquetes instalados y luego rastree los mayores candidatos hacia atrás en el árbol de dependencias de npm. En Terminal, comience desde el directorio del proyecto: du muestra el uso de disco, npm ls enumera el árbol instalado y npm explain muestra por qué un paquete está presente. Estos responden a preguntas diferentes: el tamaño señala qué ocupa espacio; la cadena de dependencias señala qué lo trajo.

Medir los paquetes instalados en macOS

Abra Terminal, vaya a la carpeta del proyecto y verifique que contenga node_modules antes de medir. Los siguientes comandos funcionan en el zsh por defecto de macOS y evitan depender del comportamiento de los comodines del 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 reporta un total legible para humanos para cada directorio inmediato, y sort -h ordena esos totales de menor a mayor. Lea desde abajo para ver las entradas más grandes. El comando find mide cada directorio de nivel superior una vez: por ejemplo, reporta node_modules/@example como un directorio de ámbito (scope) combinado, no cada paquete con ámbito por separado. Este es un primer paso útil, no un informe del coste atribuible individualmente a cada dependencia.

Si el comando dice que node_modules no existe, es posible que el proyecto aún no tenga un árbol de dependencias instalado, o que usted esté en el directorio equivocado. Compruebe el gestor de paquetes y el archivo de bloqueo (lockfile) del proyecto antes de instalar cualquier cosa solo para medirla. El lockfile de npm describe un árbol de dependencias resuelto, mientras que los archivos instalados son lo que mide du. Documentación de package-lock de npm

Rastrear un directorio grande hasta su cadena de dependencias

Use npm ls para inspeccionar el árbol lógico de dependencias de npm. Su salida por defecto se centra en los paquetes de nivel superior; --all amplía la lista a las dependencias transitivas. La documentación de npm ls

npm ls --all

Para un proyecto grande, la lista completa puede ser difícil de manejar. Una vez que tenga un nombre de paquete candidato del árbol, pregúntele a npm por qué está instalado:

npm explain package-name

Reemplace package-name con el nombre real, como some-library. La salida sigue la cadena de dependencias hacia el proyecto raíz. Si npm reporta múltiples copias o versiones, identifique la ubicación instalada relevante en la lista y pase esa ruta a npm explain, por ejemplo:

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

npm documenta npm explain para rastrear la cadena que hace que un paquete se instale, incluida una carpeta particular cuando una dependencia está anidada. Documentación de npm explain

Inspeccionar paquetes con ámbito (scoped) y carpetas anidadas

La primera medición agrupa un ámbito como @example en un solo directorio. Para inspeccionar sus directorios de paquetes inmediatos, ejecute:

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

Reemplace @example con el ámbito que vio en la primera medición. Entrecomille la ruta del ámbito si usa una variable o una ruta que contenga espacios. Para un paquete sin ámbito, mida su carpeta directamente, por ejemplo du -sh "node_modules/some-library". La carpeta de un paquete puede incluir sus propias dependencias anidadas; medir tanto un directorio principal como uno anidado cuenta algunos archivos dos veces si suma los totales. Use estas cifras para localizar candidatos, no para calcular una contribución exacta para cada rama.

A continuación, ejecute npm explain en un paquete grande o en una ruta de paquete anidado que aparezca dentro del directorio medido. Si la explicación apunta a través de una dependencia directa, ese paquete de nivel superior es la rama que se debe investigar. Un paquete transitivo grande también puede ser compartido por varias ramas, por lo que su presencia bajo una ruta no significa necesariamente que solo esa dependencia directa lo utilice. npm describe npm ls como un árbol lógico, que puede diferir del diseño físico de node_modules; use la salida explicativa para comprender la relación en lugar de tratar el anidamiento de carpetas como el grafo completo.

Separar las dependencias de desarrollo de las dependencias de producción

Una herramienta de desarrollo grande puede ser innecesaria en una instalación de producción, mientras que una dependencia de tiempo de ejecución grande puede ser requerida por la aplicación. Inspeccione la cadena y si proviene de una dependencia de desarrollo o de producción en la salida de npm. Si desea comparar una instalación de npm solo para producción, npm ls --omit=dev omite las dependencias de desarrollo de la vista de instalación en disco; no las elimina de package.json ni del lockfile. Confirme el comportamiento y la versión de npm antes de usar opciones de omisión en la automatización. Documentación de install de npm

Considere un tamaño grande como una pista, no como una prueba de que un paquete sea innecesario. Compruebe qué requieren las importaciones de su aplicación, los scripts de compilación y el proceso de despliegue antes de eliminar o reemplazar una dependencia. Si hay un lockfile presente, manténgalo a la vista al comparar instalaciones: registra el árbol resuelto y ayuda a explicar por qué otra instalación puede diferir de la carpeta actual.

Un punto de parada práctico

Tiene una respuesta útil cuando puede nombrar el directorio medido más grande, identificar el paquete o los paquetes dentro de él y usar npm explain para rastrearlos hasta la dependencia raíz que los introduce. Eso le da una rama concreta para revisar. El uso de disco por sí solo no puede decidir si es seguro eliminar la rama, y los comandos de dependencias de npm no calculan la cuota exclusiva de un paquete cuando se comparten archivos o dependencias.

Fuentes