Jeśli używasz interfejsu Cache Storage API w ramach usługi workera lub bezpośrednio z aplikacji internetowych za pomocą window.caches, mamy dobrą wiadomość: od wersji Chrome 54 obsługiwany jest pełny zestaw CacheQueryOptions, co ułatwia znajdowanie poszukiwanych odpowiedzi z poziomu pamięci podręcznej.
Jakie opcje są dostępne?
Te opcje można ustawić w dowolnym wywołaniu CacheStorage.match() lub Cache.match(). Jeśli nie są ustawione, domyślnie mają wartość false (lub undefined w przypadku cacheName). W jednym wywołaniu funkcji match() możesz użyć wielu opcji.
ignoreSearch
To polecenie instruuje algorytm dopasowywania, aby zignorować część adresu URL dotyczącą wyszukiwania, czyli parametry zapytania w adresie URL. Może to być przydatne, gdy masz adres URL źródłowy, który zawiera parametry zapytania używane np. do śledzenia w Analytics, ale nie mają one znaczenia dla jednoznacznego identyfikowania zasobu w pamięci podręcznej. Na przykład wiele osób padło ofiarą tego „chwytu” w ramach usługi workera:
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)
    );
  }
});
Ten kod działa zgodnie z oczekiwaniami, gdy użytkownik przechodzi bezpośrednio do index.html, ale co się stanie, jeśli Twoja aplikacja internetowa korzysta z usługi analitycznej do śledzenia linków przychodzących, a użytkownik przechodzi do index.html?utm_source=some-referral? Domyślnie przekazanie wartości index.html?utm_source=some-referral do funkcji caches.match() nie spowoduje zwrócenia wpisu index.html. Jeśli jednak ignoreSearch ma wartość true, możesz pobrać oczekiwaną odpowiedź z poziomu pamięci podręcznej niezależnie od ustawień parametrów zapytania:
caches.match(event.request, {ignoreSearch: true})
cacheName
cacheName jest przydatna, gdy masz wiele pamięci podręcznych i chcesz uzyskać odpowiedź z konkretnej pamięci podręcznej. Dzięki temu zapytania będą bardziej wydajne (ponieważ przeglądarka musi sprawdzić tylko jedno miejsce w pamięci podręcznej zamiast wszystkich) i będzie można pobrać konkretną odpowiedź na dany adres URL, gdy wiele pamięci podręcznych może mieć ten adres jako klucz. Tag cacheName ma zastosowanie tylko wtedy, gdy jest używany z tagiem CacheStorage.match(), a nie Cache.match(), ponieważ tag Cache.match() działa już na podstawie pojedynczego tagu o nazwie w pamięci podręcznej.
// The following are functionally equivalent:
caches.open('my-cache')
  .then(cache => cache.match('index.html'));
// or...
caches.match('index.html', {cacheName: 'my-cache'});
ignoreMethod i ignoreVary
ignoreMethod i ignoreVary są nieco bardziej niszowe niż ignoreSearch i cacheName, ale służą do określonych celów.
ignoreMethod umożliwia przekazanie jako pierwszego parametru obiektu Request, który ma dowolny parametr method (POST, PUT itp.).match() Zwykle dozwolone są tylko żądania GET lub HEAD.
// 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});
Jeśli ma wartość true, ignoreVary oznacza, że wyszukiwania w pamięci podręcznej będą wykonywane bez uwzględniania żadnych Vary nagłówków ustawionych w odpowiedziach z pamięci podręcznej. Jeśli wiesz, że nie masz do czynienia z odpowiadami z buforu, które używają nagłówka Vary, nie musisz się martwić ustawianiem tej opcji.
Obsługa przeglądarek
CacheQueryOptions ma znaczenie tylko w przypadku przeglądarek, które obsługują interfejs Cache Storage API. Poza przeglądarkami Chrome i Chromium jest ona obecnie ograniczona do przeglądarki Firefox, która obsługuje już domyślnie CacheQueryOptions.
Deweloperzy, którzy chcą używać CacheQueryOptions w wersjach Chrome starszych niż 54, mogą skorzystać z polyfilla autorstwa Arthura Stolyara.