Capítulo 43 de 456
Explica o funcionamento interno da revalidação de cache no Next.js (tags, consistência HTML/RSC, coordenação multi-instância) para quem implementa cache handlers customizados ou debuga comportamento de revalidação em produção.
cacheLife/revalidate.revalidateTag() ou revalidatePath(); a próxima requisição dispara render fresco.cacheTag() dentro de use cache, ou via next: { tags: [...] } num fetch._N_T_, uma por segmento de rota (layout) mais a rota folha; permitem que revalidatePath() funcione pelo mesmo sistema de tags.updateTags(): hook do cache handler chamado quando revalidateTag() roda; deve escrever o evento de invalidação em storage compartilhado (Redis, DB).refreshTags(): hook chamado periodicamente antes de cada nova requisição; deve ler o storage compartilhado e atualizar o estado local de tags. Deve capturar erros internamente, senão a exceção propaga como falha de requisição.getExpiration(): retorna o timestamp de revalidação mais recente entre as tags fornecidas, ou 0 se nenhuma foi revalidada; pode retornar Infinity para sinalizar que as soft tags devem ser passadas a get().deploymentId: mitiga cross-deployment skew forçando hard navigation quando o cliente detecta deployment ID diferente do servidor.| Cenário de falha | Comportamento |
|---|---|
| Falha de escrita no cache | Resposta ainda é servida (escrita é assíncrona); entrada é perdida, próxima requisição gera render fresco |
| Falha de leitura no cache | Handler deve capturar erro e retornar undefined (sinal de miss); erro lançado propaga como erro de render, não como miss |
| Inconsistência HTML/RSC | Cachear juntos com mesmo TTL e respeitar header Vary evita mismatch em navegação client-side |
| Cross-deployment skew | Configurar deploymentId para forçar hard navigation |
Vary.refreshTags() sem try/catch: uma exceção não capturada propaga como falha de requisição em vez de degradar graciosamente.revalidateTag() só invalida a instância que recebeu a chamada; outras seguem servindo conteúdo stale até implementar updateTags()/refreshTags()._N_T_...) fazem revalidatePath() funcionar através do mesmo sistema de tags usado por revalidateTag().undefined em erro de leitura, nunca lançar exceção, para sinalizar miss corretamente.updateTags(), refreshTags() e getExpiration() são implementados na prática.Vary e políticas de TTL para HTML/RSC em edge caches.