Comando npm para desinstalar o podar paquetes no utilizados en Node.js

414

¿Hay alguna manera de desinstalar simplemente todas las dependencias no utilizadas (no declaradas) de un proyecto Node.js (las que ya no están definidas en mi package.json). Cuando actualizo mi aplicación, me gusta que los paquetes no referenciados se eliminen automáticamente.

Tarion
fuente
1
No utilizado por qué? ¿Quiere decir eliminar carpetas de node_modulescuando se eliminan de las respectivas package.json?
Fallece el
1
exactamente, mhm npm ll ya da una buena pista de cuáles son los candidatos.
Tarion

Respuestas:

670

Nota : Las npmversiones recientes hacen esto automáticamente cuando los bloqueos de paquetes están habilitados, por lo que esto no es necesario, excepto para eliminar paquetes de desarrollo con el --productionindicador.


Ejecute npm prunepara eliminar los módulos que no figuran en package.json.

De npm help prune:

Este comando elimina paquetes "extraños". Si se proporciona un nombre de paquete, solo se eliminan los paquetes que coinciden con uno de los nombres proporcionados.

Los paquetes extraños son paquetes que no figuran en la lista de dependencias del paquete principal.

Si --productionse especifica el indicador, este comando eliminará los paquetes especificados en sus devDependencies.

Darkhogg
fuente
3
Si lo leí correctamente, esto eliminaría todas las subdependencias, ya que no figuran en la lista package.json. ¿Está bien? Entonces, la próxima actualización o instalación tendría que reinstalarlos.
nshew
1
Sí, eliminará las subdependencias. Las subdependencias se almacenan realmente dentro del propio node_modulesdirectorio del módulo , por lo que se eliminan con el módulo.
Darkhogg
2
Déjame dar un ejemplo. Quito el karma de mi package.json, pero dejo la glorieta. Cuando corro npm prune, espero node_modulesque se elimine todo el karma, incluida su propia carpeta que contiene sus dependencias. ¿Qué pasa con las dependencias de bower (bower-json, bower-logger, chmodr, fstream, glob, et al.). Técnicamente, esos no figuran en mi proyecto package.json. ¿Se han eliminado o no?
nshew
3
No, ellos no son. Tenga en cuenta que son no en su propio node_modules, pero en el interior node_modules/bower/node_modules , "protegidos" por node_modules/bower/package.json. Las dependencias de su paquete y las de las dependencias de su paquete no son mixtas .
Darkhogg
2
y elimine su envoltura retráctil antes de la instalación de npm, debería haber estado en las instrucciones anteriores.
Andy Ray
306

Si no está preocupado por un par de minutos para hacerlo, una solución sería reconstruir los módulos locales una rm -rf node_modulesy npm installotra vez.

Pyrce
fuente
93
Sería bueno si la gente dejara de votar sin comentarios ... es una estrategia válida para restablecer las dependencias de un proyecto de nodo como alternativa a la respuesta aceptada. Si dañó el contenido de un subdirectorio node_modules (fácil de hacer con dependencias vinculadas a símbolos) o si ha tenido cambios adicionales como node o npm version bumps prune no limpiará correctamente la carpeta node_modules, pero esta respuesta sí lo hará.
Pyrce
41
La reconstrucción node_modulestambién verifica que el package.jsonarchivo describa un gráfico de dependencia reproducible. Eliminar y volver a instalar su node_moduleses básicamente una prueba de implementación.
joemaller
2
@joemaller No necesariamente, la mayoría de los flujos de trabajo de implementación tienen, implícita o explícitamente, algún tipo de caché. Si un paquete ya está instalado y cumple con las especificaciones, se conserva. La eliminación y la reinstalación harán que los paquetes lleguen a la última versión que coincida.
Darkhogg
77
npm pruneno ayudó ni un ápice, pero esto sí. Mi problema fue un enlace simbólico roto.
Eirik Birkeland
8
En muchas circunstancias no ideales, actualmente no es factible con npm. Además, la pregunta definitivamente no especificó alguna restricción sobre el trabajo repetido o la búsqueda adicional, sino cómo lograr el objetivo final. Esta respuesta satisface la pregunta como se indicó, a pesar de lo que otros quieran más allá de ese objetivo.
Pyrce
10

Puede usar npm-prune para eliminar paquetes extraños.

npm prune [[<@scope>/]<pkg>...] [--production] [--dry-run] [--json]

Este comando elimina paquetes "extraños". Si se proporciona un nombre de paquete, solo se eliminan los paquetes que coinciden con uno de los nombres proporcionados.

Los paquetes extraños son paquetes que no figuran en la lista de dependencias del paquete principal.

Si el --production se especifica la bandera o NODE_ENV variable de entorno se establece en la producción , este comando eliminará los paquetes especificados en sus devDependencies . Configuración --no-producción negará NODE_ENV se establece en la producción .

Si se usa el indicador --dry-run , no se realizarán cambios.

Si se usa la bandera --json , los cambios realizados por npm prune (o que se habrían hecho con --dry-run ) se imprimen como un objeto JSON.

En funcionamiento normal con bloqueos de paquete habilitados, los módulos extraños se podan automáticamente cuando se instalan módulos y solo necesitará este comando con el indicador --production .

Si ha deshabilitado los bloqueos de paquetes, los módulos extraños no se eliminarán y depende de usted ejecutar npm prune de vez en cuando para eliminarlos.

Use npm-dedupe para reducir la duplicación

npm dedupe
npm ddp

Busca en el árbol de paquetes local e intenta simplificar la estructura general moviendo las dependencias más arriba del árbol, donde pueden ser compartidas de manera más efectiva por múltiples paquetes dependientes.

Por ejemplo, considere este gráfico de dependencia:

a
+-- b <-- depends on c@1.0.x
|    `-- c@1.0.3
`-- d <-- depends on c@~1.0.9
     `-- c@1.0.10

En este caso, npm-dedupe transformará el árbol en:

 a
 +-- b
 +-- d
 `-- c@1.0.10

Debido a la naturaleza jerárquica de la búsqueda de módulos del nodo, byd obtendrán su dependencia con el paquete c único en el nivel raíz del árbol.

El algoritmo de deduplicación recorre el árbol, moviendo cada dependencia lo más arriba posible en el árbol, incluso si no se encuentran duplicados. Esto dará como resultado un árbol plano y deduplicado.

Igor Litvinovich
fuente
Tengo MÁS elementos en mi carpeta node_modules después de ejecutar npm dedupe. ¡Suspiro!
Neville