CacheQueryOptions Chega ao Chrome 54

Se você usa a API Cache Storage em um service worker ou diretamente em apps da Web pelo window.caches, temos boas notícias: a partir do Chrome 54, o conjunto completo de CacheQueryOptions tem suporte, facilitando a localização das respostas em cache que você procura.

Quais opções estão disponíveis?

As opções a seguir podem ser definidas em qualquer chamada para CacheStorage.match() ou Cache.match(). Quando não definido, o padrão é false (ou undefined para cacheName), e é possível usar várias opções em uma única chamada para match().

ignoreSearch

Isso instrui o algoritmo de correspondência a ignorar a parte pesquisa de um URL, também conhecida como parâmetros de consulta do URL. Isso pode ser útil quando você tem um URL de origem que contém parâmetros de consulta usados, por exemplo, para o acompanhamento de análises, mas que não são importantes para identificar exclusivamente um recurso no cache. Por exemplo, muitas pessoas caíram na armadilha do seguinte worker de serviço:

self.addEventListener('install', event => {
  event.waitUntil(
    caches.open('my-cache')
      .then(cache => cache.add('index.html'))
  );
});

self.addEventListener('fetch', event => {
  // Make sure this is a navigation request before responding.
  if (event.request.mode === 'navigation') {
    event.respondWith(
      caches.match(event.request) || fetch(event.request)
    );
  }
});

Esse tipo de código funciona como esperado quando um usuário navega diretamente para index.html, mas e se o app da Web usar um provedor de análise para acompanhar os links de entrada e o usuário navegar para index.html?utm_source=some-referral? Por padrão, transmitir index.html?utm_source=some-referral para caches.match() não retorna a entrada para index.html. No entanto, se ignoreSearch estiver definido como true, será possível recuperar a resposta em cache esperada, independentemente dos parâmetros de consulta definidos:

caches.match(event.request, {ignoreSearch: true})

cacheName

O cacheName é útil quando você tem vários caches e quer uma resposta armazenada em um cache específico. Usá-la pode tornar suas consultas mais eficientes (já que o navegador só precisa verificar dentro de um cache, em vez de todos eles) e permite que você recupere uma resposta específica para um determinado URL quando vários caches podem ter esse URL como chave. O cacheName só tem efeito quando usado com CacheStorage.match(), não Cache.match(), porque o Cache.match() já opera em um único cache nomeado.

// The following are functionally equivalent:
caches.open('my-cache')
  .then(cache => cache.match('index.html'));

// or...
caches.match('index.html', {cacheName: 'my-cache'});

ignoreMethod e ignoreVary

ignoreMethod e ignoreVary são um pouco mais específicos que ignoreSearch e cacheName, mas servem a propósitos específicos.

ignoreMethod permite transmitir um objeto Request que tenha qualquer method (POST, PUT etc.) como o primeiro parâmetro para match(). Normalmente, apenas solicitações GET ou HEAD são permitidas.

// In a more realistic scenario, postRequest might come from
// the request property of a FetchEvent.
const postRequest = new Request('index.html', {method: 'post'});

// This will never match anything.
caches.match(postRequest);

// This will match index.html in any cache.
caches.match(postRequest, {ignoreMethod: true});

Se definido como true, ignoreVary significa que as pesquisas de cache vão ser feitas sem considerar os cabeçalhos Vary definidos nas respostas em cache. Se você souber que não está lidando com respostas em cache que usam o cabeçalho Vary, não precisa se preocupar em definir essa opção.

Suporte ao navegador

CacheQueryOptions só é relevante em navegadores compatíveis com a API Cache Storage. Além dos navegadores baseados no Chrome e no Chromium, isso está atualmente limitado ao Firefox, que já oferece suporte nativo a CacheQueryOptions.

Os desenvolvedores que quiserem usar o CacheQueryOptions em versões do Chrome anteriores à 54 podem usar um polyfill, cortesia de Arthur Stolyar (em inglês).