Turborepo para Node
O Turborepo orquestra tarefas de workspace com cache remoto para que pacotes inalterados pulem reconstruções em CI e localmente.
Receita
Cartão de receita de referência rápida - pronto para copiar e colar.
// turbo.json
{
"$schema": "https://turbo.build/schema.json",
"tasks": {
"build": {
"dependsOn": ["^build"],
"outputs": ["dist/**"]
},
"test": {
"dependsOn": ["build"],
"outputs": []
},
"typecheck": {
"dependsOn": ["^build"],
"outputs": []
}
}
}npx turbo run build test typecheckQuando usar isso:
- Monorepo com 3+ pacotes e repetição de
build/testem CI. - Bibliotecas compartilhadas devem compilar antes que os aplicativos façam a verificação de tipos.
- Você deseja acertos de cache entre desenvolvedores e executores de CI.
Exemplo de Trabalho
platform/
turbo.json
package.json # workspaces
apps/
api/package.json
packages/
shared/package.json
// package.json (root)
{
"private": true,
"workspaces": ["apps/*", "packages/*"],
"scripts": {
"build": "turbo run build",
"test": "turbo run test",
"dev": "turbo run dev --parallel"
},
"devDependencies": {
"turbo": "^2.3.0",
"typescript": "^5.6.0"
}
}// packages/shared/package.json
{
"name": "@acme/shared",
"scripts": {
"build": "tsc -p tsconfig.json",
"test": "node --import tsx --test"
}
}// apps/api/package.json
{
"name": "@acme/api",
"dependencies": { "@acme/shared": "workspace:*", "fastify": "^5.0.0" },
"scripts": {
"build": "tsc -p tsconfig.json",
"dev": "tsx watch src/server.ts",
"test": "node --import tsx --test"
}
}npm install
npx turbo run build --filter=@acme/api...O que isso demonstra:
^buildexecuta as compilações dos pacotes dependentes antes dos dependentes.--filter=@acme/api...inclui a API e suas dependências de workspace.outputsinforma ao Turbo o que armazenar em cache entre as execuções.
Mergulho Profundo
Como Funciona
- O Turbo gera hashes para as entradas das tarefas (código-fonte, variáveis de ambiente, dependências) e restaura os
outputsdo cache em caso de acerto de cache. dependsOnconstrói um DAG (Grafo Acíclico Dirigido);testespera pelos artefatos debuild.- O cache remoto (Vercel ou auto-hospedado) compartilha acertos entre máquinas de CI.
- Tarefas
devgeralmente sãopersistent: truee não são cacheadas.
Configuração de Tarefas
| Campo | Propósito |
|---|---|
dependsOn | Ordem das tarefas upstream (^build = dependências primeiro) |
outputs | Pastas restauradas do cache (dist/**) |
inputs | Ajuste fino do hash (padrão: arquivos do pacote) |
env | Variáveis de ambiente que invalidam o cache quando alteradas |
Notas de TypeScript
{
"tasks": {
"build": { "dependsOn": ["^build"], "outputs": ["dist/**"] },
"typecheck": { "dependsOn": ["^build"] }
}
}- Separe
typecheckdebuildse quiser trabalhos de CI mais rápidos que pulem a emissão quando apenas verificarem tipos. - Certifique-se de que cada
tsconfigde pacote emita paradist/consistentemente para os caminhos de cache.
Armadilhas
outputsausentes - O Turbo não armazena nada útil em cache; cada build é executado novamente por completo. Correção: declaredist/**para cada tarefa de compilação.- Sintaxe de filtro incorreta - Apenas
@acme/apipula as compilações de dependência. Correção: use@acme/api...(três pontos) para a cadeia de dependentes. - Cache de testes com efeitos colaterais - Testes que acessam o banco de dados real obtêm falsos positivos do cache. Correção: exclua testes de integração de tarefas cacheadas ou use
inputsúnicos. - Segredos de ambiente no hash - Listas
envinvalidam o cache quando os tokens mudam. Correção: liste apenas variáveis de ambiente que afetam a saída da compilação. - Tarefa
devcacheada por engano - O modo de observação não deve ser cacheado. Correção:"persistent": truee semoutputsemdev.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
Apenas scripts run -w do npm | Monorepo de 2 pacotes | O tempo de CI cresce linearmente com os pacotes |
| Nx | Geradores, grafo de afetados, aplicação de regras | Equipe quer configuração mínima |
| Bazel | Repositórios poliglota enormes | Loja de backend apenas Node.js |
FAQs
O Turbo substitui os workspaces do npm?
Não. O Turbo roda sobre os workspaces. Você ainda usa npm ci e links workspace:*.
Como executo um aplicativo em modo de desenvolvimento?
npx turbo run dev --filter=@acme/apiAdicione --parallel ao executar vários servidores de desenvolvimento.
O que os outputs devem incluir?
dist/** compilado, especificações OpenAPI geradas ou *.tsbuildinfo se você estiver cacheadando compilações incrementais.
Como funciona a autenticação do cache remoto?
turbo login e TURBO_TOKEN em CI. Auto-hospedagem com armazenamento compatível com S3 para equipes isoladas (air-gapped).
Aplicativos Express e Fastify podem coexistir?
Sim, em workspaces separados em apps/*. O código compartilhado fica em packages/ sem importações de framework.
O teste deve depender da compilação?
Sim, quando os testes importam dist/ ou tipos compilados. Testes de código-fonte puramente tsx podem omitir a dependência de compilação se configurados cuidadosamente.
Como invalidar o cache após uma atualização da toolchain?
Alterar o package-lock.json raiz ou o turbo.json invalida os hashes globalmente para as tarefas afetadas.
O turbo é necessário para uma única API?
Não. Adicione quando um segundo pacote ou serviço aparecer e a CI exceder ~5 minutos rotineiramente.
Como as compilações Docker usam o Turbo?
Execute turbo prune --scope=@acme/api --docker para gerar um subconjunto mínimo para imagens de múltiplos estágios.
O monorepo NestJS usa Turbo?
O Nest tem seu próprio modo de monorepo; muitas equipes ainda adicionam o Turbo para bibliotecas packages/ entre frameworks.
Relacionados
- Workspaces & Monorepos - links de workspace
- Monorepo Multi-Serviço - limites implantáveis
- Nx para Backends Node - orquestração alternativa
Versões da Stack: Esta página foi escrita para Node.js 24.18.0 (LTS Ativo), npm 10+, TypeScript 5.6+, Express 5, Fastify 5 e NestJS 11.