Signatur
Beschreibung
Mit new FetchEvent() erzeugen Sie von Hand ein FetchEvent. Normalerweise legt der Browser diese Events selbst an und sendet sie an den fetch-Handler des Service Workers, sobald eine kontrollierte Seite eine Netzwerkanfrage stellt. Den Konstruktor brauchen Sie deshalb nur in Sonderfällen.
Typische Einsatzgebiete sind Unit-Tests für die Fetch-Logik eines Service Workers, das Simulieren von Anfragen (etwa zum Vorwärmen eines Caches über die gleiche Handler-Logik) und das Aufrufen eigener Routing-Funktionen, die ein FetchEvent als Eingabe erwarten.
Der Konstruktor ist nur im globalen Bereich eines Service Workers (ServiceWorkerGlobalScope) verfügbar, nicht im Fenster oder in normalen Web Workern. Das Pflichtfeld request im Options-Objekt muss ein Request-Objekt sein. Selbst erzeugte Events haben isTrusted === false. Eine Antwort über respondWith() hat bei ihnen keinen Einfluss auf echte Netzwerkanfragen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $type Pflicht | string | Name des Events, in der Praxis immer "fetch". |
|
| $options Pflicht | FetchEventInit | Objekt mit den Event-Eigenschaften. Zusätzlich zu den EventInit-Feldern (bubbles, cancelable, composed) gibt es diese Felder:
|
Rückgabewert
FetchEvent-Objekt mit den übergebenen Eigenschaften.Beispiele
Einfaches FetchEvent erzeugen und auslesen
// Im Service Worker (sw.js)
const request = new Request('/api/produkte', { method: 'GET' });
const event = new FetchEvent('fetch', {
request,
clientId: 'test-client-1'
});
console.log(event.type);
console.log(event.request.url);
console.log(event.clientId);
console.log(event.isTrusted);
Routing-Logik testen, ohne das Netzwerk zu nutzen
// Handler-Logik als eigene Funktion, damit sie testbar ist
const handleFetch = (event) => {
const url = new URL(event.request.url);
if (url.pathname.startsWith('/api/')) return 'netzwerk-zuerst';
if (/\.(css|js|png)$/.test(url.pathname)) return 'cache-zuerst';
return 'standard';
};
self.addEventListener('fetch', (event) => {
// Echter Einsatz: Strategie auswerten und respondWith() aufrufen
console.log('Strategie:', handleFetch(event));
});
// Kleiner Selbsttest
const testFaelle = ['/api/user', '/styles/main.css', '/kontakt'];
for (const pfad of testFaelle) {
const ev = new FetchEvent('fetch', { request: new Request(pfad) });
console.log(pfad, '→', handleFetch(ev));
}
Synthetisches Event an den eigenen Listener senden
self.addEventListener('fetch', (event) => {
console.log('Listener erhalten:', event.request.url, 'vertrauenswürdig:', event.isTrusted);
});
self.addEventListener('activate', (event) => {
// Handler einmal mit einer Testanfrage anstoßen
const testEvent = new FetchEvent('fetch', {
request: new Request('/offline.html'),
cancelable: true
});
self.dispatchEvent(testEvent);
});
// Wichtig · Fallstricke
- Nur im Service Worker: Außerhalb von
ServiceWorkerGlobalScopeistFetchEventnicht definiert. Aufrufe im Fenster erzeugen einenReferenceError. requestist Pflicht: Ohnerequestoder mit einem Wert, der keinRequestist, wirft der Konstruktor einenTypeError.- Keine echte Netzwerkwirkung: Selbst erzeugte Events sind nicht vertrauenswürdig (
isTrusted === false).respondWith()ist nur während des synchronen Dispatches erlaubt, sonst kommt einInvalidStateError. Eine echte Seitenanfrage beantwortet es nie. isReloadist veraltet und wird nicht von allen Browsern unterstützt.preloadResponseundhandledfehlen in älteren Browserversionen möglicherweise.- Service Worker laufen nur in sicheren Kontexten (HTTPS oder
localhost).