Como Nomes com Hash (app.8f92a.js) e o Cache-Control: immutable Fazem o Teu Site Abrir em 0 Milissegundos

Como Nomes com Hash (app.8f92a.js) e o Cache-Control: immutable Fazem o Teu Site Abrir em 0 Milissegundos

A Taxa Invisível dos Pedidos 304: Porque o Teu Site “em Cache” Continua Lento

Quando se fala de velocidade na web, a atenção recai quase sempre sobre o primeiro carregamento da página: o Time to First Byte (TTFB), o First Contentful Paint (FCP) e a compressão das imagens. As equipas passam semanas a reduzir kilobytes e a afinar servidores.

No entanto, em qualquer loja online de sucesso, portal de notícias ou software SaaS, mais de 70% das visitas diárias vêm de utilizadores que já visitaram o site antes.

O que acontece quando esse cliente habitual clica num link ou atualiza a página no browser?

Se o teu servidor responder com configurações genéricas como Cache-Control: max-age=3600, o navegador não abre a página de forma instantânea. Em vez disso, entra num diálogo de revalidação de rede com o teu servidor conhecido como verificação condicional:

A TAXA DE ATRASO DA REVALIDAÇÃO CONDICIONAL 304

  • O Teu Utilizador Recarrega a Página (F5): O browser tem o ficheiro /assets/app.js guardado no disco local
  • O Browser Pensa: “Será que o ficheiro mudou no servidor? Tenho de perguntar!”
  • Browser GET /assets/app.js (If-None-Match: “etag-9182a”) → Servidor Nginx
  • O Nginx valida o ficheiro no disco → Bate certo → Devolve 304
  • Browser → HTTP/2 304 Not Modified (Esperou 45ms de latência de rede!)
  • A visita demorou 150ms apenas à espera de 20 perguntas desnecessárias!

Embora o servidor não tenha transferido o corpo do ficheiro novamente, o navegador do teu utilizador teve de esperar uma viagem completa de ida e volta na rede (RTT) para cada folha de estilo CSS, imagem e ficheiro de JavaScript da página. Numa ligação 4G ou 5G com 60ms de latência, isto traduz-se em atrasos perceptíveis.

A resposta definitiva e elegante de engenharia consiste em combinar Nomes com Hash de Conteúdo com o cabeçalho Cache-Control: public, max-age=31536000, immutable.

Na nossa equipa desenhamos websites de alta performance e websites estáticos rápidos que tiram partido desta arquitetura para entregar carregamentos reais em 0 milissegundos.


A Arquitetura em Duas Camadas: HTML Dinâmico vs. Recursos Imutáveis

Para garantires carregamentos instantâneos sem correres o risco de os teus clientes ficarem presos a versões antigas de código, deves separar os teus ficheiros em duas categorias rigorosas:

O PADRÃO DE SEPARAÇÃO DE CACHE EM DUAS CAMADAS

  • CAMADA 1: O FICHEIRO PRINCIPAL (index.html)
  • Cabeçalho: Cache-Control: no-cache
  • Valida sempre junto do servidor (Demora ~10ms para um HTML minúsculo de 5KB)
  • Aponta para os ficheiros mais recentes:
    [+] [ INDEX_DIRECTORY ] 15 tópicos ▼
    [ SYSTEM.FAQ ]

    Perguntas Frequentes

    O que é o content hashing nos ficheiros do frontend?

    O content hashing é a técnica de calcular um hash criptográfico (como SHA-256 ou xxHash) com base no conteúdo final do ficheiro compilado e anexar essa impressão digital diretamente no nome (`app.c83a1b.js`). Se alterares uma linha de código, o nome do ficheiro muda por completo; se o ficheiro não for alterado, o nome mantém-se rigorosamente idêntico entre deploys.

    O que faz exatamente a diretiva immutable no cabeçalho Cache-Control?

    Definida na norma RFC 8246, a diretiva `Cache-Control: public, max-age=31536000, immutable` diz ao navegador que o conteúdo daquele ficheiro nunca vai mudar durante a sua vida útil. Mesmo que o utilizador carregue no botão de atualizar (F5), o browser lê o ficheiro da memória local em 0ms sem enviar pedidos condicionais 304 ao servidor.

    Porque é que o ficheiro index.html NUNCA deve ser servido como imutável?

    O documento principal `index.html` contém as ligações para os nomes dos ficheiros de JavaScript e CSS com hash. Se colocares o HTML em cache imutável, os teus clientes nunca recebem as novas versões quando fazes um deploy. O ficheiro HTML deve ser sempre servido com `Cache-Control: no-cache` para que o browser consulte sempre o servidor.

    Como é que a cache imutável poupa memória e processador no teu servidor Nginx?

    Quando o navegador faz pedidos de revalidação 304 (`If-None-Match`), o teu servidor Nginx tem de negociar a ligação TLS, verificar os ficheiros no disco e emitir cabeçalhos HTTP. A cache imutável elimina estas confirmações por completo, reduzindo o tráfego de rede e o esforço do processador a zero em visitas repetidas.

    > INICIAR_PROJETO

    Precisa de um website que transmita confiança, apareça na pesquisa e dê mais força à sua presença digital? Comece a conversa aqui.