Melhores Práticas de Configuração de Projeto
Padrões para repositórios de serviços Node que integram rapidamente, constroem em CI e implantam de forma previsível.
Como Usar Esta Lista
- Aplique ao criar repositórios a partir de templates ou geradores.
- Revise durante revisões de arquitetura antes de adicionar um segundo deployable.
- Aplique o layout e os scripts via CI de template, não por convenções informais.
A - Layout do Repositório
- Use
src/para código de tempo de execução e um local de teste dedicado. Escolhatest/ou*.test.tscolocados juntos, não ambos. - Um deployable principal por pasta de aplicativo em monorepos.
apps/billing-apimapeia para uma imagem de contêiner. - Mantenha a configuração na raiz do repositório ou na raiz do aplicativo de forma consistente. A descoberta de
tsconfig, ESLint e Dockerfile é importante. - Confirme
.env.example, nunca segredos. Documente cada variável necessária com padrões seguros. - Inclua rotas
health(e opcionalmenteready) desde o primeiro dia. Load balancers e orquestradores precisam delas.
B - TypeScript e Scripts
- Divida
tsconfig.jsonetsconfig.build.json. Verifique os tipos dos testes; emita apenassrc/paradist/. - Use a resolução de módulo
NodeNextno Node 24. Corresponde ao comportamentoimportdo ESM em produção. - Exporte
createApp()(ou equivalente) de servidores. Permite testes de integração HTTP sem vincular portas. - Scripts:
dev,build,start,test,typecheck. Mesmos comandos localmente e em CI. - Execute
startde produção contra JS compilado. Nãotsxem contêineres.
C - Docker e Tempo de Execução
- Fixe o patch do Node no Dockerfile (
node:24.18.0-alpine). Alinhe comenginesempackage.json. - Builds multi-stage: deps, build, runtime. A imagem de produção exclui TypeScript e devDependencies.
- Copie o lockfile antes do código-fonte para o cache de camada. A reconstrução da camada
npm ciocorre apenas quando as dependências mudam. - Defina
NODE_ENV=productionna camada de runtime. Frameworks e verbosidade de log dependem disso. - Documente a porta exposta e o caminho de health no README. Corresponde às sondas K8s e arquivos compose.
D - Monorepo e Scaffolding
- Código compartilhado em
packages/, deployables emapps/. Aplicativos nunca importam aplicativos irmãos diretamente. - Mantenha um repositório de template interno com CI. Novos serviços herdam os pins atuais de Express/Fastify/Nest.
- Use Turborepo ou Nx quando 3+ pacotes precisarem de orquestração. Scripts npm simples param de escalar.
- Filtre por caminho os deploys de CI por serviço. Mudanças de API não relacionadas não devem reimplantar o faturamento.
- Versionar o pacote de contratos internos com disciplina de quebra de compatibilidade. Mudanças no esquema Zod afetam vários aplicativos.
E - Documentação e Governança
- Início rápido no README:
npm ci, cópia de env,npm run dev. Três passos para executar o servidor. - Registre a escolha do framework no ADR para novos serviços. Express vs Fastify vs Nest não é arbitrário por repositório.
- Adicione um teste de exemplo no scaffold. A CI nunca envia com
npm testvazio passando trivialmente. -
.gitignorecobrenode_modules,dist,.env, coverage. Evite commits acidentais. - Renomeie e limpe placeholders de template antes do primeiro deploy. Nomes de serviço padrão se propagam para métricas e logs.
FAQs
Onde os testes devem ficar: em test/ ou src/?
Qualquer um funciona. test/ simplifica a saída de dist/; testes colocados juntos melhoram a localidade. Escolha um por organização.
Quando adotamos um monorepo?
Quando dois deployables compartilham contratos em evolução e você deseja PRs atômicos. Não para uma única API com helpers copiados e colados.
Um Dockerfile é necessário para cada serviço?
Sim para deploys containerizados. Serverless usa configuração de empacotamento em vez disso, mas os mesmos scripts de build/typecheck se aplicam.
O que pertence a um repositório de template?
Layout, scripts, ESLint, teste de exemplo, Docker, fluxo de CI, .env.example e README - comprovadamente verde em todas as tags.
Como lidamos com múltiplas versões do Node durante a migração?
Amplie engines temporariamente, fixe a matriz de CI, migre aplicativo por aplicativo e, em seguida, restrinja engine-strict.
Devemos commitar dist/?
Não para builds de contêiner que compilam em CI/Docker. Sim apenas para fluxos atípicos de git-deploy (evite se possível).
Qual a profundidade máxima que src/ deve ter?
Agrupe por domínio (routes/, services/) e não apenas por camada. A profundidade cresce com a contagem de recursos, não antecipadamente.
Os workers compartilham o mesmo layout?
Sim: src/worker.ts, mesmos scripts, Dockerfile separado ou comando de processo. Reutilize packages/ para payloads de job.
Como os ambientes de preview se encaixam?
Cada PR implanta um aplicativo de apps/* com filtros de caminho; documente a nomenclatura nas runbooks da plataforma.
Qual é a verificação mínima de CI no scaffold?
npm ci, npm run typecheck, npm test, npm run build, build do Docker (se usado).
Relacionado
- Noções Básicas de Configuração de Projeto - exemplos de layout
- Scaffolding de APIs - templates e CLIs
- Monorepo Multi-Serviço - regras de app vs pacote
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.