Server Components rodam só no servidor, em tempo de request ou de build, e nunca enviam o código deles para o navegador; eles podem dar await direto numa consulta ao banco, mas não podem usar estado, efeitos ou event handlers. Client Components são marcados com a diretiva use client, hidratam no navegador e cuidam da interatividade. Comece pelo servidor por padrão e empurre a fronteira do cliente o mais para baixo possível na árvore.
Por que os entrevistadores perguntam isso
Trabalhar com App Router é comum hoje e muitos candidatos só leram sobre isso. O entrevistador quer saber se você entende a fronteira: que código de fato chega no navegador, o que consegue cruzar a linha de serialização, e por que o padrão importa para o tamanho do bundle. Ele também está atento a se você conhece o truque de composição de passar children renderizados no servidor para dentro de um client component.
Como estruturar sua resposta
- Comece dizendo onde cada um roda e o que é enviado para o navegador.
- Cite os limites concretos: sem hooks, sem event handlers, só props serializáveis.
- Diga qual é o seu padrão e o gatilho para cruzar a fronteira.
- Mencione passar children renderizados no servidor para uma casca de cliente.
Exemplo de resposta
A forma como eu penso nisso é que Server Components servem para buscar dados e renderizar markup, e Client Components servem para qualquer coisa que o usuário toca. Um Server Component roda no servidor, então eu posso dar await numa query direto dentro dele, e nada desse código nem dessas dependências vai parar no bundle do navegador. O custo é não ter useState, nem useEffect, nem onClick. No momento em que eu preciso de um desses, eu coloco use client no topo daquele arquivo, e tudo que ele importa entra no bundle do cliente também. Então meu padrão é servidor e eu empurro a fronteira o mais para baixo que dá. No meu último projeto eu tinha um dashboard onde só o dropdown de filtro e o tooltip do gráfico eram interativos, então esses viraram dois client components pequenos e o resto da página, incluindo um renderizador de markdown bem pesado, ficou no servidor. O que costuma pegar as pessoas é que as props que cruzam a fronteira precisam ser serializáveis, então você não consegue passar uma função para baixo. O padrão que eu uso no lugar disso é passar children renderizados no servidor para dentro de uma casca de cliente.
Vai encarar essa entrevista em breve? O GhostPilot escuta a sua chamada ao vivo, identifica a pergunta no instante em que ela é feita e coloca uma resposta estruturada na sua tela em tempo real. Teste na sua próxima entrevista simulada ou pegue um Session Pass de $29, sem assinatura, para a hora da verdade.
Veja como funcionaPerguntas de acompanhamento que você pode esperar
- O que você pode passar como prop através da fronteira entre servidor e cliente?
- Como dois client components em partes diferentes de uma página renderizada no servidor compartilham estado?
- O que acontece se você importar um módulo server only dentro de um client component?
Mais perguntas para Desenvolvedor React
Seu entrevistador vai fazer a própria versão desta. Cole a descrição real da vaga no Question Predictor gratuito e receba as 20 perguntas que essa vaga tem mais chance de fazer, com o que cada uma está de fato sondando.
Prever minhas perguntas