Veröffentlicht am 31. Juli 2025
Ab Chrome 139 können Sie am neuen Ursprungstest für Shared Workers mit verlängerter Lebensdauer teilnehmen. Mit dem Test wird eine neue extendedLifetime: true
-Option hinzugefügt, mit der Shared Workers über das letzte Entladen des Dokuments hinaus aktiv bleiben können.
Anwendungsfall für die Funktion „Verlängerte Lebensdauer“
Viele Websites möchten bestimmte Aktionen ausführen, wenn der Nutzer die Seite verlässt. Beispiele hierfür sind das Schreiben in den Speicher oder das Senden von Daten zurück an Server, um den Status zu speichern oder Analysen aufzuzeichnen.
Die Webplattform bietet einige APIs für einfachere Anwendungsfälle, aber jede hat Einschränkungen:
- Synchrone JavaScript-APIs wie
localStorage
-Schreibvorgänge werden vollständig ausgeführt, bevor die aktuelle Seite entladen wird. - Das
fetch API
bietet eine Reihe von Optionen wiekeepalive
und seit KurzemfetchLater
, mit denen Anfragen für einen kurzen Zeitraum nach dem Entladen des Dokuments gesendet werden können.
Diese decken jedoch nur synchrone Vorgänge ab, mit Ausnahme der letzten fetch
-Anfrage. Sie erlauben nicht die Verwendung asynchroner APIs wie IndexedDB, Compression Streams oder Web Crypto zum Hashen oder Verschlüsseln. Viele APIs, insbesondere neuere, sind asynchron, um den Hauptthread nicht zu blockieren. Daher ist es einschränkend, wenn diese APIs nicht beim Entladen verwendet werden können.
Alternativ können Sie Service Worker verwenden, die außerhalb der Lebenszyklen einzelner Seiten existieren. Dies ist jedoch eine eher aufwendige Lösung mit komplexeren Anforderungen an den Lebenszyklus und die Verwaltung für Entwickler sowie zusätzlichen Prozess- und Speicheranforderungen für Nutzer. Außerdem entspricht es nicht dem Hauptanwendungsfall von Service Workern (als Proxy für Netzwerkanfragen zu fungieren). Die Verwendung von Service Workern nur für den Anwendungsfall, dass bei Seitenentladung bestimmte Aufgaben ausgeführt werden, scheint übertrieben.
Vorgeschlagene Lösung
Die SharedWorker API ist eine schlankere API, mit der Aufgaben vom Hauptthread ausgelagert werden können. Sie sind jedoch derzeit nicht länger als die Lebensdauer des Ursprungs (wenn die letzte Seite für diesen Ursprung entladen wird) verfügbar. In Chrome soll eine neue Option für die SharedWorker API hinzugefügt werden, mit der Shared Workers für kurze Zeit über die Zerstörung von Dokumenten hinaus aktiv bleiben können.
Der HTML-Standard empfiehlt bereits, dass Implementierungen Shared Workers für kurze Zeit nach dem Entladen des Dokuments aktiv halten, damit beim Navigieren zwischen Seiten mit demselben Ursprung der Shared Worker nicht beendet und neu erstellt wird. Der Vorschlag zur verlängerten Lebensdauer schlägt vor, dass der User-Agent den Shared Worker für eine bestimmte Zeit aktiv halten sollte, damit asynchrone Aufgaben abgeschlossen werden können, auch wenn der Nutzer nicht zu einem Ziel mit demselben Ursprung navigiert.
Der Vorschlag besteht darin, dass Shared Workers nach dem Entladen des letzten Dokuments für dieselbe Zeitspanne wie Server-Worker im Leerlauf bleiben dürfen – in Chrome sind das 30 Sekunden. Bei Shared Workers ist dies die maximale Lebensdauer nach dem Entladen und nicht die Leerlaufzeit. Das 30-Sekunden-Limit beginnt also mit dem Entladen und nicht mit der Leerlaufzeit. Arbeiten, die innerhalb dieses Zeitraums begonnen und noch nicht abgeschlossen wurden, werden abgebrochen.
Verlängerte Lebensdauer aktivieren
Die Funktion kann auf Websites für Nutzer aktiviert werden, indem Sie sich für einen Origin-Testlauf für Shared Workers mit erweiterter Lebensdauer registrieren. Alternativ können Entwickler die Funktion für ihren eigenen Browser mit dem Flag chrome://flags/#enable-experimental-web-platform-features
aktivieren.
Beispielcode
Nachdem Sie die Testversion oder das Feature-Flag aktiviert haben, aktivieren Sie die verlängerte Lebensdauer so:
const myWorker = new SharedWorker("worker.js", { extendedLifetime: true });
Da Shared Workers auch Blobs unterstützen, kann dies auch ohne separates Skript aktiviert werden. So schreiben Sie beispielsweise Daten in eine IndexedDb:
const sharedWorkerScript = `
const transaction = db.transaction("analytics", "readwrite");
const store = transaction.objectStore("analytics");
const request = store.get("visitCount");
request.onsuccess = (event) => {
const newCount = (event.target.result || 0) + 1;
store.put(newCount, "visitCount");
};
`;
document.addEventListener("pagehide", () => {
const blob = new Blob([sharedWorkerScript], { type: "text/javascript" });
const blobURL = URL.createObjectURL(blob);
new SharedWorker(blobURL, { extendedLifetime: true });
});
https://sharedworker-extendedlifetime.netlify.app/ Wenn die Seite neu geladen oder innerhalb von 30 Sekunden geschlossen und wieder geöffnet wird, ist die vorherige Berechnung weiterhin verfügbar.
Gemeinsam genutzte Arbeitskräfte sind für eine Website unter chrome://inspect/#workers
sichtbar. Diese Funktion wird in Kürze erweitert, um anzuzeigen, ob die Option extendedLifetime
verwendet wurde. Shared Workers mit verlängerter Lebensdauer werden auch 30 Sekunden nach dem Entladen der Seite auf dieser Seite angezeigt.
Feedback geben
Wir freuen uns auf Ihr Feedback zum erweiterten Origin-Trail für Shared Workers.
Die API-Form wird auf GitHub diskutiert. Außerdem haben wir eine detailliertere technische Erläuterung.
Wenn Sie Feedback zur Implementierung in Chrome geben möchten, erstellen Sie einen Chromium-Fehlerbericht.