Web e desenvolvimento / CLEARBYTE

Atualizar JavaScript e CSS sem deixar versões antigas na cache

Quando JavaScript ou CSS muda, atribua-lhe um endereço novo, normalmente com um hash do conteúdo no nome. Esses ficheiros podem ter uma validade longa; o HTML deve descobrir novas versões por revalidação ou validade mais curta.

Neste guia

Se uma publicação aparece correta numa janela privada mas antiga numa visita habitual, compare primeiro os endereços. Substituir o ficheiro no servidor não invalida uma resposta ainda válida no navegador.

Uma publicação fiável torna explícita a relação entre HTML e recursos. Conservar versões anteriores permite que uma página aberta antes da alteração carregue os módulos correspondentes.

Separe o HTML dos recursos versionados

Considere o HTML um manifesto. A versão A referencia app.4c21.js e site.19ab.css; B referencia app.9d80.js e pode manter o CSS se os bytes não mudaram. Estes nomes são exemplos, não hashes calculados.

Assim, recursos iguais são reutilizados e os alterados ganham outra identidade. Guardar HTML durante um ano pode atrasar a descoberta da publicação: o documento antigo continua a pedir os endereços antigos.

Contrato de publicação do exemplo
RecursoVersão AVersão BTratamento previsto
HTMLReferencia app.4c21.jsReferencia app.9d80.jsRevalidar ou usar uma validade curta intencional
JavaScript da aplicaçãoapp.4c21.jsapp.9d80.jsNovo endereço quando os bytes mudam
CSS inalteradosite.19ab.csssite.19ab.cssReutilizar o mesmo endereço de conteúdo
Recursos anterioresDisponíveisContinuam disponíveis para páginas antigasConservar durante a compatibilidade necessária

Aplique cabeçalhos adequados a cada recurso

Para um ficheiro público que nunca muda naquele endereço, max-age longo e immutable podem ser adequados. No HTML, no-cache permite guardar, mas exige validação antes da reutilização. no-store pede que a resposta não seja guardada. Não aplique uma única regra a tudo.

Os cabeçalhos apresentados ilustram uma estratégia. Verifique o que o alojamento realmente envia e como está configurada a cache da CDN. Uma definição local não prova a política recebida publicamente.

Versioned public asset: /assets/app.9d80.js
Cache-Control: public, max-age=31536000, immutable

HTML document: /index.html
Cache-Control: no-cache

The URL /assets/app.9d80.js must continue to serve the same bytes.

Confirme que a chave inclui a consulta

/app.js?v=release-b pode ter identidade diferente de /app.js?v=release-a se todas as caches relevantes incluírem o parâmetro na chave. Uma regra CDN que ignore consultas pode tratar ambos como o mesmo objeto.

Evite valores aleatórios a cada visita: destroem a reutilização. Use hash ou versão estável que só mude com o conteúdo. Fragmentos como /app.js#release-b não são enviados no pedido HTTP e não servem para versionar a resposta.

Encontre a camada que ainda entrega conteúdo antigo

Compare HTML, endereço referenciado e bytes recebidos. Se o HTML aponta para o hash antigo, investigue a sua validade. Se aponta para o novo mas recebe bytes velhos, examine publicação, chaves e origem. Se a rede está correta, procure uma página ainda em execução ou um service worker.

Limpar a CDN não apaga uma resposta válida já guardada no navegador de cada visitante. Uma recarga forçada é apenas um diagnóstico local. Anote a camada ignorada em cada teste para tornar o resultado reproduzível.

  • Registe o endereço final do HTML e do script ou CSS.
  • Inspecione estado, Content-Type, Cache-Control, ETag e cabeçalhos de cache.
  • Confirme os bytes esperados, não uma página HTML de recurso alternativo.
  • Verifique separadamente a cache do service worker, quando existir.
  • Teste uma visita limpa e uma página aberta durante a publicação.

Preserve páginas antigas e a possibilidade de reversão

Envie novos recursos antes do HTML que os referencia ou publique o conjunto de forma atómica. Guarde versões antigas durante o período necessário para documentos em cache e separadores abertos; módulos podem ser pedidos horas depois.

Publique B com recursos de A e B presentes, verifique B e mantenha a possibilidade de voltar a A. Apagar app.4c21.js de imediato quebra páginas antigas. Reutilizar o nome com bytes novos viola o contrato e torna a reversão imprevisível.

Meça reutilização depois de confirmar a correção

Teste a primeira visita, uma repetição e uma nova publicação: transferência inicial, reutilização elegível e descarga apenas dos recursos alterados. Inspecione transferências reais, incluindo pedidos de revalidação.

As calculadoras de poupança de cache e transferência comparam hipóteses explícitas sobre acertos, pedidos e tamanho. Não substituem medir os cabeçalhos públicos e a taxa real de acertos.

Perguntas frequentes

Devo desligar toda a cache para corrigir CSS antigo?

Comece por identificar o documento ou recurso desatualizado e estabelecer versões estáveis. Desligar tudo aumenta transferência e latência sem resolver necessariamente a publicação.

Alterar ETag substitui imediatamente um ficheiro válido em cache?

Não necessariamente. O navegador pode reutilizá-lo sem consultar o servidor. Um endereço novo evita depender de uma validação futura.

Quando posso apagar ficheiros com hashes antigos?

Depois do período necessário para HTML guardado, páginas abertas e reversão. Preserve-os enquanto algum documento suportado puder referenciá-los.

Fontes e definições

Método conferido: