FetchEvent: respondWith() Methode
Baseline
Widely available
*
This feature is well established and works across many devices and browser versions. It’s been available across browsers since April 2018.
* Some parts of this feature may have varying levels of support.
Hinweis: Diese Funktion ist nur in Service Workers verfügbar.
Die respondWith() Methode von FetchEvent verhindert die standardmäßige Fetch-Verarbeitung des Browsers und ermöglicht es Ihnen, selbst ein Versprechen für eine Response bereitzustellen.
In den meisten Fällen können Sie jede Antwort bereitstellen, die der Empfänger versteht. Wenn beispielsweise ein <img> die Anfrage initiiert, muss der Antwortinhalt Bilddaten sein. Aus Sicherheitsgründen gibt es einige globale Regeln:
- Sie können nur
ResponseObjekte vomtype"opaque"zurückgeben, wenn das ObjektfetchEvent.requestdenmode"no-cors"hat. Dies verhindert das Auffinden privater Daten. - Sie können nur
ResponseObjekte vomtype"opaqueredirect"zurückgeben, wenn das ObjektfetchEvent.requestdenmode"manual"hat. - Sie können keine
ResponseObjekte vomtype"cors"zurückgeben, wenn das ObjektfetchEvent.requestdenmode"same-origin"hat.
Syntax
respondWith(response)
Parameter
Rückgabewert
Keiner (undefined).
Ausnahmen
NetworkErrorDOMException-
Wird zurückgegeben, wenn ein Netzwerkfehler bei bestimmten Kombinationen von
FetchEvent.request.modeundResponse.typeWerten ausgelöst wird, wie in den oben angeführten "globalen Regeln" angedeutet. InvalidStateErrorDOMException-
Wird zurückgegeben, wenn das Ereignis noch nicht gesendet wurde oder
respondWith()bereits aufgerufen wurde.
Beschreibung
>Festlegen der endgültigen URL einer Ressource
Seit Firefox 59 wird, wenn ein Service Worker eine Response an FetchEvent.respondWith() liefert, der Wert Response.url an die abgefangene Netzwerk-Anfrage als endgültige aufgelöste URL weitergegeben. Wenn der Wert Response.url der leere String ist, wird die FetchEvent.request.url als endgültige URL verwendet.
In der Vergangenheit wurde die FetchEvent.request.url in allen Fällen als endgültige URL verwendet. Die bereitgestellte Response.url wurde effektiv ignoriert.
Dies bedeutet beispielsweise, wenn ein Service Worker ein Stylesheet oder ein Worker-Skript abfängt, dann wird die bereitgestellte Response.url verwendet, um alle relativen @import oder importScripts() Subressource-Ladevorgänge zu lösen (Firefox Bug 1222008).
Für die meisten Arten von Netzwerk-Anfragen hat diese Änderung keine Auswirkungen, da Sie die endgültige URL nicht beobachten können. Es gibt jedoch einige, bei denen das wichtig ist:
- Wenn ein
fetch()abgefangen wird, können Sie die endgültige URL im Ergebnis derResponse.urlbeobachten. - Wenn ein Worker Skript abgefangen wird, wird die endgültige URL verwendet, um
self.locationund als Basis-URL für relative URLs im Worker-Skript festzulegen. - Wenn ein Stylesheet abgefangen wird, wird die endgültige URL als Basis-URL verwendet, um relative
@importLadevorgänge zu lösen.
Beachten Sie, dass Navigationsanfragen für Windows und iframes die endgültige URL NICHT verwenden. Die Art und Weise, wie die HTML-Spezifikation Umleitungen für Navigationen behandelt, verwendet letztendlich die Anforderungs-URL für das resultierende Window.location. Dies bedeutet, dass Websites weiterhin eine "alternative" Ansicht einer Webseite bereitstellen können, wenn sie offline ist, ohne die für den Benutzer sichtbare URL zu ändern.
Beispiele
Dieses Fetch-Ereignis versucht, eine Antwort von der Cache API zurückzugeben und fällt andernfalls auf das Netzwerk zurück.
addEventListener("fetch", (event) => {
// Prevent the default, and handle the request ourselves.
event.respondWith(
(async () => {
// Try to get the response from a cache.
const cachedResponse = await caches.match(event.request);
// Return it if we found one.
if (cachedResponse) return cachedResponse;
// If we didn't find a match in the cache, use the network.
return fetch(event.request);
})(),
);
});
Hinweis:
caches.match() ist eine
Komfortmethode. Die gleichwertige Funktionalität besteht darin,
cache.match() für jeden Cache (in der von
caches.keys() zurückgegebenen Reihenfolge) aufzurufen, bis eine
Response zurückgegeben wird.
Spezifikationen
| Specification |
|---|
| Service Workers Nightly> # fetch-event-respondwith> |