
Em Next.js, a forma como os componentes do lado do cliente ("use client") funcionam com SSR (Server-Side Rendering) às vezes pode ser confusa. Vamos decompô-lo:
Como funcionam os componentes de cliente e servidor em Next.js:
-
Componentes do servidor: Estes são os padrões em Next.js e são pré-renderizados no servidor. Eles não são enviados ao cliente como JavaScript, mas apenas como HTML.
-
Componentes do cliente: Quando você marca um componente com "use client", significa que o componente precisa ser executado no client-side porque pode ter interatividade (como useState, useEffect), ou depende de APIs de navegador que não funcionam em um ambiente de servidor.
Por que os componentes do cliente ainda renderizam HTML no servidor:
Mesmo que um componente esteja marcado como "usar cliente", o HTML inicial desse componente ainda pode ser gerado no servidor (SSR), mas apenas para fins de HTML estático . Isso significa:
-
Renderização inicial: O servidor gera o HTML da página, incluindo os componentes do cliente, para melhor desempenho e SEO. Este é HTML estático, não interativo.
-
Hidratação: Quando esse HTML chega ao navegador, Next.js hidrata o componente do lado do cliente com JavaScript, permitindo sua interatividade.
Por que isso acontece:
-
Desempenho: ao renderizar o HTML inicial no servidor, o usuário pode ver o conteúdo mais rapidamente (tempo até o primeiro byte mais rápido, ou TTFB) sem esperar o carregamento do JavaScript do lado do cliente.
-
SEO: A pré-renderização do HTML é importante para o SEO porque garante que os mecanismos de pesquisa possam rastrear e indexar o conteúdo.
-
Hidratação: Depois que o HTML é veiculado, Next.js envia o pacote JavaScript para o cliente, que "hidrata" o HTML estático, anexando ouvintes de eventos e tornando-o interativo.
O que acontece com “usar cliente”?
-
Renderização de HTML do lado do servidor: Mesmo que um componente seja do lado do cliente, Next.js ainda gera HTML para a visualização inicial. Portanto, embora não execute JavaScript interativo no servidor, ele envia marcação HTML para o cliente.
-
Hidratação do lado do cliente: O JavaScript necessário para a interatividade é enviado ao cliente e, assim que a página carrega, Next.js hidrata o componente, tornando-o totalmente funcional.
Equívoco:
Marcar um componente com "use client" não significa que ele não irá gerar qualquer HTML no lado do servidor. Significa simplesmente que o JavaScript interativo só será carregado no cliente, mas o servidor ainda poderá gerar o HTML estático inicial para renderização.
Para resumir:
-
SSR de componentes do cliente: O HTML para componentes do cliente pode ser pré-renderizado no servidor (para carregamento inicial), mas eles não são interativos até serem hidratados no cliente.
-
"use client": Esta diretiva garante que o JavaScript para interatividade do lado do cliente seja executado apenas no navegador, mas não interrompe a geração de HTML estático no servidor.
Se você quiser garantir que o componente se comporte de maneira diferente, talvez seja necessário repensar onde e como carregar determinado conteúdo dinâmico, especialmente se você espera um comportamento específico do cliente (como acessar uma janela ou documento).