Melhores Práticas de Gerenciadores de Pacotes
Regras que mantêm as instalações reproduzíveis, auditorias significativas e monorepos manteníveis.
Como Usar Esta Lista
- Aplique em novos repositórios antes do primeiro deploy em produção.
- Revise ao adicionar workspaces ou trocar npm/pnpm/Yarn.
- Imponha via CI (
npm ci, portões de auditoria) em vez de lembretes no README. - Verifique itens durante PRs de atualização de dependências e atualizações do Node da plataforma.
A - Política de Gerenciador e Lockfile
- Um gerenciador de pacotes por repositório. Lockfiles mistos garantem grafos
node_modulesdivergentes. - Commite o lockfile para cada aplicação e serviço implantável. Instalações de CI e Docker reproduzíveis dependem disso.
- Use
npm ciem CI, nãonpm install. Evita desvios silenciosos de resolução a cada execução do pipeline. - Documente o gerenciador escolhido no README. Inclua comandos de instalação, bootstrap e solução de problemas.
- Fixe o Node em CI e Docker para corresponder a
engines. Ex:24.18.0, não flutuante24.xapenas.
B - Dependências e Scripts
- Separe
dependenciesedevDependenciescorretamente. TypeScript, ESLint e runners de teste são apenas para desenvolvimento. - Mantenha
scriptscomo o contrato de automação.npm test,npm run buildenpm run typecheckfuncionam localmente e em CI. - Evite scripts pesados de
postinstall. Instalações lentas prejudicam todos os desenvolvedores e todos os jobs de CI cacheados. - Use
prepublishOnlypara portões de publicação. Testes e typecheck rodam antes que os tarballs cheguem ao registro. - Prefira CLIs fixadas no lockfile em vez de
npxpuro em scripts.tsxeeslintpertencem adevDependencies.
C - Workspaces e Monorepos
- Use
workspace:*para pacotes internos. Link simbólico de libs locais em vez de caminhosfile:manuais. - Compile pacotes compartilhados antes dos dependentes. Ordene tarefas em scripts raiz ou use Turborepo dependsOn.
- Exporte através de
exportsdo pacote, não imports relativos profundos.../../packages/foo/srcentre pacotes quebra limites. - Um lockfile raiz para todo o monorepo. Lockfiles por pacote anulam os benefícios do linking de workspace.
- Nomeie workspaces com escopo consistente.
@acme/api,@acme/sharedesclarece a propriedade.
D - Segurança e Conformidade
- Execute
npm audit --audit-level=highem cada PR de dependência. Bloqueie a mesclagem até que seja corrigido ou excecionado com expiração. - Revise as alterações de script de instalação nas diferenças de dependência. Adições em
postinstallsão de alto risco. - Ative a proveniência para bibliotecas internas publicadas. Consumidores verificam artefatos compilados em CI.
- Defina
engine-strict=trueem.npmrc. Node não suportado falha na instalação, não em produção. - Automatize atualizações de dependência com PRs agrupados de Renovate/Dependabot. Lotes de atualização menores e testáveis.
E - Publicação e Versionamento
- Use lista de permissão estrita de
filesao publicar. Nunca envie testes, segredos.env.exampleousrc/crus não intencionalmente. - Siga o semver para pacotes publicados. Mudanças de API que quebram exigem bumps maiores.
- Envie JS compilado e
.d.tspara bibliotecas TypeScript. Consumidores não devem compilar seu código-fonte. - Marque releases em git ao publicar.
npm versionmais CI de publicação mantêm o registro e a origem alinhados. - Deprecie versões ruins em vez de despublicar.
npm deprecateavisa os consumidores sem quebrar lockfiles.
FAQs
Por que uma política de um lockfile é tão importante?
Dois lockfiles significam dois grafos. A CI pode instalar com npm enquanto um desenvolvedor usa Yarn, mascarando bugs até a produção.
Quando o pnpm é melhor que o npm para backends?
Grandes monorepos com muitas transitivas duplicadas se beneficiam da eficiência de disco do pnpm e de limites de dependência mais rigorosos.
Devemos commitar node_modules?
Não. Commite apenas lockfiles. CI e Docker reconstróem node_modules a partir do lockfile.
Como lidamos com patches de emergência?
Abra um PR atualizando o lockfile, execute CI completo, implante. Evite npm install diretamente em servidores de produção.
O que vai no package.json raiz em um monorepo?
workspaces, ferramentas de desenvolvimento compartilhadas, scripts de orquestração (build, test, lint). Deployables mantêm suas próprias dependências de runtime.
Bibliotecas devem fixar versões exatas de dependência?
Bibliotecas usam ranges em package.json; o lockfile da aplicação fixa versões exatas para o grafo implantável.
Como fazemos onboarding de novos desenvolvedores?
Documente a versão do Node (Volta/nvm), npm ci e npm run dev. engine-strict pega incompatibilidades imediatamente.
O npm audit é suficiente para a cadeia de suprimentos?
Necessário, mas não suficiente. Camada Socket ou similar para análise de comportamento e detecção de typosquatting.
Quando devemos trocar de gerenciador de pacotes?
Quando o tempo de instalação do monorepo ou bugs de dependência fantasma prejudicam a velocidade. Planeje uma migração em um PR com regeneração do lockfile e CI completo.
Como versionamos pacotes internos de workspace?
0.0.0 é bom para pacotes apenas privados. Aumente o semver antes de publicar externamente ou quando consumidores fora do repositório aparecerem.
Relacionados
- Noções Básicas de Gerenciadores de Pacotes - Seleção de npm, pnpm, Yarn
- Lockfiles e Instalações Reproduzíveis - Detalhes de
npm ci - Cadeia de Suprimentos: npm audit & Socket - Portões de mesclagem
Versões da Stack: Esta página foi escrita para Node.js 24.18.0 (Active LTS), npm 10+, TypeScript 5.6+, Express 5, Fastify 5 e NestJS 11.