Armazenamento em cache de service worker e armazenamento em cache HTTP

Os prós e contras de usar uma lógica de expiração consistente ou diferente nas camadas de cache do service worker e HTTP.

Jonathan Chen
Jonathan Chen

Embora os service workers e os PWAs estejam se tornando padrões de aplicativos da Web modernos, o cache de recursos ficou mais complexo do que nunca. Este artigo aborda o panorama geral do cache do navegador, incluindo:

  • Os casos de uso e as diferenças entre o armazenamento em cache do service worker e o armazenamento em cache HTTP.
  • Os prós e contras de diferentes estratégias de expiração do cache do service worker em comparação com as estratégias regulares de cache HTTP.

Visão geral do fluxo de armazenamento em cache

Em um nível mais alto, um navegador segue a ordem de armazenamento em cache abaixo ao solicitar um recurso:

  1. Cache do service worker: o service worker verifica se o recurso está no cache e decide se vai retornar o recurso com base nas estratégias de armazenamento em cache programadas. Isso não acontece automaticamente. É necessário criar um manipulador de eventos de busca no service worker e interceptar solicitações de rede para que elas sejam veiculadas do cache do service worker em vez da rede.
  2. Cache HTTP (também conhecido como cache do navegador): se o recurso for encontrado no cache HTTP e ainda não tiver expirado, o navegador usará automaticamente o recurso do cache HTTP.
  3. Lado do servidor:se nada for encontrado no cache do service worker ou no cache HTTP, o navegador vai para a rede solicitar o recurso. Se o recurso não estiver armazenado em cache em uma CDN, a solicitação precisará voltar até o servidor de origem.

Fluxo de armazenamento em cache

Camadas de cache

Armazenamento em cache do service worker

Um service worker intercepta solicitações HTTP do tipo rede e usa uma estratégia de cache para determinar quais recursos precisam ser retornados ao navegador. O cache do service worker e o cache HTTP têm o mesmo propósito geral, mas o cache do service worker oferece mais recursos de armazenamento em cache, como controle refinado sobre exatamente o que é armazenado em cache e como isso é feito.

Como controlar o cache do service worker

Um service worker intercepta solicitações HTTP com listeners de eventos (geralmente o evento fetch). Este snippet de código demonstra a lógica de uma estratégia de armazenamento em cache Cache-First.

Diagrama mostrando como os service workers interceptam solicitações HTTP

É altamente recomendável usar o Workbox para evitar reinventar a roda. Por exemplo, é possível registrar caminhos de URL de recursos com uma única linha de código regex.

import {registerRoute} from 'workbox-routing';

registerRoute(new RegExp('styles/.*\\.css'), callbackHandler);

Estratégias e casos de uso de armazenamento em cache de service worker

A tabela a seguir descreve as estratégias comuns de armazenamento em cache do service worker e quando cada uma delas é útil.

Estratégias Justificativa de atualização Casos de uso
Somente rede O conteúdo precisa estar atualizado em todos os momentos.
  • Pagamentos e finalizações de compra
  • Extratos de saldo
Rede voltando ao cache É preferível veicular o conteúdo atualizado. No entanto, se a rede falhar ou estiver instável, é aceitável veicular conteúdo um pouco antigo.
  • Dados oportunos
  • Preços e tarifas (exige exonerações de responsabilidade)
  • Status do pedido
Stale-while-revalidate Não há problema em veicular conteúdo armazenado em cache imediatamente, mas o conteúdo atualizado deve ser usado no futuro.
  • Feeds de notícias
  • Páginas de informações do produto
  • Mensagens
Cache primeiro, volte para a rede O conteúdo não é crítico e pode ser veiculado do cache para melhorar a performance, mas o service worker precisa verificar se há atualizações de vez em quando.
  • Shells de apps
  • Recursos comuns
Apenas cache O conteúdo raramente muda.
  • Conteúdo estático

Outros benefícios do armazenamento em cache do service worker

Além do controle detalhado da lógica de cache, o cache do service worker também oferece:

  • Mais memória e espaço de armazenamento para sua origem:o navegador aloca recursos de cache HTTP por origem. Em outras palavras, se você tiver vários subdomínios, todos eles vão compartilhar o mesmo cache HTTP. Não há garantia de que o conteúdo da sua origem/domínio vai permanecer no cache HTTP por muito tempo. Por exemplo, um usuário pode limpar o cache manualmente na interface de configurações de um navegador ou forçar uma atualização completa em uma página. Com um cache de service worker, é muito mais provável que o conteúdo armazenado em cache permaneça em cache. Consulte Armazenamento persistente para saber mais.
  • Maior flexibilidade com redes instáveis ou experiências off-line:com o cache HTTP, você só tem uma escolha binária: o recurso está em cache ou não. Com o cache do service worker, é muito mais fácil mitigar pequenos "soluços" (com a estratégia "obsoleto enquanto revalida"), oferecer uma experiência off-line completa (com a estratégia "somente cache") ou até mesmo algo intermediário, como interfaces personalizadas com partes da página vindas do cache do service worker e algumas partes excluídas (com a estratégia "definir manipulador de captura") quando apropriado.

Cache HTTP

Na primeira vez que um navegador carrega uma página da Web e os recursos relacionados, ele armazena esses recursos no cache HTTP. Normalmente, o cache HTTP é ativado automaticamente pelos navegadores, a menos que tenha sido desativado explicitamente pelo usuário final.

Usar o armazenamento em cache HTTP significa depender do servidor para determinar quando e por quanto tempo armazenar um recurso em cache.

Controlar a expiração do cache HTTP com cabeçalhos de resposta HTTP

Quando um servidor responde a uma solicitação de recurso de um navegador, ele usa cabeçalhos de resposta HTTP para informar ao navegador por quanto tempo o recurso deve ser armazenado em cache. Consulte Cabeçalhos de resposta: configure seu servidor da Web para saber mais.

Estratégias e casos de uso de armazenamento em cache HTTP

O cache HTTP é muito mais simples do que o cache de service worker, porque ele lida apenas com a lógica de expiração de recursos baseada em tempo (TTL). Consulte Quais valores de cabeçalho de resposta você deve usar? e Resumo para saber mais sobre estratégias de cache HTTP.

Como criar a lógica de expiração do cache

Nesta seção, explicamos os prós e contras de usar uma lógica de expiração consistente nas camadas de cache do service worker e HTTP, bem como os prós e contras de uma lógica de expiração separada nessas camadas.

Lógica de expiração consistente para todas as camadas de cache

Para demonstrar as vantagens e desvantagens, vamos analisar três cenários: longo, médio e curto prazo.

Cenários Armazenamento em cache de longa duração Armazenamento em cache de médio prazo Armazenamento em cache de curto prazo
Estratégia de armazenamento em cache do service worker Cache, voltando para a rede Stale-while-revalidate A rede está voltando ao cache
TTL do cache do service worker 30 dias 1 dia 10 min
Idade máxima do cache HTTP 30 dias 1 dia 10 min

Cenário: armazenamento em cache de longo prazo (cache, retorno à rede)

  • Quando um recurso em cache é válido (<= 30 dias): o service worker retorna o recurso em cache imediatamente sem acessar a rede.
  • Quando um recurso em cache expira (mais de 30 dias): o service worker vai para a rede para buscar o recurso. O navegador não tem uma cópia do recurso no cache HTTP. Portanto, ele vai para o lado do servidor para acessar o recurso.

Desvantagem: nesse cenário, o cache HTTP oferece menos valor porque o navegador sempre passa a solicitação para o lado do servidor quando o cache expira no service worker.

Cenário: armazenamento em cache de médio prazo (obsoleto enquanto revalida)

  • Quando um recurso armazenado em cache é válido (<= 1 dia): o service worker retorna o recurso armazenado em cache imediatamente e vai para a rede buscar o recurso. O navegador tem uma cópia do recurso no cache HTTP, então ele retorna essa cópia para o service worker.
  • Quando um recurso armazenado em cache expira (> 1 dia): o service worker retorna o recurso armazenado em cache imediatamente e vai para a rede buscar o recurso. O navegador não tem uma cópia do recurso no cache HTTP. Por isso, ele vai para o lado do servidor para buscar o recurso.

Desvantagem: o service worker exige mais limpeza de cache para substituir o cache HTTP e aproveitar ao máximo a etapa de "revalidação".

Cenário: armazenamento em cache de curto prazo (a rede volta ao cache)

  • Quando um recurso armazenado em cache é válido (<= 10 minutos): o service worker vai para a rede para buscar o recurso. O navegador tem uma cópia do recurso no cache HTTP e a retorna para o service worker sem acessar o lado do servidor.
  • Quando um recurso armazenado em cache expira (> 10 minutos): o service worker retorna o recurso armazenado em cache imediatamente e vai para a rede buscar o recurso. O navegador não tem uma cópia do recurso no cache HTTP. Por isso, ele vai para o lado do servidor para buscar o recurso.

Desvantagem: semelhante ao cenário de armazenamento em cache de médio prazo, o service worker exige uma lógica adicional de limpeza de cache para substituir o cache HTTP e buscar o recurso mais recente do lado do servidor.

Service worker em todos os cenários

Em todos os cenários, o cache do service worker ainda pode retornar recursos armazenados em cache quando a rede está instável. Por outro lado, o cache HTTP não é confiável quando a rede está instável ou inativa.

Lógica de expiração de cache diferente nas camadas de cache e HTTP do service worker

Para demonstrar os prós e contras, vamos analisar novamente os cenários de longo, médio e curto prazo.

Cenários Armazenamento em cache de longa duração Armazenamento em cache de médio prazo Armazenamento em cache de curto prazo
Estratégia de armazenamento em cache do service worker Cache, voltando para a rede Stale-while-revalidate A rede está voltando ao cache
TTL do cache do service worker 90 dias 30 dias 1 dia
Idade máxima do cache HTTP 30 dias 1 dia 10 min

Cenário: armazenamento em cache de longo prazo (cache, retorno à rede)

  • Quando um recurso armazenado em cache é válido no cache do service worker (<= 90 dias): o service worker retorna o recurso armazenado em cache imediatamente.
  • Quando um recurso armazenado em cache expira no cache do service worker (> 90 dias): o service worker vai para a rede buscar o recurso. O navegador não tem uma cópia do recurso no cache HTTP, então ele vai para o lado do servidor.

Prós e contras:

  • Pró: os usuários têm uma resposta instantânea porque o service worker retorna recursos armazenados em cache imediatamente.
  • Pró: o service worker tem um controle mais refinado de quando usar o cache e quando solicitar novas versões de recursos.
  • Desvantagem: é necessária uma estratégia de cache de service worker bem definida.

Cenário: armazenamento em cache de médio prazo (obsoleto durante a revalidação)

  • Quando um recurso em cache é válido no cache do service worker (<= 30 dias): o service worker retorna o recurso em cache imediatamente.
  • Quando um recurso armazenado em cache expira no cache do service worker (> 30 dias): o service worker vai para a rede em busca do recurso. O navegador não tem uma cópia do recurso no cache HTTP, então ele vai para o lado do servidor.

Prós e contras:

  • Pró: os usuários têm uma resposta instantânea porque o service worker retorna recursos armazenados em cache imediatamente.
  • Pró: o service worker pode garantir que a próxima solicitação de um determinado URL use uma resposta atualizada da rede, graças à revalidação que acontece "em segundo plano".
  • Desvantagem: é necessária uma estratégia de cache de service worker bem definida.

Cenário: armazenamento em cache de curto prazo (a rede volta ao cache)

  • Quando um recurso armazenado em cache é válido no cache do service worker (<= 1 dia): o service worker vai para a rede em busca do recurso. O navegador retorna o recurso do cache HTTP se ele estiver lá. Se a rede estiver inativa, o service worker vai retornar o recurso do cache do service worker.
  • Quando um recurso armazenado em cache expira no cache do service worker (> 1 dia): o service worker vai para a rede buscar o recurso. O navegador busca os recursos na rede quando a versão armazenada em cache no cache HTTP expira.

Prós e contras:

  • Pró: quando a rede está instável ou inativa, o service worker retorna recursos em cache imediatamente.
  • Desvantagem: o service worker exige mais limpeza de cache para substituir o cache HTTP e fazer solicitações "Network first".

Conclusão

Devido à complexidade da combinação de cenários de cache, não é possível criar uma regra que abranja todos os casos. No entanto, com base nas descobertas das seções anteriores, há algumas sugestões a serem consideradas ao criar suas estratégias de cache:

  • A lógica de cache do service worker não precisa ser consistente com a lógica de expiração do cache HTTP. Se possível, use uma lógica de expiração mais longa no service worker para conceder a ele mais controle.
  • O cache HTTP ainda é importante, mas não é confiável quando a rede está instável ou inativa.
  • Revise as estratégias de armazenamento em cache para cada recurso e verifique se a estratégia de armazenamento em cache do service worker oferece valor sem conflitar com o cache HTTP.

Saiba mais