Para descobrir o que está deixando a instalação de um projeto Node grande no macOS, meça os pacotes instalados e rastreie os maiores candidatos por meio da árvore de dependências do npm. No Terminal, comece a partir do diretório do projeto: o du mostra o uso do disco, o npm ls lista a árvore instalada e o npm explain mostra por que um pacote está presente. Estes respondem a diferentes perguntas: o tamanho aponta para o que ocupa espaço; a cadeia de dependências aponta para o que o trouxe para o projeto.
Medir os pacotes instalados no macOS
Abra o Terminal, navegue até a pasta do projeto e verifique se ela contém a pasta node_modules antes de medir. Os comandos a seguir funcionam no zsh padrão do macOS e evitam depender do comportamento de caracteres curinga (wildcards) do 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
O du -sh relata um total legível para humanos para cada diretório imediato, e o sort -h ordena esses totais do menor para o maior. Leia de baixo para cima para ver as maiores entradas. O comando find mede cada diretório de nível superior uma única vez: por exemplo, ele relata node_modules/@example como um único diretório de escopo combinado, e não cada pacote com escopo separadamente. Esta é uma primeira etapa útil, não um relatório do custo atribuível individualmente a cada dependência.
Se o comando indicar que node_modules não existe, o projeto pode ainda não ter uma árvore de dependências instalada ou você pode estar no diretório errado. Verifique o gerenciador de pacotes e o arquivo lockfile do projeto antes de instalar qualquer coisa apenas para medi-la. O lockfile do npm descreve uma árvore de dependências resolvida, enquanto os arquivos instalados são o que o du mede. Documentação do package-lock do npm
Rastrear um diretório grande até sua cadeia de dependências
Use o npm ls para inspecionar a árvore lógica de dependências do npm. Sua saída padrão foca nos pacotes de nível superior; --all expande a listagem para dependências transitivas. Documentação do npm ls
npm ls --all
Para um projeto grande, a listagem completa pode ser difícil de manusear. Assim que tiver o nome de um pacote candidato a partir da árvore, pergunte ao npm por que ele está instalado:
npm explain package-name
Substitua package-name pelo nome real, como some-library. A saída segue a cadeia de dependências em direção ao projeto raiz. Se o npm relatar várias cópias ou versões, identifique o local instalado relevante na listagem e passe esse caminho para o npm explain, por exemplo:
npm explain node_modules/parent-package/node_modules/package-name
O npm documenta o npm explain para rastrear a cadeia que causa a instalação de um pacote, incluindo uma pasta específica quando uma dependência está aninhada. Documentação do npm explain
Inspecionar pacotes com escopo e pastas aninhadas
A primeira medição agrupa um escopo como @example em um único diretório. Para inspecionar seus diretórios imediatos de pacotes, execute:
find node_modules/@example -mindepth 1 -maxdepth 1 -type d -prune -exec du -sh {} + | sort -h
Substitua @example pelo escopo que você viu na primeira medição. Coloque o caminho do escopo entre aspas se usar uma variável ou um caminho contendo espaços. Para um pacote sem escopo, meça sua pasta diretamente, por exemplo du -sh "node_modules/some-library". A pasta de um pacote pode incluir suas próprias dependências aninhadas; medir tanto o diretório pai quanto o aninhado contará alguns arquivos duas vezes se você somar os totais. Use esses números para localizar candidatos, não para calcular a contribuição exata de cada ramificação.
Em seguida, execute npm explain em um pacote grande ou em um caminho de pacote aninhado que apareça dentro do diretório medido. Se a explicação apontar através de uma dependência direta, esse pacote de nível superior é a ramificação a ser investigada. Um pacote transitivo grande também pode ser compartilhado por várias ramificações, portanto, sua presença sob um caminho não significa necessariamente que apenas essa dependência direta o utilize. O npm descreve o npm ls como uma árvore lógica, que pode diferir do layout físico de node_modules; use a saída da explicação para entender o relacionamento em vez de tratar o aninhamento de pastas como o grafo completo.
Separar dependências de desenvolvimento de dependências de produção
Uma ferramenta de desenvolvimento grande pode ser desnecessária em uma instalação de produção, enquanto uma dependência de runtime grande pode ser exigida pela aplicação. Inspecione a cadeia e se ela se origina de uma dependência de desenvolvimento ou de produção na saída do npm. Se quiser comparar uma instalação do npm somente para produção, npm ls --omit=dev omite as dependências de desenvolvimento da visualização da instalação no disco; isso não as remove do package.json ou do lockfile. Confirme o comportamento e a versão do npm antes de usar opções de omissão em automações. Documentação do npm install
Trate um tamanho grande como uma pista, não como prova de que um pacote é desnecessário. Verifique o que as importações da sua aplicação, scripts de compilação (build) e processo de implantação exigem antes de remover ou substituir uma dependência. Se um lockfile estiver presente, mantenha-o em vista ao comparar instalações: ele registra a árvore resolvida e ajuda a explicar por que outra instalação pode diferir da pasta atual.
Um ponto de parada prático
Você tem uma resposta útil quando consegue nomear o maior diretório medido, identificar o pacote ou pacotes dentro dele e usar npm explain para rastreá-los até a dependência raiz que os introduz. Isso lhe dá uma ramificação concreta para revisar. O uso do disco por si só não pode decidir se é seguro remover a ramificação, e os comandos de dependência do npm não calculam a parcela exclusiva de um pacote quando arquivos ou dependências são compartilhados.
Fontes
package-lock.json — npm
Terminal User Guide for Mac — Apple