Scaffolding APIs
Scaffolding cria um ponto de partida consistente para que cada novo serviço tenha o mesmo layout, scripts e portões de qualidade.
Receita
Cartão de receita de referência rápida - pronto para copiar e colar.
mkdir orders-api && cd orders-api
npm init -y
npm install express@5
npm install -D typescript@5.6 tsx @types/node @types/express eslint
npx --yes @nestjs/cli new orders-api --package-manager npm --strictQuando usar isso:
- Inicialização de um serviço HTTP greenfield.
- Padronização do layout de pastas e hooks de CI em toda a organização.
- Evitar copiar e colar de um repositório antigo com dependências desatualizadas.
Exemplo de Trabalho
# 1. Template da organização (preferido para equipes)
git clone git@github.com:acme/node-api-template.git billing-api
cd billing-api
rm -rf .git && git init
npm ci
# 2. Ou scaffold manual mínimo
npm init -y
npm pkg set type=module
npm pkg set scripts.dev="tsx watch src/server.ts"
npm pkg set scripts.build="tsc -p tsconfig.build.json"
npm pkg set scripts.start="node dist/server.js"
npm pkg set scripts.test="node --import tsx --test"
npm install express@5
npm install -D typescript@5.6 tsx @types/node @types/express
npx tsc --init --module NodeNext --moduleResolution NodeNext --strict
mkdir -p src test// src/server.ts
import express from "express";
export function createApp() {
const app = express();
app.use(express.json());
app.get("/health", (_req, res) => res.json({ ok: true }));
return app;
}
if (import.meta.url === `file://${process.argv[1]}`) {
createApp().listen(3000);
}O que isso demonstra:
- Repositórios de template codificam decisões da organização (ESLint, Docker, CI) uma vez.
- Scripts
npm pkg setsem editar manualmente o JSON. - A exportação
createApp()permite integrações de teste com Supertest desde o primeiro dia.
Mergulho Profundo
Como Funciona
npm initcriapackage.json; frameworks adicionam roteamento, DI e convenções.- NestJS CLI gera módulos, controladores e o grafo de build
nest-cli.json. - Fastify CLI e Express têm scaffolds mais leves - você traz mais estrutura sozinho.
- Repositórios de template devem executar
npm ci && npm testem CI para provar que funcionam.
CLIs de Framework
| CLI | Comando | Ideal para |
|---|---|---|
| NestJS 11 | npx @nestjs/cli new | Módulos opinativos, DI, APIs corporativas |
| Fastify 5 | manual + @fastify/type-provider-typebox | HTTP com foco em performance |
| Express 5 | manual / template da organização | Pilhas de middleware mínimas |
Notas de TypeScript
npm install -D typescript@5.6 tsx
# tsconfig: "module": "NodeNext", "strict": true- Faça o scaffold com as mesmas configurações de
moduleque você usa em builds de produção. - Adicione
test/e um teste de exemplo no template para que a CI nunca fique vazia.
Armadilhas
- Dependências de template desatualizadas - Novos serviços herdam pins antigos do Express 4. Correção: Use Renovate no repositório de template; lance versões do template.
- CLI usa o gerenciador de pacotes errado por padrão - Nest pergunta por yarn, a menos que você passe
--package-manager npm. Correção: use os flags nos scripts da documentação. - Exportação
createAppausente - Difícil testar a integração de servidores que apenas chamamlisten()na importação. Correção: exportar a factory; iniciar o servidor em um guardaif (main). - Copiar
.envde projetos antigos - Segredos vazam para o histórico do git. Correção: apenas.env.exampleem templates. - Estrutura Nest excessivamente gerada - O CLI padrão cria mais pastas do que uma API pequena precisa. Correção: podar módulos ou usar um template interno enxuto.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
npm create @acme/api interno | Gerador padronizado da organização | Experimentos solo |
Turborepo create-turbo | Monorepo desde o primeiro dia | Microserviço único |
Adiar framework, node:http puro | Aprendizado ou sonda ultra-minimalista | APIs CRUD de produção |
FAQs
Devemos usar npm init ou um CLI de framework?
CLIs de framework para NestJS; templates da organização para Express/Fastify onde você deseja layout personalizado. npm init sozinho nunca é suficiente para APIs de produção.
Como mantemos um repositório de template?
Trate-o como um produto: CI, atualizações de dependência, changelog, releases com tag. Novos serviços fixam uma versão ou branch do template.
Quais arquivos todo template deve incluir?
Scripts package.json, tsconfig, .gitignore, .env.example, Dockerfile, teste de exemplo, configuração ESLint e README com guia rápido.
Podemos fazer scaffold em uma pasta apps/ de um monorepo?
Sim. Execute o gerador dentro de apps/billing-api e conecte os workspaces raiz depois. Atualize o pipeline turbo.json raiz.
Express 5 ou Fastify 5 padrão?
Siga o ADR da organização. Fastify para APIs sensíveis a throughput; Express para o maior ecossistema de middleware e familiaridade da equipe.
Como testamos um template?
Job de CI: clonar fresco, npm ci, npm test, npm run build, build do Docker. Falhar o release do template se qualquer etapa falhar.
Templates devem incluir Prisma/TypeORM?
Somente se padronizado em toda a organização. Caso contrário, adicione a camada de dados em um segundo PR para manter os templates agnósticos ao framework por mais tempo.
E hooks git em scaffolds?
Inclua um perfil opcional Husky + lint-staged. Documente o skip para contribuidores que dependem de portões apenas de CI.
Como renomeamos após `nest new`?
Atualize o nome em package.json, manifestos K8s e tags de imagem Docker. O nome do projeto Nest se propaga para vários arquivos.
É seguro usar `npx @nestjs/cli` em CI?
Fixe a versão do CLI em devDependencies ou use npx @nestjs/cli@11.x para documentação de geração reproduzível.
Relacionados
- Noções Básicas de Configuração de Projeto - layout de pasta padrão
- Turborepo para Node - próximo passo de scaffold de monorepo
- Nx para Backends Node - configuração baseada em gerador
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.