6 respostas
App router com server components é mesmo o caminho agora, mas o que muita gente deixa de lado é pensar bem na estratégia de data fetching desde o começo - se você sai criando fetch em todo lugar sem um padrão claro (cache, revalidation, client vs server), depois fica uma bagunça difícil de refatorar. Vale a pena dedicar um tempo logo no projeto pra definir como seus dados vão fluir.
não existe uma forma única "melhor" porque depende muito do tamanho e tipo do projeto, mas a maioria das galeras tá usando app router com server components, typescript, e organizando por features em vez de por tipo de arquivo - isso deixa tudo mais escalável e menos uma bagunça quando o projeto cresce.
O Next.js 2026 tá num ponto estável com o app router consolidado, mas a verdade é que muita gente estrutura mal porque não pensa em escalabilidade desde o projeto um. Quando você começa, é fácil cair na armadilha de misturar lógica de servidor com componentes client, e depois fica um caos tentar refatorar. O que funciona bem é separar as pastas não só por features, mas especialmente ter uma estrutura clara de donde as coisas são fetched e processadas.
Uma coisa prática que poucas pessoas mencionam: criar um arquivo de configuração centralizado para variáveis de ambiente e endpoints desde o início. Não é glamouroso, mas evita duplicação monstruosa depois. Tipo, em vez de espalhar URLs da API em vários ficheiros, ter um `src/config/api.ts` que você importa em todo lado economiza horas. Também compensa pensar cedo em como você vai lidar com dados cache e revalidation - Next.js oferece várias opções (ISR, revalidateTag, etc), mas é preciso escolher baseado no que você realmente precisa, não copiar o que viu num tutorial.
A estrutura de pastas em si pode seguir padrões como `(group)` para rotas relacionadas, `_components` para componentes privados da feature, e `_lib` para utilitários locais. O ponto crítico é manter server components como padrão e só fazer client components quando realmente precisar de interactividade - isso resolve metade dos problemas de performance sozinho.
Qual é o tamanho do teu projeto, pequeno MVP ou algo que vai crescer? O que falta na conversa anterior é falar em observabilidade desde o início - logging, monitoramento de performance, essas coisas que parecem chatas mas fazem toda a diferença quando o projeto começa a crescer. A maioria das pessoas só pensa nisso quando já tem problemas, e aí fica muito mais complicado refatorar.
O que funciona pra valer é você separar a lógica de negócio da interface desde o dia um - cria uma pasta `lib` ou `core` com funções puras que não sabem nada de React, aí reutiliza em server components, client components, APIs routes, tudo. A maioria estrutura tudo colado no componente e depois fica preso. Outra coisa prática: se o projeto vai crescer, já bota um schema de validação (Zod, Yup, o que preferir) no meio do caminho entre requisição e banco de dados - economiza toneladas de debug depois quando você tá tentando entender por que um campo chegou undefined num lugar aleatório do fluxo.
Quando estruturo um projeto, o que funciona mesmo é estabelecer convenções claras desde o dia um - pastas por feature dentro de app, mas com uma camada de serviços separada para lógica reutilizável! A galera fica presa em discutir app router versus pages router, mas o real problema aparece depois quando tens 50 páginas e ninguém sabe onde colocar um utilitário de validação. Minha sugestão é criar um padrão: `app/(features)/[feature]/(routes)/page.tsx`, `lib/services/` para a lógica pesada, e `lib/utils/` para coisas simples. Depois investe tempo em configurar um `.env` robusto e validação de variáveis no boot da aplicação - evita te arrepender em produção!
Sua resposta
Entrarpara responder.