Daha uzun ömürlü paylaşılan çalışanlar kaynak denemesi

Yayınlanma tarihi: 31 Temmuz 2025

Chrome 139'dan itibaren uzun ömürlü paylaşılan çalışanlar için yeni bir kaynak denemesine katılın. Deneme sürümünde, paylaşılan çalışanların son doküman kaldırılmasının ötesinde canlı kalmasına olanak tanıyan yeni bir extendedLifetime: true seçeneği bulunur.

Uzatılmış kullanım ömrü özelliğinin kullanım alanı

Birçok site, kullanıcı sayfadan ayrılırken bazı işlemler yapmak ister. Örneğin, durumu kaydetmek veya analizleri kaydetmek için depolamaya yazma ya da sunuculara veri geri gönderme.

Web platformu, daha basit bazı kullanım alanlarıyla ilgilenmek için birkaç API sağlar ancak her birinin sınırlamaları vardır:

  • localStorage yazma işlemleri gibi senkron JavaScript API'leri, mevcut sayfa kaldırılmadan önce tamamlanacak şekilde çalıştırılır.
  • fetch API, keepalive ve daha yakın zamanda fetchLater gibi, isteklerin belge kaldırıldıktan sonra kısa bir süre daha devam etmesini sağlayan çeşitli seçeneklere sahiptir.

Ancak bunlar, son fetch isteği hariç yalnızca senkronize çalışmayı kapsar. Karma oluşturmak veya şifrelemek için IndexedDB, Compression Streams veya Web Crypto gibi eşzamansız API'lerin kullanılmasına izin vermezler. Birçok API, özellikle daha yeni olanlar, ana iş parçacığını engellememek için eşzamansızdır. Bu nedenle, bu API'lerin unload üzerinde kullanılamaması kısıtlayıcıdır.

Alternatif olarak, tek tek sayfa yaşam döngülerinin dışında yaşayan hizmet çalışanlarını kullanabilirsiniz. Ancak bu, geliştiriciler için daha karmaşık yaşam döngüsü ve yönetim gereksinimlerinin yanı sıra kullanıcılar için ek işlem ve bellek gereksinimleri olan oldukça ağır bir çözümdür. Ayrıca, hizmet çalışanlarının temel kullanım alanıyla (ağ istekleri için proxy görevi görme) de eşleşmez. Tam hizmet çalışanlarını yalnızca sayfa kaldırılırken bazı işleri tamamlamak için kullanmak gereksizdir.

Önerilen çözüm

SharedWorker API, ana iş parçacığındaki işleri boşaltmak için kullanılan daha hafif bir API'dir. Ancak şu anda, kaynağın kullanım ömrü (kaynağın son sayfası kaldırıldığında) sona erdiğinde bu veriler de silinir. Chrome, paylaşılan çalışanların belge yok edilmesinden sonra kısa bir süre daha çalışmaya devam etmesini sağlamak için SharedWorker API'ye yeni bir seçenek eklemeyi öneriyor.

HTML Standardı, aynı kaynaklı sayfalar arasında gezinirken paylaşılan çalışanın kapatılıp yeniden oluşturulmaması için uygulamaların, paylaşılan çalışanları belge yüklemesi kaldırıldıktan sonra kısa bir süre boyunca canlı tutmasını zaten teşvik etmektedir. Genişletilmiş yaşam süresi önerisi, kullanıcı aynı kaynaklı bir hedefe gitmese bile kullanıcı aracısının paylaşılan çalışanı bir süre daha etkin tutmasını önererek bu süreyi uzatır. Böylece, asenkron çalışma tamamlanabilir.

Öneriye göre, paylaşılan çalışanların son belge kaldırıldıktan sonra da çalışmaya devam etmesine izin verilecek. Bu süre, sunucu çalışanlarının boşta kalmasına izin verilen süreyle aynı olacak (Chrome'da 30 saniye). Paylaşılan çalışanlar için bunun boşta kalma süresi değil, boşaltma işleminden sonraki maksimum kullanım ömrü olduğunu unutmayın. Yani 30 saniyelik sınır, boşta kalma süresinden değil, kaldırma işleminden itibaren başlar. Bu süre içinde başlatılan ancak henüz tamamlanmamış çalışmalar iptal edilir.

Uzatılmış kullanım ömrünü etkinleştirme

Bu özellik, uzun ömürlü paylaşılan çalışanlar için kaynak denemesine kaydolarak sitelerde kullanıcılar için etkinleştirilebilir. Alternatif olarak geliştiriciler, chrome://flags/#enable-experimental-web-platform-features işaretini kullanarak kendi tarayıcılarında etkinleştirebilir.

Örnek kod

Deneme veya özellik flag'ini etkinleştirdikten sonra, uzatılmış kullanım ömrünü aşağıdaki şekilde etkinleştirin:

const myWorker = new SharedWorker("worker.js", { extendedLifetime: true });

Paylaşılan çalışanlar blob'ları da desteklediğinden bu özellik ayrı bir komut dosyası olmadan da etkinleştirilebilir. Örneğin, IndexedDb'ye veri yazmak için:

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 });
});

Ayrıca, https://sharedworker-extendedlifetime.netlify.app/ adresinde örnek bir uygulamamız da var. Sayfa yeniden yüklendiğinde (veya 30 saniye içinde kapatılıp yeniden açıldığında) önceki hesaplama kullanılmaya devam eder.

Paylaşılan çalışanlar, chrome://inspect/#workers adresindeki bir site için görüntülenebilir. Bu özellik, kısa süre içinde extendedLifetime seçeneğinin kullanılıp kullanılmadığını gösterecek şekilde geliştirilecektir. Uzun ömürlü paylaşılan çalışanlar, sayfa kaldırıldıktan sonra 30 saniye boyunca bu sayfada gösterilmeye devam eder.

Görüşlerinizi paylaşın

Genişletilmiş ömürlü paylaşılan çalışan deneme süreciyle ilgili geri bildirimlerinizi bekliyoruz.

API şekli GitHub'da tartışılıyor ve daha ayrıntılı bir teknik açıklama sunuyoruz.

Chrome'un uygulamasıyla ilgili geri bildirim için Chromium hatası bildirin.