Como limpar node_modules e o cache do npm, pnpm e yarn no Mac
O que mais devolve espaço costuma ser apagar as pastas node_modules de projetos que você não abre mais: apague e rode o install de novo quando precisar do projeto. Os caches dos gerenciadores de pacotes podem ser limpos com segurança com npm cache clean --force, pnpm store prune e yarn cache clean, ao custo de instalações mais lentas. Confira também as versões antigas do Node no nvm ou fnm.
Projetos JavaScript ocupam espaço em dois lugares: a pasta node_modules dentro de cada projeto e o cache global do seu gerenciador de pacotes. Além disso, gerenciadores de versão como nvm e fnm guardam todas as versões do Node que você já instalou. Nada disso é perigoso de limpar se você sabe o que é cada parte. Este guia passa por elas em ordem, da maior e mais segura até as mais específicas.
Passo 1: encontre pastas node_modules antigas
Cada projeto tem a sua própria node_modules, e os projetos que você deixou de usar guardam a deles para sempre. Muitas vezes é aqui que está a maior quantidade de espaço, e a mais fácil de recuperar, porque qualquer projeto consegue recriá-la a partir do package.json e do lock file.
Meça primeiro
Rode o find só dentro da pasta onde você guarda o seu código (aqui ~/code, troque pela sua). Este comando só lê:
find ~/code -name node_modules -type d -prune -exec du -sh {} + 2>/dev/null | sort -h
O -prune impede o find de entrar em cada node_modules, então ele lista só a pasta de nível mais alto de cada projeto e roda muito mais rápido.
Para listar só os projetos cuja node_modules não muda há 90 dias:
find ~/code -name node_modules -type d -prune -mtime +90 2>/dev/null
Mantenha a busca dentro da sua pasta de código. Não rode a partir de / ou da sua pasta de usuário inteira para depois apagar os resultados: alguns apps e ferramentas globais têm a sua própria node_modules, e as versões do Node gerenciadas pelo nvm também ficam em ~/.nvm.
Apague as que você não precisa
rm -rf ~/code/old-project/node_modules
Opção: npkill
Se você prefere uma lista visual, o npkill mostra toda node_modules abaixo da pasta onde você o roda, com o tamanho e a última alteração:
cd ~/code
npx npkill --dry-run
O --dry-run só simula. Sem ele, você navega com as setas e apaga a pasta selecionada com Espaço. O próprio npkill avisa que alguns aplicativos precisam da sua node_modules para funcionar, e os marca com um sinal de alerta. Rode a partir da sua pasta de código, não da raiz do disco.
Passo 2: o cache do npm
O npm guarda cada pacote que baixa em um cache de conteúdo, por padrão em ~/.npm no macOS (os dados ficam em ~/.npm/_cacache). Você pode conferir a localização com:
npm config get cache
du -sh "$(npm config get cache)"
Menor risco: verificar
npm cache verify
Segundo a documentação do npm, isso faz a coleta de lixo dos dados que não são mais necessários e verifica a integridade do cache. É seguro rodar a qualquer momento.
Limpe o cache inteiro
O npm diz que o cache se corrige sozinho e que nunca deveria ser necessário limpá-lo por outro motivo que não seja recuperar espaço em disco. Se você quer o espaço, o clean exige --force:
npm cache clean --force
Passo 3: o store do pnpm
O pnpm guarda uma cópia de cada versão de pacote em um store compartilhado e cria links para ela nos seus projetos. No macOS, o padrão é ~/Library/pnpm/store, a menos que você defina PNPM_HOME ou XDG_DATA_HOME (configurações do store do pnpm). Para ver o seu:
pnpm store path
du -sh "$(pnpm store path)"
Para remover os pacotes que nenhum projeto usa mais:
pnpm store prune
A documentação do pnpm diz que rodar esse comando não faz mal e não tem efeitos colaterais nos seus projetos, e sugere rodá-lo de vez em quando, mas não com muita frequência. Um pacote para o qual a node_modules de um projeto antigo ainda aponta conta como usado, então apague primeiro as node_modules antigas (Passo 1) e faça o prune depois.
Passo 4: o cache do yarn
O comando depende da sua versão do yarn. Rode yarn --version para conferir.
Yarn Classic (1.x)
yarn cache dir
mostra onde fica o cache global (documentação do Yarn Classic). yarn cache list mostra os pacotes que estão nele.
yarn cache clean
Yarn Berry (2.x e posteriores)
Por padrão, o Yarn moderno guarda o cache em uma pasta global dentro de ~/.yarn/berry (a configuração enableGlobalCache é true por padrão). Alguns projetos mantêm um cache local em .yarn/cache, muitas vezes para fazer commit dele (configurações do .yarnrc.yml).
yarn cache clean --all
Segundo a referência do yarn cache clean, --mirror limpa o cache global e --all limpa tanto o cache global quanto o cache local do projeto atual. Sem opções, ele limpa só o cache local.
Passo 5: versões antigas do Node no nvm ou fnm
Cada versão do Node ocupa espaço, e os pacotes globais dela vêm junto. Os gerenciadores de versão nunca as removem sozinhos.
nvm
nvm ls
du -sh ~/.nvm/versions/node/* 2>/dev/null
nvm ls lista as versões instaladas (README do nvm). Para remover uma que você não usa:
nvm uninstall 18
nvm cache clear
nvm cache clear apaga os downloads do Node em cache.
fnm
fnm list
fnm uninstall 18
fnm list mostra as versões instaladas e fnm uninstall remove uma (comandos do fnm). Vale o mesmo aviso: você pode instalá-la de novo com fnm install.
Uma rotina simples
Uma vez por mês, rode o find do Passo 1 e apague as node_modules dos projetos que você não mexe há meses, e depois rode pnpm store prune se você usa pnpm. Limpe o cache do npm ou do yarn só quando precisar mesmo do espaço. Se você também cria apps para Apple ou usa containers, leia como apagar o DerivedData do Xcode com segurança e Docker prune no Mac. Para o resto do disco, veja como liberar espaço no Mac ou baixe o Pruneo de graça.
Perguntas frequentes
É seguro apagar a node_modules?
Sim, dentro dos seus próprios projetos. A pasta é recriada a partir do package.json e do lock file com npm install, pnpm install ou yarn install. Não apague pastas node_modules que pertencem a apps instalados ou a ferramentas globais.
Devo rodar npm cache clean --force?
Só para recuperar espaço em disco. O npm diz que o cache se corrige sozinho e que limpá-lo nunca deveria ser necessário por outro motivo. Use npm cache verify primeiro.
O pnpm store prune quebra os meus projetos?
Não. O pnpm diz que ele só remove pacotes que nenhum projeto referencia e não tem efeitos colaterais nos seus projetos. Um install futuro pode baixar de novo um pacote removido.
Onde fica o store do pnpm no Mac?
Por padrão em ~/Library/pnpm/store, a menos que PNPM_HOME ou XDG_DATA_HOME esteja definido. Rode pnpm store path para ver a localização exata.