Proef met verlengde levenslange gedeelde herkomst van werknemers

Gepubliceerd: 31 juli 2025

Vanaf Chrome versie 139 is er een nieuwe testversie beschikbaar voor shared workers met een langere levensduur . Deze test voegt een nieuwe optie toe extendedLifetime: true , waarmee shared workers langer kunnen blijven bestaan ​​dan wanneer het laatste document wordt verwijderd.

Het gebruiksscenario voor de verlengde levensduurfunctie

Veel websites willen bepaalde taken uitvoeren wanneer de gebruiker de pagina verlaat. Bijvoorbeeld het opslaan van gegevens of het terugsturen van data naar servers om de status te bewaren of analyses vast te leggen.

Het webplatform biedt een aantal API's voor de eenvoudigere gebruiksscenario's, maar elk heeft zijn beperkingen:

  • Synchrone JavaScript API's, zoals de schrijfbewerkingen localStorage , worden volledig uitgevoerd voordat de huidige pagina wordt gesloten.
  • De fetch API heeft een aantal opties, zoals keepalive en, meer recent, fetchLater , waarmee verzoeken gedurende een korte periode na het ontladen van het document kunnen worden verzonden.

Deze beperkingen gelden echter alleen voor synchroon werk, met uitzondering van het 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 te voorkomen dat de hoofdthread wordt geblokkeerd. Het is daarom beperkend dat deze API's niet gebruikt kunnen worden bij het ontladen van de applicatie.

Een alternatief is het gebruik van service workers , die buiten de levenscyclus van individuele pagina's draaien. Dit is echter een vrij zware oplossing, met complexere levenscyclus- en beheervereisten voor ontwikkelaars, om nog maar te zwijgen van de extra proces- en geheugenvereisten voor gebruikers. Het sluit ook niet aan bij het belangrijkste gebruiksdoel van service workers (het fungeren als proxy voor netwerkverzoeken). Het gebruik van volledige service workers uitsluitend voor het voltooien van bepaalde taken bij het sluiten van een pagina lijkt overbodig.

De voorgestelde oplossing

De SharedWorker API is een lichtere API die wordt gebruikt om taken van de hoofdthread te ontlasten. Momenteel blijven SharedWorkers echter niet langer actief dan de levensduur van de origin (wanneer de laatste pagina voor die origin wordt verwijderd). Chrome stelt voor om een ​​nieuwe optie toe te voegen aan de SharedWorker API, zodat SharedWorkers gedurende een korte periode na het verwijderen van een document actief kunnen blijven.

De HTML-standaard moedigt implementaties al aan om gedeelde workers nog even actief te houden nadat een document is afgesloten, zodat navigeren tussen pagina's van dezelfde oorsprong de gedeelde worker niet afbreekt en opnieuw aanmaakt. Het voorstel voor een langere levensduur breidt dit uit door te suggereren dat, zelfs als de gebruiker niet naar een bestemming van dezelfde oorsprong navigeert, de user agent de gedeelde worker nog een bepaalde tijd actief moet houden, zodat asynchroon werk kan worden voltooid.

Het voorstel is om gedeelde workers toe te staan ​​actief te blijven nadat het laatste document is ontladen, gedurende dezelfde tijd als waarin serverworkers inactief mogen blijven – wat voor Chrome 30 seconden is. Let op: voor gedeelde workers geldt dit als een maximale levensduur na het ontladen, en niet als een inactiviteitstijd. De limiet van 30 seconden begint dus vanaf het moment van ontladen, niet vanaf de inactiviteitstijd. Werk dat binnen die periode is gestart maar nog niet is voltooid, wordt geannuleerd.

Schakel de verlengde levensduur in

Deze functie kan op sites voor gebruikers worden ingeschakeld door zich te registreren voor een Origin-proefperiode voor gedeelde workers met een langere levensduur . Ontwikkelaars kunnen de functie ook voor hun eigen browser inschakelen met behulp van de vlag chrome://flags/#enable-experimental-web-platform-features .

Voorbeeldcode

Nadat je hebt gekozen voor de proefversie of de feature flag, schakel je 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 IndexedDb 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 voorbeeldapplicatie: https://sharedworker-extendedlifetime.netlify.app/ . Wanneer de pagina opnieuw wordt geladen (of gesloten en binnen 30 seconden opnieuw wordt geopend), blijft de vorige berekening beschikbaar.

Gedeelde workers zijn voor een site te bekijken via: chrome://inspect/#workers Deze functie wordt binnenkort uitgebreid om aan te geven of de optie extendedLifetime is gebruikt. Gedeelde workers met een verlengde levensduur blijven ook 30 seconden na het sluiten van de pagina op deze pagina zichtbaar.

Deel je feedback

We zien uw feedback op de verlengde proef met gedeelde herkomst voor werknemers met een langere levensduur met belangstelling tegemoet.

De structuur van de API wordt besproken op GitHub en we hebben een meer gedetailleerde technische uitleg .

Voor feedback over de implementatie in Chrome kunt u een bugrapport indienen bij Chromium .