🚀 Oferta especial: 60% OFF no CrazyStack - Últimas vagas!Garantir vaga →
🎯 Módulo 2

tRPC Setup Completo

Configure tRPC do zero: type-safe APIs, middleware de autenticação e client setup

45 min
Nível:Intermediário

Por que isso é importante

tRPC revoluciona desenvolvimento full-stack oferecendo type-safety completo entre client e server. Elimina bugs de integração, acelera desenvolvimento em 40% e garante APIs sempre sincronizadas com TypeScript.

📚 Aula Educacional

Esta aula apresenta os códigos de configuração do tRPC como exemplos educacionais. Você aprenderá a estrutura, conceitos e implementação sem modificar o projeto atual. Use estes códigos como referência para seus próprios projetos SaaS.

🎯 O que Você Vai Aprender

Server Setup:

  • • Middleware de autenticação Clerk
  • • Context com user session
  • • Router structure profissional
  • • Type-safe procedures

Client Setup:

  • • React Query integration
  • • Provider setup
  • • Auto-typed hooks
  • • Error handling

📦 Passo 1: Instalação de Dependências

⚠️ Requisitos Importantes

Certifique-se que Clerk Authentication já está configurado no projeto. tRPC usará o contexto de autenticação do Clerk para proteger procedures.

terminal

🔧 Passo 2: Configurando Middleware

🎯 Por que Middleware First?

Configuramos o middleware primeiro para habilitar autenticação em toda a aplicação. Isso permite que tRPC acesse rotas protegidas e contexto de usuário.

src/middleware.ts

🏗️ Passo 3: tRPC Context e Initialization

✅ Arquitetura Profissional

Este setup cria context reutilizável, middleware de autenticação e procedures type-safe. Padrão usado em SaaS de milhões de usuários como Vercel e Railway.

src/trpc/init.ts

⚡ Passo 4: Query Client Configuration

src/trpc/query-client.ts

🌐 Passo 5: App Router Structure

🔄 Estrutura Escalável

Router principal será expandido com modules específicos (messages, projects, users). Comentários mostram onde adicionar novos routers.

src/trpc/routers/_app.ts

🖥️ Passo 6: Server-Side Setup

src/trpc/server.tsx

💻 Passo 7: Client-Side Setup

🎨 Client Provider Pattern

Provider separa server/client corretamente, evita hidration errors e garante performance otimizada com browser query client.

src/trpc/client.tsx

🔗 Passo 8: Integração no Layout Principal

🎯 Finalizando a Integração

O último passo é envolver toda a aplicação com o TRPCReactProvider no layout principal. Isso disponibiliza os hooks tRPC em todos os componentes da aplicação.

src/app/layout.tsx

🎨 Passo 9: Ajustando a Homepage

🎯 Landing Page Otimizada

Com tRPC configurado, agora temos uma homepage limpa e funcional que demonstra a integração das tecnologias. Esta é a estrutura base para expandir com dados dinâmicos.

app/(home)/page.tsx

📊 Passo 10: Router de Assinaturas

🎯 Procedures para SaaS

Exemplo prático de como criar procedures tRPC para gerenciar assinaturas. Este router demonstra consultas protegidas, validação Zod e tratamento de erros profissional.

src/modules/subscription/server/procedures.ts

✅ Padrões Aplicados

protectedProcedure: Garante autenticação

Validação Zod: Input type-safe

Error Handling: TRPCError padronizado

Context Access: ctx.auth.userId

Query vs Mutation: Separação correta

Service Layer: Lógica isolada

🎨 Passo 11: Dashboard com tRPC

🎯 Integração Frontend Completa

Dashboard refatorado usando tRPC hooks para consumir as procedures de assinatura. Demonstra Suspense, loading states, mutations e invalidação de cache.

app/dashboard/page.tsx

⚡ useSuspenseQuery: O Melhor dos 2 Mundos

🎯 Por que useSuspenseQuery é Superior?

useSuspenseQuery combina as vantagens de Server Components (data fetching automático) com Client Components (interatividade). Elimina loading states manuais e garante que dados estejam sempre disponíveis quando o componente renderiza.

🖥️ Server Components (tRPC Caller)
  • ✅ SEO-friendly (renderização no servidor)
  • ✅ Performance inicial mais rápida
  • ❌ Sem interatividade (onClick, useState)
  • ❌ Sem cache do React Query
  • ❌ Sem invalidação automática
💻 Client Components (useQuery tradicional)
  • ✅ Totalmente interativo
  • ✅ Cache e invalidação do React Query
  • ❌ Loading states manuais complexos
  • ❌ Conditional rendering (`if (isLoading)`)
  • ❌ TypeScript mais verboso
🚀 useSuspenseQuery: Melhor dos 2 Mundos
  • Data sempre disponível: Sem `data | undefined`
  • Loading automático: Suspense boundary cuida disso
  • Cache do React Query: Performance otimizada
  • Interatividade completa: Mutations, invalidação
  • TypeScript limpo: Tipos garantidos sem checks
  • Error boundaries: Tratamento de erro centralizado
🔄 Exemplo Prático na Prática

❌ useQuery tradicional:

const { data, isLoading, error } = trpc.subscription.getCurrent.useQuery(); if (isLoading) return <Spinner />; if (error) return <Error />; if (!data) return <NoData />; return <div>{data.status}</div>;

✅ useSuspenseQuery:

const { data } = useSuspenseQuery( trpc.subscription.getCurrent.queryOptions() ); // data sempre existe! Sem checks condicionais return <div>{data.status}</div>;

✅ Features Implementadas

useSuspenseQuery: Loading automático

useMutation: Cancelar assinatura

Cache Invalidation: UI sempre atualizada

Type Safety: Tipos automáticos do Prisma

Error Handling: Estados de loading

UX Otimizada: Confirmações e feedback

⚡ Passo 12: Resolvendo Performance TypeScript

🚨 Problemas Reais de Performance

Realidade crua: TypeScript tem problemas sérios de performance em projetos grandes com tRPC. Não é performance de runtime - é o Language Server que falha. Desenvolvedores ficam reiniciando o TS Server constantemente com Cmd+Shift+R.

🎯 Por que tRPC Causa Lentidão?

Inferência Excessiva: tRPC usa inferência de tipos massiva. Cada procedure é inferida do input até o output, sem definições manuais.

Problema N×N: Cada mudança recomputa TODOS os routers. Um novo endpoint força re-checagem de centenas de outros.

Cache Quebrado: Project References não funcionam adequadamente com tipos inferidos profundamente.

🔬 A Investigação

Alex (criador do tRPC) e Theo investiram dinheiro para contratar David Sherret (especialista em performance TS) para auditar o tRPC e descobrir o problema.

Descoberta surpreendente: O problema não era no tRPC - era um bug de performance no próprio TypeScript relacionado ao cache de tipos.

🚀 A Solução: TypeScript 5.9+

Resultado: Andarist (contribuidor lendário do TS) criou fix que reduziu instanciações de tipos em 78% em projetos tRPC.

Performance gains: Verificação de tipos 2x mais rápida, menos travamentos do Language Server, experiência mais fluida.

💡 Como Resolver Hoje
1. Upgrade TypeScript
terminal
2. Configurar VS Code
.vscode/settings.json
3. Otimizar tsconfig.json
tsconfig.json
🎯 Dicas de Performance para tRPC
✅ Faça
  • • Use TypeScript 5.9+ sempre
  • • Separe routers por módulo
  • • Evite routers muito grandes
  • • Use `skipLibCheck: true`
  • • Reinicie TS Server quando necessário
❌ Evite
  • • Centenas de procedures em um router
  • • Tipos muito profundos desnecessários
  • • TypeScript muito antigo
  • • Project references complexas
  • • Definições de tipo manuais
🎉 Estado Atual

Com TypeScript 5.9+, tRPC tem performance muito melhor. O investimento da comunidade resolveu um problema real que afetava milhares de desenvolvedores. Hoje você pode usar tRPC em projetos grandes sem sofrer com travamentos constantes.

✅ Setup Completo Finalizado

🎯 O que Você Conquistou:

  • ✅ tRPC configurado com type-safety completo
  • ✅ Middleware de autenticação Clerk integrado
  • ✅ Context reutilizável com user session
  • ✅ Query client otimizado para performance
  • ✅ Provider integrado no layout principal
  • ✅ Homepage otimizada com componentes shadcn/ui
  • ✅ Router de assinaturas com procedures protegidas
  • ✅ Dashboard refatorado com tRPC hooks
  • ✅ Performance TypeScript otimizada para produção

🚀 Próximos Passos:

  • • Criar primeiro router com procedures
  • • Implementar CRUD operations
  • • Adicionar validação com Zod
  • • Integrar com Prisma ORM