Fundamentos do Next.js 15
Introdução e a Diretiva 'use client'
Aprenda sobre introdução e a diretiva 'use client'
Módulo 2: Componentes Essenciais: Server e Client
Aula 1: Introdução e a Diretiva 'use client'
Bem-vindo à primeira aula do Módulo 2! 🚀 Neste módulo, vamos mergulhar em um dos conceitos mais fundamentais e poderosos do Next.js moderno: a distinção entre Server Components e Client Components. Essa arquitetura é crucial para construir aplicações performáticas, escaláveis e com excelente experiência do usuário.
Nesta aula, vamos introduzir os Server Components como o padrão do Next.js e, em seguida, focar na diretiva 'use client', entendendo o que ela faz e quando você deve usá-la.
1. Introdução Clara: O Mundo dos Server e Client Components ✨
Com o Next.js 15 e o App Router, a forma como pensamos em componentes React mudou significativamente. Agora, por padrão, todos os seus componentes são Server Components. Mas o que isso significa? E por que precisaríamos de "Client Components" então?
- Server Components (SC): São componentes React que são renderizados exclusivamente no servidor. Eles não enviam JavaScript para o navegador, resultando em carregamentos de página mais rápidos, menos JavaScript no cliente e melhor SEO. Pense neles como o HTML que o servidor já prepara para você.
- Client Components (CC): São componentes React que são renderizados no cliente (no navegador). Eles permitem interatividade, manipulação de estado, uso de hooks como
useStateeuseEffect, e acesso a APIs do navegador comowindowoudocument.
A grande sacada é que o Next.js permite que você misture e combine Server e Client Components na mesma árvore de componentes, dando-lhe o melhor dos dois mundos.
A diretiva 'use client' é a chave para desbloquear a interatividade no lado do cliente. Sem ela, seu componente permanecerá um Server Component.
2. Explicação Detalhada: Entendendo 'use client' 💡
O Paradigma Server-First
No Next.js 15, a filosofia é "server-first". Isso significa que, por padrão, o Next.js tenta renderizar o máximo possível da sua aplicação no servidor.
Benefícios dos Server Components (o padrão):
- Performance: Menos JavaScript enviado ao navegador, resultando em páginas mais rápidas e interativas mais cedo.
- Segurança: Dados sensíveis e lógica de backend podem ser mantidos no servidor, sem exposição ao cliente.
- SEO: O conteúdo é renderizado no servidor, facilitando a indexação por motores de busca.
- Acesso a Recursos do Servidor: Você pode acessar bancos de dados, sistemas de arquivos e APIs de backend diretamente de seus componentes.
A Diretiva 'use client'
A diretiva 'use client' é uma string literal que você coloca no topo de um arquivo de componente React. Ela age como um "sinal" para o Next.js e o bundler (como o Webpack ou o Turbopack) de que este componente e todos os seus filhos (que não sejam explicitamente Server Components) devem ser tratados como Client Components.
// app/components/MeuBotaoInterativo.jsx
'use client'; // <-- Esta é a diretiva!
import { useState } from 'react';
export default function MeuBotaoInterativo() {
const [contador, setContador] = useState(0);
return (
<button onClick={() => setContador(contador + 1)}>
Você clicou {contador} vezes
</button>
);
}O que 'use client' faz:
- Marca o Componente: Diz ao Next.js que este arquivo contém código que precisa ser executado no navegador.
- Habilita Recursos do Cliente: Permite o uso de
useState,useEffect,useRef,useContext, e outras APIs do navegador (window,document). - Gera JavaScript para o Cliente: O bundler inclui o JavaScript deste componente no bundle final que é enviado ao navegador.
Quando usar 'use client'? 🤔
Você deve usar 'use client' sempre que seu componente precisar de alguma das seguintes funcionalidades:
- Interatividade: Manipulação de eventos como
onClick,onChange,onSubmit, etc. - Hooks de Estado e Efeito:
useState,useEffect,useReducer,useRef,useCallback,useMemo,useContext. - APIs do Navegador: Acesso direto a
window,document,localStorage,navigator, etc. - Context API (Provedores): Se você estiver criando um provedor de contexto (
MyContext.Provider), ele precisará ser um Client Component. (Consumidores podem ser SCs se o provedor for um CC). - Componentes de Terceiros: Muitas bibliotecas de UI (como Material UI, Chakra UI, Ant Design) ou outras bibliotecas que dependem de estado ou efeitos no cliente exigirão que seus componentes sejam Client Components.
Exemplo de um Componente que PRECISA de 'use client':
// app/components/Contador.jsx
'use client'; // Necessário para usar useState e onClick
import { useState } from 'react';
export default function Contador() {
const [count, setCount] = useState(0);
return (
<div>
<p>Contagem: {count}</p>
<button onClick={() => setCount(count + 1)}>
Incrementar
</button>
</div>
);
}Exemplo de um Componente que NÃO PRECISA de 'use client' (Server Component):
// app/components/Saudacao.jsx
// Nenhuma diretiva 'use client' significa que é um Server Component por padrão.
export default function Saudacao({ nome }) {
return (
<p>Olá, {nome}! Bem-vindo ao Next.js 15.</p>
);
}Este componente é estático e não precisa de interatividade no navegador, então ele se beneficia de ser um Server Component.
Como 'use client' afeta a renderização e o bundle?
Quando você marca um componente com 'use client', o Next.js ainda pode fazer uma pré-renderização inicial no servidor. Isso significa que o HTML inicial é gerado no servidor e enviado ao cliente. No entanto, o JavaScript correspondente a esse componente também é enviado. Uma vez no navegador, o React "hidrata" esse HTML, anexando os event listeners e tornando o componente interativo.
Fluxo simplificado:
- Servidor: Next.js renderiza o Server Component (
Saudacao) e o Client Component (Contador) (pré-renderização). O HTML resultante é enviado. - Cliente: O navegador recebe o HTML e o JavaScript do
Contador. - Cliente: O React "hidrata" o
Contador, tornando-o interativo. OSaudacaopermanece estático, sem JS adicional.
3. Código de Exemplo Oficial (Adaptado da Documentação) 📚
Este exemplo mostra como você pode aninhar Server e Client Components. A página principal é um Server Component, que importa um Client Component para lidar com a interatividade.
// app/page.jsx (Server Component por padrão)
import styles from './home.module.css';
import BotaoContador from '../components/BotaoContador'; // Importa um Client Component
export default function HomePage() {
return (
<div className={styles.container}>
<h1>Bem-vindo ao Nosso App Next.js!</h1>
<p>Esta é uma página renderizada no servidor.</p>
<BotaoContador /> {/* Usando um Client Component aqui */}
<p>Abaixo, mais conteúdo estático do servidor.</p>
<p>Componentes Server-Side são ótimos para SEO e performance inicial.</p>
</div>
);
}// components/BotaoContador.jsx (Client Component)
'use client'; // Essencial para interatividade
import { useState } from 'react';
export default function BotaoContador() {
const [count, setCount] = useState(0);
return (
<div style={{ padding: '20px', border: '1px solid #ccc', borderRadius: '8px', margin: '20px 0' }}>
<p>Este é um **Client Component** com estado interativo.</p>
<button onClick={() => setCount(count + 1)}>
Cliques: {count}
</button>
<p>Tente clicar no botão para ver a contagem aumentar!</p>
</div>
);
}Neste cenário:
HomePageé um Server Component. Ele pode buscar dados, acessar o sistema de arquivos, etc., sem enviar esse código para o cliente.BotaoContadoré um Client Component. Ele é o responsável por toda a interatividade (ouseStatee oonClick).- O Next.js otimiza o bundle de JavaScript, enviando apenas o necessário para
BotaoContadore outros Client Components.
4. Exercícios/Desafios Conceituais 🤔
Para consolidar seu entendimento, responda às seguintes perguntas:
-
Cenário de Componente: Você está construindo um componente que exibe a data e hora atualizadas a cada segundo. Este componente precisaria da diretiva
'use client'? Por quê?Sim / NãoJustificativa:
-
Interatividade vs. Estático: Qual é a principal diferença de funcionalidade que a diretiva
'use client'habilita em um componente?- A) Acesso a bancos de dados no servidor.
- B) Renderização mais rápida no servidor.
- C) Interatividade e uso de hooks de estado no navegador.
- D) Melhor otimização de SEO por padrão.
-
Posicionamento da Diretiva: Onde a diretiva
'use client'deve ser colocada em um arquivo de componente?- A) Dentro da função do componente.
- B) No final do arquivo.
- C) No topo do arquivo, antes de qualquer importação ou código.
- D) Em um arquivo de configuração separado.
-
Aninhamento: Se um Server Component importa e renderiza um Client Component, o Client Component ainda precisa da diretiva
'use client'?Sim / NãoJustificativa:
5. Resumo e Próximos Passos ✅
Nesta aula, você aprendeu:
- Que o Next.js 15 adota Server Components como o padrão, priorizando performance e otimização.
- A importância da diretiva
'use client'para marcar componentes que precisam de interatividade no navegador. - Quando usar
'use client': para hooks de estado, efeitos, APIs do navegador e manipulação de eventos. - Como Server e Client Components podem ser aninhados para construir aplicações robustas.
A compreensão de Server e Client Components é a base para desenvolver aplicações eficientes com o App Router do Next.js. Na próxima aula, vamos aprofundar ainda mais, explorando as melhores práticas e estratégias para decidir quando usar Server Components e quando usar Client Components em diferentes cenários.
Próxima Aula: Módulo 2, Aula 2: Estratégias de Uso: Quando Server, Quando Client? 🚀