CacheQueryOptions arrive dans Chrome 54

Si vous utilisez l'API Cache Storage, que ce soit dans un service worker ou directement à partir d'applications Web via window.caches, sachez qu'à partir de Chrome 54, l'ensemble des CacheQueryOptions est compatible, ce qui vous permet de trouver plus facilement les réponses mises en cache que vous recherchez.

Quelles sont les options disponibles ?

Les options suivantes peuvent être définies dans n'importe quel appel de CacheStorage.match() ou Cache.match(). Si cette règle n'est pas configurée, elles sont toutes définies par défaut sur false (ou undefined pour cacheName). Vous pouvez utiliser plusieurs options lors d'un même appel à match().

ignoreSearch

Ce champ indique à l'algorithme de correspondance d'ignorer la partie search d'une URL (également appelée "paramètres de requête d'URL"). Cela peut s'avérer utile lorsque vous disposez d'une URL source contenant des paramètres de requête utilisés, par exemple, pour le suivi de l'analyse, mais qui ne sont pas significatifs en termes d'identification unique d'une ressource dans le cache. Par exemple, de nombreuses personnes sont tombées la proie du service worker suivant :

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)
    );
  }
});

Ce type de code fonctionne comme prévu lorsqu'un utilisateur accède directement à index.html. Que se passe-t-il si votre application Web utilise un fournisseur de solutions d'analyse pour suivre les liens entrants et que l'utilisateur accède à index.html?utm_source=some-referral ? Par défaut, transmettre index.html?utm_source=some-referral à caches.match() ne renvoie pas l'entrée pour index.html. Toutefois, si ignoreSearch est défini sur true, vous pouvez récupérer la réponse mise en cache attendue, quels que soient les paramètres de requête définis:

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

cacheName

cacheName s'avère pratique lorsque vous avez plusieurs caches et que vous souhaitez qu'une réponse soit stockée dans un cache spécifique. Elle peut améliorer l'efficacité de vos requêtes (car le navigateur ne doit vérifier qu'un seul cache, et non tous les caches) et vous permet de récupérer une réponse spécifique pour une URL donnée lorsque plusieurs caches peuvent avoir cette URL comme clé. cacheName n'a d'effet que lorsqu'il est utilisé avec CacheStorage.match(), pas avec Cache.match(), car Cache.match() fonctionne déjà sur un seul élément mis en cache nommé.

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

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

ignoreMethod et ignoreVary

ignoreMethod et ignoreVary sont un peu plus spécifiques que ignoreSearch et cacheName, mais ils servent des objectifs spécifiques.

ignoreMethod vous permet de transmettre un objet Request ayant n'importe quel method (POST, PUT, etc.) comme premier paramètre à match(). Normalement, seules les requêtes GET ou HEAD sont autorisées.

// 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});

Si la valeur est true, ignoreVary signifie que les recherches dans le cache seront effectuées sans tenir compte des en-têtes Vary définis dans les réponses mises en cache. Si vous savez que vous ne traitez pas de réponses mises en cache qui utilisent l'en-tête "Vary", vous n'avez pas à vous soucier de définir cette option.

Prise en charge des navigateurs

CacheQueryOptions n'est pertinent que dans les navigateurs compatibles avec l'API Cache Storage. Hormis Chrome et les navigateurs basés sur Chromium, cela se limite actuellement à Firefox, qui est déjà nativement compatible avec CacheQueryOptions.

Les développeurs qui souhaitent utiliser CacheQueryOptions dans des versions de Chrome antérieures à la version 54 peuvent utiliser un polyfill, grâce à Arthur Stolyar.