Como limpar a pasta node_modules dos pacotes que não estão no package.json?

338

Suponha que eu instale os pacotes do projeto npm installque analisem os package.jsonmódulos a serem instalados. Depois de um tempo, vejo que não preciso de um módulo específico e removo sua dependência de package.json. Depois, removo alguns outros módulos package.jsonporque não são mais necessários e outros são substituídos por alternativas.

Agora eu quero limpar a node_modulespasta para que apenas os módulos listados package.jsonfiquem lá e o restante deva ir, algo assim npm clean. Eu sei que posso removê-los manualmente, mas gostaria de ter algumas boas funcionalidades prontas para usar o açúcar.

Sergei Basharov
fonte

Respostas:

407

Acho que você está procurando npm prune

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

Este comando remove pacotes "estranhos". Se um nome de pacote for fornecido, apenas os pacotes correspondentes a um dos nomes fornecidos serão removidos.

Pacotes estranhos são aqueles que não estão listados na lista de dependências do pacote pai.

Consulte os documentos: https://docs.npmjs.com/cli/prune

David Sherret
fonte
11
Até onde eu sei, na nova versão do NPM, todas as dependências estão localizadas na node_modulespasta raiz , e não como antes, onde cada dependência tinha suas próprias dependências instaladas em suas próprias node_modulespastas ... com inúmeras cópias das mesmas dependências ... então npm pruneleva isso em consideração? porque essas dependências profundas não estão escritas na parte principal package.jsondo seu projeto. A remoção deve ser recursiva.
vsync
2
@vsync A redução de duplicação é obtida com o comando npm dedupe docs.npmjs.com/cli/dedupe . Ele tenta simplificar a árvore de nós, movendo as dependências para cima na árvore.
knaos
Eu vi a remoção do NPM falhar ao excluir as coisas que geralmente estão estragando quando o meu repositório corporativo tem algo errado. Então eu tenho que rm-rf. Seria bom se houvesse um "golpe Everythin fora tudo em seguida, ReGet tudo de uma só vez" comando
ggb667
209

Você pode remover sua pasta node_modules / e reinstalar as dependências do package.json.

rm -rf node_modules/
npm install

Isso apagaria todos os pacotes instalados na pasta atual e instalaria apenas as dependências do package.json. Se as dependências foram instaladas anteriormente, o npm tentará usar a versão em cache, evitando o download da dependência pela segunda vez.

adamduren
fonte
4
Sim, eu sei que posso usar esse método, mas estou curioso para saber por que ainda não há uma solução mais elegante para isso.
Sergei Basharov
Não há realmente nenhum comando npm para excluir node_modules além de excluir a pasta?
Anders
4
Na plataforma Windows, ele falha ao excluir node_modules através do Explorer ou da linha de comando (já que o caminho para alguns módulos é maior que 256). Deve haver um comando npm para fazer isso de uma maneira mais limpa.
Ravi Kumar
9
Ou usando rmdir node_modules /s /qno Windows. superuser.com/a/179661/440976
Wédney Yuri
5
Penso que esta resposta está faltando um ponto muito importante: se você está limitado pelo tráfego (ou seja, você tem a conexão cara por megabyte paga como móvel) e tem muitos módulos, isso pode custar a você , enquanto a pruneopção requer que você tenha conexão com a Internet.
Ivan Kolmychek
102

Devido ao seu aninhamento de pastas, o Windows não pode excluir a pasta, pois seu nome é muito longo. Para resolver isso, instale o RimRaf:

npm install rimraf -g

rimraf node_modules
user3844078
fonte
8
Ou apenasrm -rf node_modules
kappaallday
16
rm -rf node_modulesnão funcionará no Windows. Veja esta solução: superuser.com/a/179661/440976
Wédney Yuri
11
Win7 x64 rimraf trabalhou muito através PowerShell .. obrigado
gorelative
Melhor solução para Windows 10 de 64 bits via CMD
Matt Cromwell
rm -rf node_modules não funcionou para mim no Windows 10. Mas rimraf funcionou para mim
ssmsnet
24

simples, basta correr

rm -r node_modules

de fato, você pode excluir qualquer pasta com isso.

como rm -r AnyFolderWhichIsNotDeletableFromShiftDeleteOrDelete .

basta abrir o gitbash mover para a raiz da pasta e executar este comando

Espero que isso ajude.

Ajay Kotnala
fonte
2
Não funcionar, eu recebo uma "permissão negada" erro (usando gitbash.
drake035
3
abra o gitbash no modo de administrador. Eu acho que isso vai ajudar. ou configurações de nível de permissão pasta mudança
Ajay Kotnala
3
Isso excluiria todos os pacotes. O OP diz claramente "Quero limpar a pasta node_modules para que apenas os módulos listados no package.json fiquem lá".
Boaz - Restabelece Monica
nesse caso, meu amigo, você pode simplesmente "npm uninstall package_name" ou --save como sufixo que excluirá sua entrada do arquivo package.json também. npm desinstalar package_name (excluir pacote) npm desinstalar package_name --save (excluir pacote e remover entrada de dependências no pacote json) npm desinstalar package_name --save-dev (excluir pacote e remover entrada de devdependencies no pacote json)
Ajay Kotnala
22

Primeira instalação global do rimraf

npm install rimraf -g

vá para o caminho usando cmd em que sua pasta node_modules e aplique o comando abaixo

rimraf node_modules
Ankit Parmar
fonte
boa resposta, mas instalar um pacote para desinstalar outros não é uma boa ideia. npm pruneé uma solução ideal.
Binayak Gouri Shankar 11/03
Sim, mas se você deseja remover a pasta node_module do seu projeto, esta é a melhor e mais fácil.
Ankit Parmar
9

Você já experimentou a remoção da NPM?

ele deve desinstalar tudo que não está listado no seu arquivo de pacote

https://npmjs.org/doc/cli/npm-prune.html

Christoffer Bo Petersen
fonte
9

da versão 6.5.0 npm suporta o comando clean-installpara atualizar todos os pacotes

Giuseppe B
fonte
11
Isso é exatamente o que eu precisava. Quando eu atualizo o nó, a primeira coisa que acontece é "parece que você mudou seu ambiente desde a execução do 'npm install'". Como eu já estou no console, é mais fácil simplesmente limpa a instalar em vez de andar apagar pastas primeira etc.
Jarrod McGuire
3

Eu adicionei algumas linhas dentro do 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",
  ...
}

Se você quiser cleanapenas você pode usar este rimraf node_modulesou rm -rf node_modules.

Funciona bem

Amitesh Singh
fonte
1

O melhor artigo que encontrei sobre este é este: https://trilon.io/blog/how-to-delete-all-nodemodules-recursively

Tudo a partir do console e fácil de executar a partir de qualquer ponto da pasta.

Mas, como resumo do artigo, este comando para encontrar o tamanho de cada node_modulepasta encontrada em projetos diferentes.

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

E para realmente removê-los:

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

O artigo também contém instruções para o shell do Windows.

robertovg
fonte
0

Remova / edite os pacotes que não são necessários no package-lock.json (os nomes dos pacotes serão escritos em dependencies & devDependencies) e, em seguida,

npm install

Fakrudeen
fonte
-2

Use o seguinte comando em vez de npm install

npm ci
Jasmin Mistry
fonte
O npm ci instala os pacotes listados no
shrinkwrap.json