Gepubliceerd: 31 juli 2025
Neem vanaf Chrome 139 deel aan een nieuwe oorsprongstest voor gedeelde workers met verlengde levensduur . De proefversie voegt een nieuwe extendedLifetime: true
optie toe om gedeelde workers langer te laten meegaan dan de laatste documentuitvoer.
Het gebruiksvoorbeeld voor de functie voor verlengde levensduur
Veel sites willen een taak uitvoeren terwijl de gebruiker de pagina verlaat. Bijvoorbeeld het opslaan van gegevens in de opslag of het terugsturen van gegevens naar servers om de status op te slaan of analyses vast te leggen.
Het webplatform biedt een aantal API's voor een aantal van de eenvoudigere use cases, maar elke API heeft beperkingen:
- Synchrone JavaScript-API's, zoals
localStorage
schrijfbewerkingen, worden voltooid voordat de huidige pagina wordt verwijderd. - De
fetch API
heeft een aantal opties, zoalskeepalive
en sinds kort ookfetchLater
, waarmee verzendverzoeken een korte periode langer kunnen duren dan het document dat is ontladen.
Deze hebben echter alleen betrekking op synchroon werk, met uitzondering van de laatste fetch
. Ze staan het gebruik van asynchrone API's zoals IndexedDB , Compression Streams of Web Crypto voor hashing of encryptie niet toe. Veel API's, met name nieuwere API's, zijn asynchroon om blokkering van de hoofdthread te voorkomen. Het niet kunnen gebruiken van deze API's bij het ontladen is daarom beperkend.
Het alternatief is om service workers te gebruiken, die buiten de levenscycli van individuele pagina's vallen. Dit is echter een vrij zware oplossing, met complexere levenscyclus- en beheervereisten voor ontwikkelaars, om nog maar te zwijgen van extra proces- en geheugenvereisten voor gebruikers. Het past ook niet bij de belangrijkste use case van service workers (als proxy voor netwerkaanvragen). Het gebruik van volledige service workers uitsluitend voor het voltooien van werk bij het ontladen van pagina's lijkt overdreven.
De voorgestelde oplossing
De SharedWorker API is een lichtere API die wordt gebruikt om werk van de hoofdthread te ontladen. Ze blijven echter momenteel niet langer bestaan dan de levensduur van de bron (wanneer de laatste pagina voor die bron wordt verwijderd). Chrome stelt voor om een nieuwe optie aan de SharedWorker API toe te voegen waarmee shared workers de documentvernietiging gedurende een korte periode kunnen overleven.
De HTML-standaard moedigt implementaties al aan om gedeelde workers kortstondig actief te houden na het uitladen van het document, zodat navigeren tussen pagina's met dezelfde oorsprong de gedeelde worker niet blokkeert en vervolgens opnieuw aanmaakt. Het voorstel voor een langere levensduur breidt dit alleen maar uit door te suggereren dat, zelfs als de gebruiker niet naar een bestemming met dezelfde oorsprong navigeert, de user agent de gedeelde worker enige tijd actief moet houden, zodat asynchrone werkzaamheden kunnen worden voltooid.
Het voorstel is om gedeelde workers na het laatste document te laten doorlopen, gedurende dezelfde tijd als serverworkers inactief mogen blijven – wat voor Chrome 30 seconden is. Houd er rekening mee dat dit voor gedeelde workers een maximale levensduur na het verwijderen van het document is, en geen inactieve periode. Dat wil zeggen dat de limiet van 30 seconden begint vanaf het verwijderen van het document, en niet vanaf de inactieve periode. Werk dat binnen die periode is gestart en nog niet is voltooid, wordt geannuleerd.
Maak de verlengde levensduur mogelijk
De functie kan op sites voor gebruikers worden ingeschakeld door zich te registreren voor een proefperiode voor gedeelde werknemers met verlengde levensduur . Ontwikkelaars kunnen de functie ook voor hun eigen browser inschakelen met de vlag chrome://flags/#enable-experimental-web-platform-features
.
Voorbeeldcode
Nadat u de proef- of functie-vlag hebt geactiveerd, schakelt u de verlengde levensduur als volgt in:
const myWorker = new SharedWorker("worker.js", { extendedLifetime: true });
Omdat gedeelde workers ook blobs ondersteunen, kan dit ook zonder apart script worden ingeschakeld. Bijvoorbeeld om gegevens naar een geïndexeerde database te schrijven:
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 });
});
We hebben hier ook een voorbeeldtoepassing: https://sharedworker-extendedlifetime.netlify.app/ . Wanneer de pagina opnieuw wordt geladen (of binnen 30 seconden wordt gesloten en opnieuw geopend), blijft de vorige berekening beschikbaar.
Gedeelde workers zijn zichtbaar voor een site op: chrome://inspect/#workers
. Dit wordt binnenkort verbeterd om aan te geven of de optie extendedLifetime
is gebruikt. Gedeelde workers met extended lifetime blijven ook 30 seconden lang op deze pagina zichtbaar nadat de pagina is verwijderd.
Deel uw feedback
Wij horen graag uw feedback over het Extended Lifetime Shared Worker Origin Trail.
De API-vorm wordt besproken op GitHub en we hebben een meer gedetailleerde technische uitleg .
Voor feedback over de implementatie van Chrome kunt u een Chromium-bug melden.