Start · Sprachen · JavaScript · Referenz · ServiceWorkerRegistration.navigationPreload

ServiceWorkerRegistration.navigationPreload

Eigenschaft

Liefert den <code>NavigationPreloadManager</code> der Service-Worker-Registrierung. Damit steuert man das Vorabladen von Navigationsanfragen.

seit JavaScript Baseline 2022: Chrome 59+, Edge 18+, Firefox 99+, Kategorie: webapi

Signatur

get ServiceWorkerRegistration.navigationPreload

Beschreibung

Die schreibgeschützte Eigenschaft navigationPreload gibt das NavigationPreloadManager-Objekt der aktuellen Registrierung zurück. Mit diesem Objekt schaltet man Navigation Preload ein oder aus und setzt den Wert des HTTP-Headers Service-Worker-Navigation-Preload.

Navigation Preload löst ein Leistungsproblem: Wenn ein Service Worker erst gestartet werden muss, verzögert sich jede Navigationsanfrage, bis der fetch-Handler läuft. Mit Preload startet der Browser die Netzwerkanfrage parallel zum Start des Service Workers. Im fetch-Handler bekommt man die Antwort dann über event.preloadResponse.

Meist aktiviert man Preload im activate-Event des Service Workers mit self.registration.navigationPreload.enable(). Man kann die Eigenschaft aber auch in der Seite abfragen, zum Beispiel über navigator.serviceWorker.ready. Sinnvoll ist Preload vor allem dann, wenn der Service Worker Navigationen ohnehin meistens über das Netzwerk beantwortet (Network-first).

Rückgabewert

Typ
NavigationPreloadManager
Beschreibung
Der NavigationPreloadManager dieser Registrierung. Er bietet die Methoden enable(), disable(), setHeaderValue() und getState(), die alle ein Promise zurückgeben.

Beispiele

Preload im activate-Event aktivieren (sw.js)

// sw.js
self.addEventListener('activate', (event) => {
  event.waitUntil((async () => {
    // Feature-Erkennung: nicht jeder Browser unterstützt Preload
    if (self.registration.navigationPreload) {
      await self.registration.navigationPreload.enable();
      console.log('Navigation Preload aktiviert');
    }
  })());
});
Navigation Preload aktiviert

preloadResponse im fetch-Handler verwenden

// sw.js
self.addEventListener('fetch', (event) => {
  if (event.request.mode !== 'navigate') return;

  event.respondWith((async () => {
    try {
      // Vorab geladene Antwort nutzen, falls vorhanden
      const preloaded = await event.preloadResponse;
      if (preloaded) return preloaded;

      return await fetch(event.request);
    } catch (err) {
      // Offline-Rückfall aus dem Cache
      const cache = await caches.open('offline-v1');
      return (await cache.match('/offline.html')) ?? Response.error();
    }
  })());
});

Status aus der Seite abfragen und eigenen Header setzen

// main.js (Seitenkontext)
const checkPreload = async () => {
  const registration = await navigator.serviceWorker.ready;
  const manager = registration.navigationPreload;

  if (!manager) {
    console.log('Navigation Preload nicht unterstützt');
    return;
  }

  // Der Server kann diesen Header auswerten und z. B. nur Inhalte liefern
  await manager.setHeaderValue('content-only');
  const state = await manager.getState();
  console.log(state);
};

checkPreload();
{ enabled: true, headerValue: "content-only" }

// Wichtig · Fallstricke

  • Feature-Erkennung: Ältere Browser (Firefox vor 99, Safari vor 15.4) kennen die Eigenschaft nicht, dort ist sie undefined. Deshalb vor der Nutzung immer mit if (registration.navigationPreload) prüfen.
  • preloadResponse nicht ignorieren: Ist Preload aktiv, fragt der Browser das Netzwerk in jedem Fall an. Wenn der fetch-Handler event.preloadResponse nicht verwendet, wird die Anfrage doppelt gesendet. Dann zeigt Chrome eine Warnung in der Konsole an.
  • enable() und disable() funktionieren nur mit einem aktiven Service Worker. Deshalb ruft man sie am besten in activate auf und bindet sie mit event.waitUntil() ein.
  • Preload gilt nur für Navigationsanfragen (request.mode === 'navigate'), nicht für Unterressourcen wie Bilder oder Skripte.
  • Der Server bekommt standardmäßig den Header Service-Worker-Navigation-Preload: true. Wenn die Antwort je nach Header unterschiedlich ausfällt, sollte er Vary: Service-Worker-Navigation-Preload setzen, damit keine falschen Antworten aus dem Cache kommen.
  • Die Eigenschaft ist nur in sicheren Kontexten (HTTPS oder localhost) verfügbar.