Capítulo 45 de 456
Com cacheComponents + partialPrefetching, toda rota tem primeira visita instantânea, mesmo URLs não incluídas no build: rotas prerenderizadas em generateStaticParams servem página completa; rotas não listadas servem um App Shell instantâneo e fazem upgrade em background. Equivalente moderno a fallback: true do Pages Router.
generateStaticParams: define quais combinações de params são prerenderizadas no build; params fora dessa lista ficam "não resolvidos" até o upgrade.await params deve ficar dentro de um componente envolto em <Suspense>, mesmo para params conhecidos, para que o App Shell seja gerado corretamente para uma única rota compartilhada.<Link>/router.prefetch), Next.js renderiza a página com os params agora conhecidos; visitas seguintes recebem o resultado atualizado do cache.generateStaticParams fica não resolvido e impede que params mais profundos façam upgrade.'use cache' a nível de módulo: cacheia todas as funções exportadas de um arquivo (ex.: camada de dados), permitindo que seus resultados entrem no shell estático.// next.config.ts
const nextConfig: NextConfig = {
cacheComponents: true,
partialPrefetching: true,
}
cacheComponents produz o App Shell, partialPrefetching faz o upgrade.// app/[category]/layout.tsx
async function CategoryHeader({ params }: Pick<LayoutProps<'/[category]'>, 'params'>) {
const { category } = await params
const data = await getCategory(category)
return <div><h1>{data?.name ?? 'Category'}</h1></div>
}
export default function CategoryLayout(props: LayoutProps<'/[category]'>) {
return (
<div>
<Suspense fallback={<div>Loading...</div>}>
<CategoryHeader params={props.params} />
</Suspense>
{props.children}
</div>
)
}
await params isolado num componente filho dentro de <Suspense>, permitindo gerar o App Shell mesmo para categorias conhecidas em generateStaticParams.| Resultado do upgrade | Condição |
|---|---|
| Página totalmente estática | Todo acesso a dado é cacheado e todos os params resolvidos |
| Página cacheada com fallbacks | Params resolvidos, mas ainda há dado não cacheado ou API de runtime (cookies, headers) em <Suspense> |
| Fica sem upgrade | Param não coberto por generateStaticParams bloqueia upgrade de params mais profundos |
| Migrando do Pages Router | Equivalente em Cache Components |
|---|---|
fallback: true em getStaticPaths | Comportamento padrão com cacheComponents |
router.isFallback | Não é necessário; o shell estático já cobre isso |
getStaticProps com revalidate | 'use cache' com cacheLife |
getStaticPaths | generateStaticParams |
await params diretamente no layout/page acima do <Suspense>: ata o App Shell àquela URL específica em vez de gerar um shell genérico reutilizável.router.prefetch) conta como a "primeira visita" que dispara o upgrade em background.await params dentro do Suspense boundary, mesmo em rotas conhecidas, é o que garante App Shell compartilhado.