¿Cómo limpiar la carpeta node_modules de paquetes que no están en package.json?

338

Supongamos que instalo paquetes de proyectos con los npm installque se buscan package.jsonmódulos para instalar. Después de un tiempo veo que no necesito algún módulo específico y elimino su dependencia package.json. Luego elimino algunos otros módulos package.jsonporque ya no son necesarios y otros son reemplazados por alternativas.

Ahora quiero limpiar la node_modulescarpeta para que solo los módulos enumerados se package.jsonqueden allí y el resto debe ir, algo así npm clean. Sé que puedo eliminarlos manualmente, pero me gustaría tener una buena funcionalidad de azúcar lista para usar para eso.

Sergei Basharov
fuente

Respuestas:

407

Creo que estas buscando npm prune

npm prune [<name> [<name ...]]

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.

Ver los documentos: https://docs.npmjs.com/cli/prune

David Sherret
fuente
1
Hasta donde sé, en la nueva versión de NPM, todas las dependencias se encuentran en la node_modulescarpeta raíz , y no como antes, donde cada dependencia tenía sus propias dependencias instaladas en sus propias node_modulescarpetas ... con innumerables copias de las mismas dependencias ... Entonces, ¿ npm prunetiene esto en cuenta? porque esas dependencias profundas no están escritas en la parte principal package.jsonde su proyecto ... la ciruela debe verse de forma recursiva
vsync
2
@vsync La reducción de duplicación se logra con el comando npm dedupe docs.npmjs.com/cli/dedupe . Intenta simplificar el árbol de nodos moviendo las dependencias hacia arriba del árbol.
knaos
He visto que NPM podar no puede eliminar cosas que generalmente se arruinan cuando mi repositorio corporativo tiene algo molesto. Entonces tengo que rm-rf. Sería bueno si hubiera un comando de "golpear todo y luego recuperar todo de una vez"
ggb667
210

Puede eliminar su carpeta node_modules / y luego reinstalar las dependencias de package.json.

rm -rf node_modules/
npm install

Esto borraría todos los paquetes instalados en la carpeta actual y solo instalaría las dependencias de package.json. Si las dependencias se han instalado previamente, npm intentará usar la versión en caché, evitando descargar la dependencia por segunda vez.

adamduren
fuente
44
Sí, sé que puedo usar este método, pero tengo curiosidad por qué todavía no hay una solución más elegante para eso.
Sergei Basharov
¿Realmente no hay un comando npm para eliminar node_modules que no sea eliminar la carpeta?
Anders
44
En la plataforma de Windows, falla al eliminar node_modules a través del Explorador o la línea de comando (ya que la ruta a algunos módulos es más larga que 256). Debe haber un comando npm para hacerlo de una manera más limpia.
Ravi Kumar el
99
O usando rmdir node_modules /s /qen Windows. superuser.com/a/179661/440976
Wédney Yuri
55
Creo que a esta respuesta le falta un punto muy importante: si está restringido por el tráfico (es decir, tiene la conexión costosa por megabyte pagado como móvil) y tiene muchos módulos, esto puede costarle , mientras que la pruneopción requiere que tengas conexión a internet.
Ivan Kolmychek
103

Debido a su anidación de carpetas, Windows no puede eliminar la carpeta ya que su nombre es demasiado largo. Para resolver esto, instale RimRaf:

npm install rimraf -g

rimraf node_modules
usuario3844078
fuente
8
O simplementerm -rf node_modules
kappaallday el
16
rm -rf node_modulesNo funcionará en Windows. Ver esta solución: superuser.com/a/179661/440976
Wédney Yuri
1
win7 x64 rimraf funcionó muy bien a través de PowerShell .. gracias
gorelativo
La mejor solución para Windows 10 de 64 bits a través de CMD
Matt Cromwell
rm -rf node_modules no funcionó para mí en Windows 10. Pero rimraf funcionó para mí
ssmsnet
24

simple solo corre

rm -r node_modules

de hecho, puedes eliminar cualquier carpeta con esto.

como rm -r AnyFolderWhichIsNotDeletableFromShiftDeleteOrDelete .

simplemente abra el movimiento gitbash a la raíz de la carpeta y ejecute este comando

Espero que esto ayude.

Ajay Kotnala
fuente
2
No funciona, obtengo un error de "permiso denegado" (usando gitbash.
drake035
3
Abra gitbash en modo administrador. Supongo que eso ayudará. o cambiar la configuración de nivel de permiso de carpeta
Ajay Kotnala
3
Esto eliminaría todos los paquetes. El OP dice claramente "Quiero limpiar la carpeta node_modules para que solo los módulos listados en package.json permanezcan allí".
Boaz
en ese caso, amigo mío, simplemente puede hacer "npm uninstall package_name" o --save como sufijo que también eliminará su entrada del archivo package.json. npm desinstalar nombre_paquete (eliminar paquete) npm desinstalar nombre_paquete --save (eliminar paquete y eliminar entrada de dependencias en paquete json) npm desinstalar nombre_paquete --save-dev (eliminar paquete y eliminar entrada de dependencias dev en paquete json)
Ajay Kotnala
22

Primero instale rimraf a nivel mundial

npm install rimraf -g

vaya a la ruta usando cmd donde está la carpeta node_modules y aplique el siguiente comando

rimraf node_modules
Ankit Parmar
fuente
buena respuesta, pero instalar un paquete para desinstalar otros no es una buena idea. npm pruneEs una solución ideal.
Binayak Gouri Shankar
Sí, pero si desea eliminar la carpeta node_module de su proyecto, esta es la mejor y más fácil manera.
Ankit Parmar
9

desde la versión 6.5.0 npm admite el comando clean-installpara actualizar todos los paquetes

Giuseppe B
fuente
1
Esto es exactamente lo que necesitaba. Cuando actualizo el nodo, lo primero que sucede es "parece que has cambiado tu entorno desde la ejecución de 'npm install'". Desde ya estoy en la consola, lo más fácil es simplemente limpia a instalar en lugar de jugar un poco eliminación de carpetas primer etc
Jarrod McGuire
3

He agregado algunas líneas dentro de package.json:

"scripts": {
  ...
  "clean": "rmdir /s /q node_modules",
  "reinstall": "npm run clean && npm install",
  "rebuild": "npm run clean && npm install && rmdir /s /q dist && npm run build --prod",
  ...
}

Si cleansolo quieres puedes usar esto rimraf node_moduleso rm -rf node_modules.

Funciona bien

Amitesh Singh
fuente
1

El mejor artículo que encontré al respecto es este: https://trilon.io/blog/how-to-delete-all-nodemodules-recursively

Todo desde la consola y fácil de ejecutar desde cualquier punto de carpeta.

Pero como resumen del artículo, este comando busca el tamaño de cada node_modulecarpeta encontrada en diferentes proyectos.

find . -name "node_modules" -type d -prune -print | xargs du -chs

Y para eliminarlos realmente:

find . -name 'node_modules' -type d -prune -print -exec rm -rf '{}' \;

El artículo también contiene instrucciones para el shell de Windows.

robertovg
fuente
0

Elimine / edite los paquetes que no son necesarios en package-lock.json (los nombres de los paquetes se escribirán en dependencias y devDependencies) y luego

npm install

Fakrudeen
fuente
-2

Utilice el siguiente comando en lugar de npm install

npm ci
Jasmin Mistry
fuente
npm ci instala los paquetes listados en shrinkwrap.json
LuckyLikey