Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.

View in English Always switch to English

Cache

Baseline
Weitgehend verfügbar

Diese Funktion ist gut etabliert und funktioniert auf vielen Geräten und in vielen Browserversionen. Sie ist seit April 2018 browserübergreifend verfügbar.

Sicherer Kontext: Diese Funktion ist nur in sicheren Kontexten (HTTPS) in einigen oder allen unterstützenden Browsern verfügbar.

Hinweis: Diese Funktion ist in Web Workers verfügbar.

Die Cache-Schnittstelle bietet einen dauerhaften Speichermechanismus für Paare aus Request- und Response-Objekten, die langfristig zwischengespeichert werden. Wie lange ein Cache-Objekt bestehen bleibt, hängt vom Browser ab. Skripte desselben Ursprungs können sich in der Regel jedoch darauf verlassen, dass ein zuvor befülltes Cache-Objekt noch vorhanden ist. Die Cache-Schnittstelle ist sowohl in Fensterkontexten als auch in Workern verfügbar. Sie müssen sie nicht zusammen mit Service Workern verwenden, obwohl sie in der Service-Worker-Spezifikation definiert ist.

Ein Ursprung kann mehrere benannte Cache-Objekte haben. Sie sind dafür verantwortlich, festzulegen, wie Ihr Skript (z. B. in einem ServiceWorker) Aktualisierungen des Cache handhabt. Einträge in einem Cache werden nur auf ausdrückliche Anforderung aktualisiert und laufen nicht ab, sofern sie nicht gelöscht werden. Verwenden Sie CacheStorage.open(), um ein bestimmtes benanntes Cache-Objekt zu öffnen, und rufen Sie anschließend die Methoden von Cache auf, um es zu verwalten.

Sie sind außerdem dafür verantwortlich, Cache-Einträge regelmäßig zu entfernen. Jeder Browser begrenzt die Menge an Cache-Speicher, die ein bestimmter Ursprung verwenden kann. Schätzungen zur Speichernutzung durch Cache sind über die Methode StorageManager.estimate() verfügbar. Der Browser versucht, den Speicherplatz zu verwalten, kann aber den Cache-Speicher eines Ursprungs löschen. In der Regel löscht er entweder alle Daten eines Ursprungs oder keine. Vergeben Sie für Caches daher versionsbezogene Namen und verwenden Sie sie nur mit der Version des Skripts, mit der sie sicher funktionieren. Weitere Informationen finden Sie unter Alte Caches löschen.

Hinweis: Der Algorithmus für den Schlüsselabgleich hängt vom VARY-Header im Wert ab. Um einen neuen Schlüssel abzugleichen, müssen daher sowohl der Schlüssel als auch der Wert der Einträge im Cache-Objekt betrachtet werden.

Hinweis: Die Caching-API berücksichtigt keine HTTP-Caching-Header.

Instanzmethoden

Cache.match()

Gibt ein Promise zurück, das mit der Antwort zur ersten übereinstimmenden Anfrage im Cache-Objekt erfüllt wird.

Cache.matchAll()

Gibt ein Promise zurück, das mit einem Array aller übereinstimmenden Antworten im Cache-Objekt erfüllt wird.

Cache.add()

Nimmt eine URL entgegen, ruft sie ab und fügt das resultierende Antwortobjekt dem angegebenen Cache hinzu. Dies entspricht funktional einem Aufruf von fetch(), gefolgt von put(), um das Ergebnis dem Cache hinzuzufügen.

Cache.addAll()

Nimmt ein Array von URLs entgegen, ruft sie ab und fügt die resultierenden Antwortobjekte dem angegebenen Cache hinzu.

Cache.put()

Nimmt eine Anfrage und die zugehörige Antwort entgegen und fügt sie dem angegebenen Cache hinzu.

Cache.delete()

Sucht den Cache-Eintrag, dessen Schlüssel der Anfrage entspricht, und gibt ein Promise zurück, das mit true erfüllt wird, wenn ein übereinstimmender Cache-Eintrag gefunden und gelöscht wurde. Wird kein Cache-Eintrag gefunden, wird das Promise mit false erfüllt.

Cache.keys()

Gibt ein Promise zurück, das mit einem Array von Cache-Schlüsseln erfüllt wird.

Beispiele

Dieser Codeausschnitt stammt aus dem Beispiel für selektives Caching mit einem Service Worker (siehe Live-Demo für selektives Caching). Der Code verwendet CacheStorage.open(), um ein Cache-Objekt zu öffnen, und verarbeitet Anfragen mit einem Content-Type-Header, der mit font/ beginnt.

Anschließend verwendet der Code Cache.match(), um zu prüfen, ob bereits eine passende Schriftart im Cache vorhanden ist. Falls ja, gibt er sie zurück. Andernfalls ruft der Code die Schriftart aus dem Netzwerk ab und speichert die abgerufene Ressource mit Cache.put() im Cache.

Der Code behandelt Ausnahmen, die beim Aufruf von fetch() ausgelöst werden. Beachten Sie, dass eine HTTP-Fehlerantwort (z. B. 404) keine Ausnahme auslöst. Stattdessen wird ein normales Antwortobjekt mit dem entsprechenden Fehlercode zurückgegeben.

Der Codeausschnitt zeigt außerdem eine bewährte Vorgehensweise zur Versionierung der vom Service Worker verwendeten Caches. Obwohl es in diesem Beispiel nur einen Cache gibt, lässt sich derselbe Ansatz für mehrere Caches verwenden. Dabei wird eine Kurzbezeichnung für einen Cache einem bestimmten, mit einer Versionsangabe versehenen Cache-Namen zugeordnet. Der Code löscht außerdem alle Caches, die nicht in CURRENT_CACHES aufgeführt sind.

Im Codebeispiel ist caches eine Eigenschaft von ServiceWorkerGlobalScope. Sie enthält das CacheStorage-Objekt, über das auf die CacheStorage-Schnittstelle zugegriffen werden kann.

Hinweis: Rufen Sie in Chrome chrome://inspect/#service-workers auf und klicken Sie unter dem registrierten Service Worker auf den Link „inspect“, um die Protokollmeldungen zu den verschiedenen Aktionen des Skripts service-worker.js anzusehen.

js
const CACHE_VERSION = 1;
const CURRENT_CACHES = {
  font: `font-cache-v${CACHE_VERSION}`,
};

self.addEventListener("activate", (event) => {
  // Delete all caches that aren't named in CURRENT_CACHES.
  // While there is only one cache in this example, the same logic
  // will handle the case where there are multiple versioned caches.
  const expectedCacheNamesSet = new Set(Object.values(CURRENT_CACHES));
  event.waitUntil(
    caches.keys().then((cacheNames) =>
      Promise.all(
        cacheNames.map((cacheName) => {
          if (!expectedCacheNamesSet.has(cacheName)) {
            // If this cache name isn't present in the set of
            // "expected" cache names, then delete it.
            console.log("Deleting out of date cache:", cacheName);
            return caches.delete(cacheName);
          }
          return undefined;
        }),
      ),
    ),
  );
});

self.addEventListener("fetch", (event) => {
  console.log("Handling fetch event for", event.request.url);

  event.respondWith(
    (async () => {
      try {
        const cache = await caches.open(CURRENT_CACHES.font);
        let response = await cache.match(event.request);

        if (response) {
          // If there is an entry in the cache for event.request,
          // then response will be defined and we can just return it.
          // Note that in this example, only font resources are cached.
          console.log(" Found response in cache:", response);

          return response;
        }

        // Otherwise, if there is no entry in the cache for event.request,
        // response will be undefined, and we need to fetch() the resource.
        console.log(
          " No response for %s found in cache. About to fetch " +
            "from network…",
          event.request.url,
        );

        // We call .clone() on the request since we might use it
        // in a call to cache.put() later on.
        // Both fetch() and cache.put() "consume" the request,
        // so we need to make a copy.
        // (see https://developer.mozilla.org/en-US/docs/Web/API/Request/clone)
        response = await fetch(event.request.clone());
        console.log(
          "  Response for %s from network is: %O",
          event.request.url,
          response,
        );

        if (
          response.status < 400 &&
          response.headers.has("content-type") &&
          response.headers.get("content-type").match(/^font\//i)
        ) {
          // This avoids caching responses that we know are errors
          // (i.e. HTTP status code of 4xx or 5xx).
          // We also only want to cache responses that correspond
          // to fonts, i.e. have a Content-Type response header that
          // starts with "font/".
          // Note that for opaque filtered responses
          // https://fetch.spec.whatwg.org/#concept-filtered-response-opaque
          // we can't access to the response headers, so this check will
          // always fail and the font won't be cached.
          // All of the Google Web Fonts are served from a domain that
          // supports CORS, so that isn't an issue here.
          // It is something to keep in mind if you're attempting
          // to cache other resources from a cross-origin
          // domain that doesn't support CORS, though!
          console.log("  Caching the response to", event.request.url);
          // We call .clone() on the response to save a copy of it
          // to the cache. By doing so, we get to keep the original
          // response object which we will return back to the controlled
          // page.
          // https://developer.mozilla.org/en-US/docs/Web/API/Request/clone
          cache.put(event.request, response.clone());
        } else {
          console.log("  Not caching the response to", event.request.url);
        }

        // Return the original response object, which will be used to
        // fulfill the resource request.
        return response;
      } catch (error) {
        // This catch block will handle exceptions that arise from the match()
        // or fetch() operations.
        // Note that an HTTP error response (e.g. 404) will NOT trigger
        // an exception.
        // It will return a normal response object that has the appropriate
        // error code set.
        console.error("  Error in fetch handler:", error);

        throw error;
      }
    })(),
  );
});

Cookies und Cache-Objekte

Die Fetch API verlangt, dass Set-Cookie-Header entfernt werden, bevor fetch() ein Response-Objekt zurückgibt. Eine in einem Cache gespeicherte Response enthält daher keine Set-Cookie-Header und bewirkt somit nicht, dass Cookies gespeichert werden.

Spezifikationen

Spezifikation
Service Workers Nightly
# cache-interface

Browser-Kompatibilität

Siehe auch