Signatur
Beschreibung
Ein ServiceWorkerRegistration-Objekt entsteht, wenn eine Seite mit navigator.serviceWorker.register() einen Service Worker anmeldet. Es verbindet ein Service-Worker-Skript mit einem Scope (URL-Präfix) und verwaltet die Lebenszyklus-Zustände des Workers über die Eigenschaften installing, waiting und active.
Wichtige Eigenschaften und Methoden:
scope– der URL-Bereich, den der Service Worker kontrolliert.installing,waiting,active– die jeweiligenServiceWorker-Instanzen odernull.updateViaCache– steuert, ob der HTTP-Cache beim Update-Check verwendet wird ("imports","all","none").navigationPreload– liefert einenNavigationPreloadManager.pushManager– Zugang zur Push API (PushManager).update()– prüft manuell auf eine neue Version des Worker-Skripts.unregister()– hebt die Registrierung auf.showNotification()/getNotifications()– zeigt bzw. liest System-Benachrichtigungen.- Event
updatefound– feuert, sobald ein neuer Worker installiert wird (onupdatefound).
Man verwendet das Interface typischerweise, um Updates zu erkennen und dem Nutzer „Neue Version verfügbar“ anzuzeigen, um Push-Abonnements anzulegen oder um Benachrichtigungen aus dem Hauptthread bzw. dem Worker (self.registration) heraus anzuzeigen.
Rückgabewert
navigator.serviceWorker.register(), navigator.serviceWorker.ready, getRegistration() bzw. getRegistrations() als Promise-Wert geliefert.Beispiele
Service Worker registrieren und Registrierung inspizieren
const registerSW = async () => {
if (!('serviceWorker' in navigator)) return;
try {
const registration = await navigator.serviceWorker.register('/sw.js', { scope: '/' });
console.log('Scope:', registration.scope);
const state = registration.installing ? 'installing'
: registration.waiting ? 'waiting'
: registration.active ? 'active' : 'unbekannt';
console.log('Zustand:', state);
} catch (err) {
console.error('Registrierung fehlgeschlagen:', err);
}
};
registerSW();
Neue Version erkennen (updatefound) und aktivieren
const registration = await navigator.serviceWorker.register('/sw.js');
registration.addEventListener('updatefound', () => {
const newWorker = registration.installing;
newWorker.addEventListener('statechange', () => {
// Installiert + bereits ein Controller vorhanden = echtes Update
if (newWorker.state === 'installed' && navigator.serviceWorker.controller) {
if (confirm('Neue Version verfügbar. Jetzt neu laden?')) {
newWorker.postMessage({ type: 'SKIP_WAITING' });
}
}
});
});
navigator.serviceWorker.addEventListener('controllerchange', () => location.reload());
// Zusätzlich stündlich manuell nach Updates suchen
setInterval(() => registration.update(), 60 * 60 * 1000);
Benachrichtigung über die Registrierung anzeigen
const notify = async () => {
const permission = await Notification.requestPermission();
if (permission !== 'granted') return;
const registration = await navigator.serviceWorker.ready;
await registration.showNotification('Bestellung versendet', {
body: 'Ihr Paket ist unterwegs.',
icon: '/icons/paket.png',
tag: 'bestellung-4711'
});
const list = await registration.getNotifications({ tag: 'bestellung-4711' });
console.log('Offene Benachrichtigungen:', list.length);
};
notify();
Alle Registrierungen entfernen (z. B. beim Debuggen)
const registrations = await navigator.serviceWorker.getRegistrations();
const results = await Promise.all(registrations.map((reg) => reg.unregister()));
console.log(`${results.filter(Boolean).length} Service Worker abgemeldet`);
// Wichtig · Fallstricke
- Sicherer Kontext: Service Worker funktionieren nur über HTTPS (Ausnahme:
localhost). In privaten Fenstern mancher Browser (z. B. Firefox) istnavigator.serviceWorkerggf. nicht verfügbar – immer per Feature-Detection prüfen. - Scope-Beschränkung: Der Scope darf standardmäßig nicht oberhalb des Skript-Pfads liegen. Für einen breiteren Scope muss der Server den Header
Service-Worker-Allowedsenden. - Wartender Worker: Ein neuer Worker bleibt in
waiting, bis alle kontrollierten Tabs geschlossen sind – außer der Worker ruftself.skipWaiting()auf. UnbedachtesskipWaiting()kann laufende Seiten mit inkompatiblen Cache-Ständen versorgen. unregister()wirkt erst, wenn keine Clients mehr kontrolliert werden; bestehende Caches (CacheStorage) werden nicht automatisch gelöscht.showNotification()erfordert eine erteilte Benachrichtigungsberechtigung und wirft sonst einenTypeError. Auf iOS/Safari sind Push und Benachrichtigungen erst ab 16.4 und nur für zum Home-Bildschirm hinzugefügte Web-Apps verfügbar.- Die Eigenschaften
sync,periodicSync,backgroundFetchundindexsind nicht standardübergreifend verfügbar (meist nur Chromium).