<link rel="stylesheet" href="/assets/fonts/jetbrains-mono/jetbrains-mono.css" />
All posts

npm, yarn ou pnpm: Quando escolher cada gestor de pacotes

A escolha do gerenciador de pacotes não é um detalhe estilístico: ela impacta diretamente o build in times CI, o espaço em disco em cada máquina de desenvolvimento e executor, a superfície de ataque para dependências malicioso e a conveniência de gerenciar um monorepo com dezenas de pacotes interdependentes. npm, Fio e pnpm resolve o mesmo problema com arquiteturas node_modules radicalmente diferentes, e a escolha errada para o seu contexto compensa em minutos de CI desperdiçados em cada compilação, não em um problema pontual.

Visão Geral Rápida

CritérionpmFio (Berry/v4)pnpm
Velocidade de instalação (cache quente)BomExcelenteExcelente
Lockfilepackage-lock.jsonyarn.lockpnpm-lock.yaml
Suporte para espaço de trabalhoNativo, essencialNativo, maduroNativo, mais avançado para monorepo
Dependências desfeitasParcialBomExcelente (loja centralizada)
Uso de discoAlto (várias cópias)Médio/baixo (PnP evita node_modules)Muito baixo (hard link da loja global)
Cache de redeBásicoBomExcelente
Segurança/auditoriaauditoria integrada npmyarn auditoria npmauditoria pnpm, layout rigoroso evita dependência fantasma
Ecossistema/compatibilidadeMáximo (Node.js padrão)Alto, PnP pode quebrar ferramentas legadasAlto, layout rigoroso pode quebrar código com importação implícito

Sempre verifique as versões instaladas antes de decidir: npm -v, yarn -v, pnpm -v, e para npm em particular npm veja versões npm para descobrir o últimos lançamentos disponíveis.

Critérios para Seleção por Contexto

Projeto de desenvolvimento pequeno/único

npm é a escolha padrão correta: nenhuma configuração adicional (vem com Node.js), compatibilidade máxima com todas as ferramentas e tutoriais, nenhum benefício prático de uma desduplicação avançou em um projeto com algumas dezenas de dependências.

Equipe Média (3-10 Dev)

pnpm começa a compensar o investimento na configuração: instalações mais rápidas em CI compartilhado, menos espaço em disco em cada laptop da equipe e o layout rigoroso evita erros sorrateiros de fantasmas dependência (importação de pacotes não declarados explicitamente que "simplesmente funcionam" com npm/Yarn clássico).

Monorepo Enterprise (dezenas de pacotes)

pnpm workspaces é o padrão de fato para grandes monorepos: desduplicação agressivo via armazenamento centralizado, filtros poderosos (pnpm --filter) para executar comandos apenas em pacotes realmente modificados e tempos de instalação que também permanecem gerenciáveis com centenas de pacotes interdependentes.

Biblioteca publicável no registro npm

O gerenciador de pacotes de desenvolvimento é independente do gerenciador de pacotes de consumo: any of três trabalhos para publicação, mas o pnpm ajuda a descobrir peerDependencies ausentes primeiro da publicação graças ao seu layout rígido, que não "esconde" dependências transitivas como acessado por engano.

CI/CD e cache em nuvem

Para pipelines GitHub Actions/GitLab CI/Vercel, pnpm e Yarn Berry oferecem cache mais eficaz graças a armazenamento/cache global reutilizável entre execuções, enquanto o npm requer todo o cache node_modules (mais pesado para salvar/restaurar a cada compilação).

Detalhes técnicos do gerenciador de pacotes

npm

npm install                  # installa da package.json, aggiorna il lockfile se necessario
npm ci                       # installa esattamente da package-lock.json, mai lo modifica — usa questo in CI
npm audit                    # scansione vulnerabilità note
npm outdated                 # dipendenze con versioni più recenti disponibili

npm ci (não npm install) deve sempre ser usado em CI: falha explicitamente se package.json e package-lock.json estão desalinhados, em vez de atualize silenciosamente o arquivo de bloqueio durante uma compilação.

Fio (Berry / v4)

yarn set version berry        # migra al Yarn moderno (Plug'n'Play di default)
yarn install                  # installa dipendenze
yarn workspaces foreach run build   # esegue uno script su ogni workspace del monorepo
yarn npm audit                # audit di sicurezza

Plug'n'Play (PnP) elimina node_modules em favor de um único arquivo .pnp.cjs que mapeia resoluções — instalação quase instantânea, mas algumas ferramentas legadas que assumir que a existência física de node_modules pode quebrar e exigir fallback para nodeLinker: módulos de nó. Zero-install confirma o cache compactado de dependências no próprio repositório, eliminando completamente o tempo de instalação no CI ao custo de um repositório mais pesado.

pnpm

pnpm install                  # installa usando lo store centralizzato con hard link
pnpm import                   # converte un package-lock.json/yarn.lock esistente in pnpm-lock.yaml
pnpm -w add typescript -D     # aggiunge una dipendenza alla root del workspace
pnpm store path                # mostra il percorso dello store centralizzato condiviso

layout estrito do pnpm (cada pacote vê apenas suas próprias dependências declaradas, não todo o gráfico achatado) é a diferença arquitetônica mais importante: evita fantasmas dependência, mas pode quebrar o código existente que dependia implicitamente de dependências transitivas nunca declarado — um problema que só é descoberto na primeira pnpm install em um projeto migrado, portanto, deve ser antecipado com uma auditoria de código antes da migração.

Referências Práticas

#!/bin/bash
# benchmark-install.sh — confronta tempi di install a cache fredda/calda
for pm in npm yarn pnpm; do
  rm -rf node_modules
  echo "=== $pm (cache fredda) ==="
  time $pm install --force 2>&1 | tail -1
  echo "=== $pm (cache calda) ==="
  rm -rf node_modules
  time $pm install 2>&1 | tail -1
done
# Misura uso disco: node_modules locale vs store centralizzato pnpm
du -sh node_modules
pnpm store path && du -sh "$(pnpm store path)"

Para reproduzir benchmarks confiáveis em CI, sempre execute pelo menos 3 execuções consecutivas descartando a primeira (efeitos de cache do sistema de arquivos/executor) e corrige a versão do gerenciador de pacotes no fluxo de trabalho - um comparar diferentes versões de npm/Yarn/pnpm invalida quaisquer conclusões sobre as diferenças arquitetônico de verdade.

Estudo de caso 1: aplicativo pequeno (1-3 desenvolvedores)

Um aplicativo interno com 3 desenvolvedores e aproximadamente 60 dependências diretas. Recomendado: npm, porque nenhuma configuração adicional supera qualquer ganho marginal de desempenho em um projeto esta escala. Integração de um novo desenvolvedor: menos de 5 minutos (npm install e pronto), contra o potencial atrito inicial na explicação do PnP ou do armazenamento centralizado para um benefício quase nada nesta escala.

# GitHub Actions — small app, npm con cache standard
- uses: actions/setup-node@v4
  with: { node-version: 22, cache: 'npm' }
- run: npm ci
- run: npm run build

Estudo de caso 2: Monorepo Enterprise (mais de 20 pacotes)

Um monorepo com 24 pacotes (8 aplicativos, 16 bibliotecas compartilhadas) e equipe distribuída em 3 fusos horários vezes. Recomendado: espaços de trabalho pnpm. Estrutura:

// package.json root
{ "workspaces": ["apps/*", "packages/*"], "packageManager": "pnpm@9.0.0" }
# GitHub Actions — caching dello store pnpm condiviso tra run
- uses: pnpm/action-setup@v4
- uses: actions/setup-node@v4
  with: { node-version: 22, cache: 'pnpm' }
- run: pnpm install --frozen-lockfile
- run: pnpm -w run build --filter=...[origin/main]

Esforço estimado de migração de espaços de trabalho npm para pnpm: aproximadamente 60 horas-homem para um monorepo deste tamanho (auditoria de dependência fantasma incluída). Resultado esperado: tempo de instalação do CI reduzido em 40-60%, o espaço em disco nos executores é reduzido proporcionalmente ao número de pacotes compartilhando o mesmas dependências.

Estudo de caso 3: Biblioteca pública no registro npm

Uma biblioteca de código aberto com peerDependencies em Angular/React. Escolha recomendada: pnpm em desenvolvimento (para descobrir dependências de pares ausentes graças ao layout estrito), publicação ainda compatível com qualquer gerenciador de pacotes do lado do consumidor.

{
  "peerDependencies": { "react": "^18.0.0 || ^19.0.0" },
  "peerDependenciesMeta": { "react": { "optional": false } }
}
# Publish workflow
npm publish --dry-run          # verifica cosa verrebbe pubblicato prima del publish reale
pnpm publish --access public   # publish reale (funziona identicamente per consumer npm/yarn/pnpm)

Migração e plano operacional de 30/60/90 dias

Dias 1 a 30: Avaliação e Piloto

  • Lista de verificação pré-migração: backup do arquivo de bloqueio existente, linha de base de cobertura de teste, instantâneo do pipeline de CI atual.
  • Migração piloto em um único pacote/repo não crítico — KPI: construção e testes ecológicos pós-migração.
# Migrazione da npm/yarn a pnpm preservando le versioni risolte nel lockfile esistente
pnpm import
pnpm install

Dias 31 a 60: lançamento progressivo

  • Migrar os pacotes restantes, um de cada vez, nunca todos de uma vez — KPI: 0 regressões funcionais por pacote migrado.
  • Atualização do pipeline de CI com novo cache nativo do gerenciador de pacotes — KPI: tempo de construção de CI medido antes/depois.

Dias 61-90: Consolidação

  • Removendo arquivos de bloqueio legados e gerenciador de pacotes antigo da documentação — KPI: 0 referências residuais à ferramenta anterior.
  • Auditoria final de segurança e uso de disco — KPI: redução medida em ambas as métricas.

Plano de reversão: mantenha o arquivo de bloqueio do gerenciador de pacotes confirmado anteriormente até terminar migração confirmada; voltar significa simplesmente restaurar esse arquivo de bloqueio e o comando de instalação original, sem quaisquer outras alterações de código.

CI/CD e cache

# GitLab CI — cache dello store pnpm tra pipeline
cache:
  key: pnpm-store
  paths:
    - .pnpm-store
variables:
  PNPM_STORE_PATH: .pnpm-store

Para Yarn Berry, armazene em cache a pasta .yarn/cache (não node_modules, que com PnP pode nem existir); para npm, cachea ~/.npm mais possivelmente node_modules se o projeto for pequeno o suficiente para tornar a recuperação mais rápida do que uma instalação do zero.

Segurança e Política

npm audit --audit-level=high
yarn npm audit
pnpm audit

O layout estrito do pnpm oferece um benefício de segurança indireto, mas real: um pacote não pode acessar acidentalmente uma dependência transitiva comprometida que você não declarou explicitamente, reduzindo a superfície de ataque das cadeias de suprimentos em comparação com node_modules tradicional npm/Yarn clássico. Em qualquer caso, integre a auditoria do gerenciador de pacotes ao CI como uma etapa bloqueador, não como uma verificação manual ocasional, e considere uma ferramenta SCA dedicada (Snyk o equivalente) para projetos com requisitos de conformidade mais rigorosos.

FAQ

Posso misturar diferentes gerenciadores de pacotes no mesmo projeto?

Tecnicamente possível, mas fortemente desencorajado: vários arquivos de bloqueio e diferentes comportamentos de resolução causam inconsistências que são difíceis de diagnosticar.

pnpm sempre interrompe projetos existentes?

Não, mas o layout rigoroso pode revelar dependências fantasmas pré-existentes: uma auditoria de código antes da migração reduz o risco de surpresas.

O Yarn PnP é compatível com todas as ferramentas?

Não, algumas ferramentas que assumem node_modules físicos no disco requerem fallback para nodeLinker: node-modules.

Você precisa do npm ci ou apenas do npm install no CI?

npm ci é sempre preferível em CI: é mais rápido e falha explicitamente se o arquivo de bloqueio estiver desalinhado, em vez de modificá-lo silenciosamente.

Como você lida com conflitos de arquivos de bloqueio em uma mesclagem?

Gere novamente o arquivo de bloqueio da ramificação atualizada em vez de resolver manualmente os conflitos linha por linha, o que quase sempre é mais lento e arriscado.

O pnpm é mais seguro que o npm?

Fornece um benefício indireto por meio do layout estrito que limita o acesso a dependências transitivas não declaradas, mas a auditoria de vulnerabilidades conhecidas continua necessária com todos os três.

Como você lida com dependências de pares ausentes?

pnpm os relata explicitamente durante a instalação graças ao layout rigoroso; com npm/Yarn clássico eles devem ser verificados manualmente ou com ferramentas dedicadas.

pnpm funciona bem no Windows?

Sim, mas os links físicos exigem que o armazenamento e o projeto estejam no mesmo volume/disco para funcionar de maneira ideal.

Vale a pena mudar o gerenciador de pacotes no meio de um projeto já iniciado?

Somente se os benefícios esperados (CI, disco, monorepo) superarem claramente o custo da migração e dos testes; para um projeto pequeno e estável, muitas vezes não é conveniente.

Como você escolhe entre Yarn e pnpm para um novo monorepo?

Ambos são válidos; O pnpm geralmente tem a desduplicação mais agressiva e os filtros mais maduros para grandes monorepos. O Yarn PnP elimina node_modules inteiramente se a compatibilidade da ferramenta permitir.

Erros comuns e soluções rápidas

  • Usar npm install em vez de npm ci em CI: corre o risco de modificar silenciosamente o arquivo de bloqueio durante uma compilação - sempre use npm ci.
  • Commit node_modules para o repositório: repositório inchado desnecessariamente, use .gitignore e confie no lockfile para reprodutibilidade.
  • Misture arquivos de bloqueio de diferentes gerenciadores de pacotes: Sempre remova outros arquivos de bloqueio ao adotar um novo.
  • Ignore avisos de dependência fantasma após uma migração para pnpm: eles são bugs latentes reais, não falsos positivos a serem silenciados.
  • Não corrija a versão do gerenciador de pacotes no projeto: Use o campo packageManager em package.json para garantir consistência entre desenvolvedores e CIs.
  • Cache CI não invalidado após alteração do arquivo de bloqueio: a chave de cache deve incluir o hash do arquivo de bloqueio, não ser estática.
  • Yarn PnP com ferramentas legadas incompatíveis: Verifique a compatibilidade antes de adotar PnP em um projeto com dependências de ferramentas legadas.
  • Armazenar pnpm em disco/volume diferente do projeto: quebra a eficácia dos hard links no Windows, verifica a configuração do caminho de armazenamento.
  • Auditoria de segurança realizada apenas manualmente: integre isso como uma etapa de bloqueio de CI, não como uma verificação única.
  • Migre um monorepo inteiro de uma só vez: aumenta drasticamente o risco, migre pacote por pacote com verificação em cada etapa.

Lista de Verificação Final: Matriz de Decisão Rápida

CritérioEscolha recomendada
Equipe pequena (1-3 desenvolvedores)npm
Monorepo com dezenas de pacotespnpm
Apertando restrições de espaço em discopnpm (ou Yarn PnP)
CI rápido como prioridade máximapnpm ou Yarn Berry com armazenamento em cache
Segurança/prevenção de dependência fantasmapnpm (layout estrito)
Biblioteca pública com máxima compatibilidade do consumidorLado de publicação indiferente, pnpm em desenvolvimento

Como verificar

  • Reproduza os benchmarks de instalação com o script fornecido no hardware/IC representativo do seu caso real.
  • Verifique se o cache é realmente reutilizado no CI (verifique os registros de acertos/erros do cache do fluxo de trabalho).
  • Execute o conjunto E2E completo após cada migração do gerenciador de pacotes, não apenas testes de unidade.
  • Verifique a integridade do arquivo de bloqueio: npm ci/pnpm install --frozen-lockfile deve ser concluído inalterado.
  • Execute uma simulação de publicação antes de cada publicação real: npmpublish --dry-run.
  • Monitore o uso do disco ao longo do tempo em máquinas de CI e de desenvolvimento, não apenas no momento da migração.

Conclusão

Não existe um gerenciador de pacotes universalmente melhor: o npm continua sendo a escolha de menor atrito para pequenos projetos, o pnpm oferece os benefícios mais concretos em monorepo e CI de alta frequência de construção, Yarn Berry com PnP é uma opção válida quando a compatibilidade das ferramentas permite e você deseja eliminá-la node_modules inteiramente. A decisão correta depende do tamanho da equipe, do estrutura do repositório e restrições reais de CI e disco - não uma preferência genérica baseada em popularidade.

Você deseja o script de benchmark completo para o seu projeto ou uma avaliação de migração mais adequado para sua equipe? Solicite uma auditoria técnica: em poucas horas de análise é possível Estime os reais benefícios e riscos de uma migração de gerenciador de pacotes para sua base de código.

💬 Notas dos leitores

0 notas

Escreva uma nota

Partilhe a sua opinião, uma sugestão ou um elogio

Notas recentes

Ainda não há notas. Seja o primeiro a comentar!