Capítulo 9 de 456
Caching armazena o resultado de fetch de dados e computações para servir requisições futuras mais rápido. Esta página cobre caching sob Cache Components (cacheComponents: true no next.config.ts); sem essa flag, ver o guia "Caching and Revalidating (Previous Model)".
cacheComponents: true: flag em next.config.ts que habilita o modelo de Cache Components; GET Route Handlers passam a seguir o mesmo modelo de prerender das páginas.use cache: diretiva que cacheia o retorno de funções/componentes assíncronos; pode ser aplicada em nível de dados (getUsers()) ou de UI (componente/página inteira).cacheLife: define o tempo de vida do cache; recomenda-se sempre parear com use cache (sem ele, aplica-se o profile default implícito).use cache entram automaticamente na chave, gerando entradas separadas por input diferente.<Suspense>: necessário ao redor de componentes que leem dados não cacheados ou APIs de runtime (cookies, headers, searchParams, params); o fallback entra no static shell enquanto o conteúdo real é resolvido em request time.connection(): chamado antes de operações não determinísticas (Math.random(), Date.now(), crypto.randomUUID()) para adiar a execução para o request time; deve ser usado dentro de <Suspense>.use cache: private: variante que dá lifetime a uma função que lê cookies/headers/searchParams diretamente, permitindo que entre num prefetch.<Suspense>.generateStaticParams prerenderiza URLs listadas; outras URLs recebem o App Shell instantaneamente e são promovidas em background.import { cacheLife } from 'next/cache'
export async function getUsers() {
'use cache'
cacheLife('hours')
return db.query('SELECT * FROM users')
}
import { cookies } from 'next/headers'
import { Suspense } from 'react'
async function ProfileContent() {
const session = (await cookies()).get('session')?.value
return <CachedContent sessionId={session} />
}
async function CachedContent({ sessionId }: { sessionId: string }) {
'use cache'
const data = await fetchUserData(sessionId)
return <div>{data}</div>
}
use cache: private e mantendo o componente elegível para prefetch.import { connection } from 'next/server'
import { Suspense } from 'react'
async function UniqueContent() {
await connection()
const uuid = crypto.randomUUID()
return <p>Request ID: {uuid}</p>
}
| API usada no componente | Resultado no prerender |
|---|---|
use cache (lifetime não muito curto) | resultado cacheado, incluído no static shell |
<Suspense> | fallback no shell, conteúdo real via stream em request time |
Valores previsíveis (import, fs.readFileSync, computação pura) | completam no prerender automaticamente |
Valores aleatórios/timestamp sem connection() | erro/insight no dev overlay (blocking-prerender-*) |
<Suspense>: dispara o insight "blocking-route" no dev overlay; sempre envolva o componente que usa cookies/headers/searchParams/params em <Suspense>.Math.random()/Date.now()/crypto.randomUUID() direto no prerender: gera erro de build; usar connection() + <Suspense> ou cachear o resultado.params no topo do layout: bloqueia o prerender do layout inteiro; empurrar o await params para um componente filho dentro de <Suspense>.use cache com cacheLife; sem isso o profile default (stale 5m/revalidate 15m/expire never) é aplicado silenciosamente.use cache: private ou extrair valor de runtime API e repassar como prop são as duas formas de manter conteúdo dependente de sessão elegível para prefetch.use cache: remote, porque a cache key inclui o build id.cacheLife, cacheTag, revalidateTag, updateTag controlam quando/como o cache aqui descrito é invalidado.GET Route Handlers seguem o mesmo modelo de prerender quando Cache Components está habilitado.