Signatur
Beschreibung
Mit Cache.keys() fragt man ab, welche Anfragen in einem bestimmten Cache gespeichert sind. Jeder Eintrag eines Caches besteht aus einem Paar aus Request (Schlüssel) und Response (Wert). Die Methode liefert nur die Schlüssel, die Antworten selbst nicht.
Ohne Argument gibt die Methode alle Schlüssel des Caches zurück. Übergibt man eine Anfrage oder eine URL, erhält man nur die passenden Einträge. Mit dem Parameter options lässt sich der Abgleich lockern, etwa indem man den Query-String, die HTTP-Methode oder den Vary-Header ignoriert.
Typische Einsatzfälle sind:
- Aufräumen veralteter Einträge in einem Service Worker
- Größe eines Caches begrenzen (z. B. nur die neuesten N Einträge behalten)
- Debugging und Werkzeuge, die den Cache-Inhalt anzeigen
Die Reihenfolge der zurückgegebenen Schlüssel entspricht laut Spezifikation der Reihenfolge, in der die Einträge eingefügt wurden. Das ist praktisch für einfache FIFO-Strategien.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $request | Request | string | URL | Optional. Die Anfrage, nach der gefiltert werden soll. Das kann ein Request-Objekt oder eine URL sein. Fehlt der Parameter, werden alle Schlüssel zurückgegeben. |
|
| $options | object | {} | Optional. Objekt, das den Abgleich steuert. Es gibt folgende Eigenschaften:
|
Rückgabewert
Request-Objekten erfüllt wird. Das Array ist leer, wenn der Cache leer ist oder kein Eintrag passt.Beispiele
Alle gecachten URLs auflisten
const listCachedUrls = async (cacheName) => {
const cache = await caches.open(cacheName);
const requests = await cache.keys();
return requests.map((req) => req.url);
};
listCachedUrls('static-v1').then((urls) => console.log(urls));
Cache auf die neuesten 50 Einträge begrenzen (Service Worker)
const trimCache = async (cacheName, maxItems) => {
const cache = await caches.open(cacheName);
const keys = await cache.keys();
// Die Reihenfolge entspricht der Einfügereihenfolge, die ältesten stehen also vorne
const excess = keys.length - maxItems;
if (excess <= 0) return 0;
await Promise.all(keys.slice(0, excess).map((req) => cache.delete(req)));
return excess;
};
self.addEventListener('fetch', (event) => {
if (event.request.destination === 'image') {
event.waitUntil(trimCache('images', 50));
}
});
Alle Varianten einer URL unabhängig vom Query-String finden und löschen
const purgeVariants = async (url) => {
const cache = await caches.open('api-cache');
const matches = await cache.keys(url, { ignoreSearch: true });
console.log(`${matches.length} Varianten gefunden`);
await Promise.all(matches.map((req) => cache.delete(req)));
};
purgeVariants('/api/products');
// Wichtig · Fallstricke
- Nur in sicheren Kontexten: Die Cache API steht nur unter HTTPS (oder
localhost) zur Verfügung. Sie ist in Fenstern, Web Workern und Service Workern nutzbar. In privaten Fenstern mancher Browser (z. B. älteren Firefox-Versionen) kanncachesfehlen oder einen Fehler werfen. - Performance:
keys()ohne Filter erzeugt für jeden Eintrag einRequest-Objekt. Bei sehr großen Caches kann das spürbar Speicher und Zeit kosten. Wo es möglich ist, sollte man daher mitrequestfiltern. - Nur Schlüssel: Die Methode liefert keine
Response-Objekte. Für die Antworten braucht manCache.match()oderCache.matchAll(). - Methoden-Abgleich: Ohne
ignoreMethod: truepassen nurGET- undHEAD-Anfragen. Übergibt man z. B. einenPOST-Request, erhält man ein leeres Array. - Vary-Header: Einträge mit
Vary-Header passen unter Umständen nicht, wenn sich die Header der Anfrage unterscheiden. MitignoreVary: truelässt sich das umgehen. - Die Reihenfolge nach Einfügezeitpunkt ist in der Spezifikation festgelegt. Sehr alte Browser-Implementierungen haben sie aber nicht immer garantiert.