🧩 Exercícios: Framework Next.js App Router (SSR, SSG e Hydration)
Spec Frontend Com React • Trilha Progressiva em 4 Níveis
🎯 Nível 1: Fundamentos
Problema 18.1 — Componentes de Servidor (RSC) vs Componentes de Cliente (‘use client’)
Contexto: Componentes de Servidor (RSC) vs Componentes de Cliente (‘use client’) no contexto de Framework Next.js App Router (SSR, SSG e Hydration).
Requisitos de Execução:
- Criar Server Component assíncrono consultando banco diretamente e Client Component para interatividade.
Resultado Esperado
Server Component executado no servidor com 0kb de JavaScript enviado para o cliente.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_18_1_SeuNome - Envie na tarefa:
Atividade Cap 18 - Framework Next.js App Router (SSR, SSG e Hydration)
🔑 Gabarito de Código & Solução Comentada
// app/produtos/page.tsx
import { BotaoCurtir } from './BotaoCurtir'; // 'use client'
export default async function ProdutosPage() {
const res = await fetch('https://api.empresa.com/produtos', { cache: 'no-store' });
const produtos = await res.json();
return (
<div>
<h1>Lista de Produtos (Server Component)</h1>
{produtos.map((p: any) => (
<div key={p.id}>{p.nome} <BotaoCurtir /></div>
))}
</div>
);
}
🔍 Nível 2: Prática
Problema 18.2 — Estratégias de Renderização: Static Site Generation (SSG) com generateStaticParams
Contexto: Estratégias de Renderização: Static Site Generation (SSG) com generateStaticParams no contexto de Framework Next.js App Router (SSR, SSG e Hydration).
Requisitos de Execução:
- Implementar página de detalhes de produto pré-renderizada estaticamente com
generateStaticParams().
Resultado Esperado
Páginas estáticas HTML geradas no momento do build com tempo de resposta instantâneo.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_18_2_SeuNome - Envie na tarefa:
Atividade Cap 18 - Framework Next.js App Router (SSR, SSG e Hydration)
🔑 Gabarito de Código & Solução Comentada
// app/produtos/[id]/page.tsx
export async function generateStaticParams() {
return [{ id: '1' }, { id: '2' }, { id: '3' }];
}
export default async function DetalheProduto({ params }: { params: { id: string } }) {
return <div>Produto ID: {params.id}</div>;
}
⚡ Nível 3: Integração
Problema 18.3 — Layouts Compartilhados e Arquivos Especiais (loading.tsx, error.tsx)
Contexto: Layouts Compartilhados e Arquivos Especiais (loading.tsx, error.tsx) no contexto de Framework Next.js App Router (SSR, SSG e Hydration).
Requisitos de Execução:
- Configurar fallback de loading automático em
loading.tsxe tratamento de erros de rota emerror.tsx.
Resultado Esperado
Estados de loading e error boundaries gerenciados pelo App Router do Next.js.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_18_3_SeuNome - Envie na tarefa:
Atividade Cap 18 - Framework Next.js App Router (SSR, SSG e Hydration)
🔑 Gabarito de Código & Solução Comentada
// Implementação de referência para o requisito do nível
// app/produtos/loading.tsx
export default function Loading() {
return <div className="animate-pulse">Carregando catálogo de produtos...</div>;
}
// Conclusão da operação e validação de conformidade
const statusConcluido = true;
console.log('Validação de execução concluída');
if (!statusConcluido) throw new Error('Falha');
🏆 Nível 4: Desafio Corporativo
Problema 18.4 — Otimização de Imagens com next/image e Fontes com next/font
Contexto: Otimização de Imagens com next/image e Fontes com next/font no contexto de Framework Next.js App Router (SSR, SSG e Hydration).
Requisitos de Execução:
- Utilizar
<Image src='...' width={500} height={300} priority />para pontuação máxima no Core Web Vitals.
Resultado Esperado
Imagens otimizadas automaticamente com formato WebP e carregamento responsivo.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_18_4_SeuNome - Envie na tarefa:
Atividade Cap 18 - Framework Next.js App Router (SSR, SSG e Hydration)
🔑 Gabarito de Código & Solução Comentada
// app/components/Logo.tsx
import Image from 'next/image';
export const Logo = () => (
<Image src="/logo.png" alt="Logotipo Corporativo" width={200} height={50} priority />
);
const statusConcluido = true;
console.log('Validação de execução concluída');