Pular para o conteúdo

Voltar para projetos

PWA

O cache que só invalida sozinho quando algo realmente muda

· 6 min

Um site funcionando como PWA tinha um service worker cuidando de duas coisas: servir o shell da aplicação (HTML, CSS, JS, ícones) direto do cache antes de tentar a rede, e manter os dados em JSON atualizados em segundo plano sem bloquear a resposta. Funciona bem, até o dia em que o site muda e o cache precisa acompanhar essa mudança.

Ilustração de um padrão de blocos, como uma impressão digital

O jeito ingênuo: um número que alguém precisa lembrar de mudar

A forma mais comum de fazer isso é nomear o cache com uma string de versão escrita à mão, incrementada a cada deploy. O risco fica escondido: se alguém esquecer de subir esse número numa mudança, o deploy sobe CSS e JS novos, mas o service worker de cada usuário continua reconhecendo o cache antigo como válido e serve exatamente os arquivos de antes, indefinidamente. Não quebra visivelmente, o site simplesmente parece "não ter atualizado", e o sintoma só aparece bem depois do deploy, longe de qualquer log que aponte a causa.

Tirar a memória humana da equação

A correção foi parar de digitar esse número. O identificador de versão do cache passou a ser calculado no build: um hash SHA-256 do conteúdo final do CSS, do JS já empacotado e do sprite de ícones, truncado pra um formato curto. Qualquer mudança real nesses arquivos muda o hash, o que muda o nome do cache, o que faz o passo de ativação do service worker reconhecer o cache antigo como obsoleto e apagá-lo, sem exigir que ninguém lembre de fazer nada.

Duas estratégias, uma fundação em comum

O shell da aplicação usa cache-first com um fallback de página offline; os dados em JSON usam stale-while-revalidate, servindo a versão em cache na hora enquanto busca a atualizada em segundo plano. As duas estratégias são diferentes, mas dependem inteiramente do nome do cache ser confiável, corrigir a versão corrigiu a base sobre a qual as duas foram construídas.

Resultado

Servir uma versão obsoleta depois de um deploy deixou de ser um risco que dependia de alguém lembrar de um passo manual, passou a ser estruturalmente impossível, porque não existe mais número nenhum pra esquecer de atualizar.