Varsayılan olarak daha yeni hizmet çalışanları

tl;dr

Chrome 68'den itibaren, hizmet çalışanı komut dosyası güncellemelerini kontrol eden HTTP istekleri artık varsayılan olarak HTTP önbelleği tarafından karşılanmayacaktır. Bu çözüm, Service Worker komut dosyanıza yanlışlıkla Cache-Control üstbilgisi ayarlamanın güncellemelerin gecikmesine neden olabileceği yaygın geliştirici sorunu giderilir.

/service-worker.js komut dosyanızı Cache-Control: max-age=0 ile yayınlayarak HTTP önbelleğe almayı daha önce devre dışı bıraktıysanız yeni varsayılan davranış nedeniyle herhangi bir değişiklik görmezsiniz.

Ek olarak, Chrome 78'den itibaren baytlık karşılaştırma, importScripts() aracılığıyla bir hizmet çalışanına yüklenen komut dosyalarına uygulanacaktır. İçe aktarılan bir komut dosyasında yapılan herhangi bir değişiklik, tıpkı üst düzey Service Worker'da yapılan bir değişiklik gibi hizmet çalışanı güncelleme akışını tetikler.

Arka plan

Bir hizmet çalışanının kapsamındaki yeni bir sayfaya gittiğinizde, JavaScript'ten registration.update() öğesini açıkça çağırdığınızda veya bir hizmet çalışanı push ya da sync etkinliği aracılığıyla "uyandığında" tarayıcı paralel olarak, hizmet çalışanı komut dosyasındaki güncellemeleri aramak için başlangıçta navigator.serviceWorker.register() çağrısına iletilen JavaScript kaynağını ister.

Bu makalenin amacı doğrultusunda, URL'sinin /service-worker.js olduğunu ve hizmet çalışanı içinde çalıştırılan ek kodu yükleyen importScripts() öğesine tek bir çağrı içerdiğini varsayalım:

// Inside our /service-worker.js file:
importScripts('path/to/import.js');

// Other top-level code goes here.

Neler değişiyor?

Chrome 68'den önceki sürümlerde /service-worker.js için güncelleme isteği, HTTP önbelleği üzerinden yapılır (çoğu getirmede olduğu gibi). Yani, komut dosyası ilk olarak Cache-Control: max-age=600 ile gönderilmişse sonraki 600 saniye (10 dakika) içinde yapılan güncellemeler ağa aktarılmaz. Bu nedenle, kullanıcı Service Worker'ın en güncel sürümünü alamayabilir. Bununla birlikte max-age, 86400'den (24 saat) büyükse kullanıcıların belirli bir sürümle kalıcı olarak kalmasını önlemek için 86.400 olarak kabul edilir.

68 sürümünden itibaren, hizmet çalışanı komut dosyası için güncelleme istenirken HTTP önbelleği yoksayılacaktır. Bu nedenle mevcut web uygulamalarında, Service Worker komut dosyası için istek sıklığında artış görülebilir. importScripts istekleri yine de HTTP önbelleği üzerinden iletilecektir. Ancak bu yalnızca varsayılan ayardır. Bu davranış üzerinde kontrol sağlayan updateViaCache adlı yeni bir kayıt seçeneği mevcuttur.

updateViaCache

Geliştiriciler artık navigator.serviceWorker.register() öğesini çağırırken updateViaCache parametresini yeni bir seçenek iletebilir. Şu üç değerden birini alır: 'imports', 'all' veya 'none'.

Değerler, güncellenmiş hizmet çalışanı kaynaklarını kontrol etmek için HTTP isteği oluşturulurken tarayıcının standart HTTP önbelleğinin devreye girip girmeyeceğini ve nasıl etkinleşeceğini belirler.

  • 'imports' olarak ayarlandığında, /service-worker.js komut dosyası güncellemeleri kontrol edilirken hiçbir zaman HTTP önbelleğine danışılmaz. Ancak içe aktarılan komut dosyaları getirilirken danışılır (örneğimizde path/to/import.js). Bu, varsayılan değerdir ve Chrome 68'den itibaren geçerli olan davranışla eşleşir.

  • 'all' olarak ayarlandığında, hem üst düzey /service-worker.js komut dosyası hem de hizmet çalışanı içinde içe aktarılan path/to/import.js gibi tüm komut dosyaları için istekte bulunurken HTTP önbelleğine danışılır. Bu seçenek, Chrome 68'den önceki Chrome'daki davranışa karşılık gelir.

  • 'none' olarak ayarlandığında, üst düzey /service-worker.js veya içe aktarılan komut dosyaları (varsayımsal path/to/import.js gibi) için istekte bulunurken HTTP önbelleğine danışılmaz.

Örneğin, aşağıdaki kod bir hizmet çalışanını kaydeder ve /service-worker.js komut dosyası güncellemeleri veya /service-worker.js içindeki importScripts() aracılığıyla başvurulan komut dosyaları için güncelleme olup olmadığı kontrol edilirken hiçbir zaman HTTP önbelleğine danışılmamasını sağlar:

if ('serviceWorker' in navigator) {
  navigator.serviceWorker.register('/service-worker.js', {
    updateViaCache: 'none',
    // Optionally, set 'scope' here, if needed.
  });
}

İçe aktarılan komut dosyalarında güncelleme olup olmadığını denetler

Chrome 78'den önce, importScripts() üzerinden yüklenen tüm Service Worker komut dosyaları yalnızca bir kez alınıyordu (önce HTTP önbelleğiyle veya updateViaCache yapılandırmasına bağlı olarak ağ üzerinden kontrol edilerek). Bu ilk alma işleminden sonra, tarayıcı tarafından dahili olarak depolanır ve hiçbir zaman yeniden getirilmez.

Zaten yüklü bir hizmet çalışanını, içe aktarılan komut dosyasındaki değişiklikleri almaya zorlamanın tek yolu, komut dosyasının URL'sini değiştirmektir. Bunun için genellikle bir semver değeri (ör. importScripts('https://example.com/v1.1.0/index.js')) veya içeriklerin bir karması (ör. importScripts('https://example.com/index.abcd1234.js')) eklenir. İçe aktarılan URL'nin değiştirilmesinin yan etkisi olarak üst düzey hizmet çalışanı komut dosyasının içeriği değişir, bu da güncelleme akışını tetikler.

Chrome 78 sürümünden itibaren, üst düzey Service Worker dosyası için her güncelleme kontrolü yapıldığında, içe aktarılan komut dosyalarının içeriğinin değişip değişmediğini belirlemek için aynı anda kontroller de yapılacaktır. Kullanılan Cache-Control başlıklarına bağlı olarak, updateViaCache 'all' veya 'imports' (varsayılan değer) olarak ayarlanırsa bu içe aktarılan komut dosyası kontrolleri, HTTP önbelleği tarafından gerçekleştirilebilir. updateViaCache, 'none' olarak ayarlanırsa kontroller doğrudan ağa uygulanabilir.

İçe aktarılan bir komut dosyası için güncelleme kontrolü, daha önce Service Worker tarafından depolananlara kıyasla bir baytlık bir farka yol açarsa üst düzey hizmet çalışanı dosyası aynı kalsa bile tam hizmet çalışanı güncelleme akışı tetiklenir.

Chrome 78 davranışı, Firefox'un birkaç yıl önce Firefox 56'da uyguladığı ile eşleşir. Safari de bu davranışı zaten uyguluyor.

Geliştiricilerin ne yapması gerekiyor?

/service-worker.js komut dosyanızı Cache-Control: max-age=0 (veya benzer bir değerle) ile sunarak /service-worker.js komut dosyanız için HTTP önbelleğe almayı devre dışı bıraktıysanız yeni varsayılan davranış nedeniyle herhangi bir değişiklik görmemeniz gerekir.

/service-worker.js komut dosyanızı, kasıtlı olarak veya barındırma ortamınızın varsayılanı olduğu için HTTP önbelleğe alma etkin şekilde sunuyorsanız sunucunuza yönelik olarak yapılan /service-worker.js için ek HTTP isteklerinde bir artış görmeye başlayabilirsiniz. Bunlar daha önce HTTP önbelleği tarafından yerine getirilen isteklerdir. Cache-Control üst bilgi değerinin /service-worker.js sayfanızın güncelliğini etkilemesine izin vermek istiyorsanız hizmet çalışanınızı kaydederken updateViaCache: 'all' ayarını açıkça belirtmeniz gerekir.

Eski tarayıcı sürümlerinde çok sayıda kullanıcı olabilir. Bu nedenle, yeni tarayıcılar bunları yoksayabilir ancak Service Worker komut dosyalarında Cache-Control: max-age=0 HTTP üst bilgisini ayarlamaya devam etmek iyi bir fikirdir.

Geliştiriciler, içe aktarılan komut dosyalarını HTTP önbelleğe alma özelliğinin açık bir şekilde devre dışı bırakıp bırakmayacağına karar vermek için bu fırsatı kullanabilir ve uygunsa updateViaCache: 'none' eklentisini Service Worker kaydına ekleyebilir.

İçe aktarılan komut dosyaları sunuluyor

Chrome 78'den itibaren geliştiriciler artık güncelleme olup olmadığı kontrol edileceğinden importScripts() üzerinden yüklenen kaynaklar için daha fazla gelen HTTP isteği görebilirler.

Bu ek HTTP trafiğinden kaçınmak isterseniz URL'lerinde Semver veya karma içeren komut dosyaları sunarken uzun ömürlü Cache-Control üst bilgileri ayarlayın ve varsayılan updateViaCache davranışına ('imports') uyun.

Alternatif olarak, içe aktarılan komut dosyalarınızın sık sık yapılan güncellemeler için kontrol edilmesini istiyorsanız bu komut dosyalarını Cache-Control: max-age=0 ile sunduğunuzdan veya updateViaCache: 'none' kullandığınızdan emin olun.

Daha fazla bilgi

Jake Archibald tarafından hazırlanan "Hizmet Çalışanı Yaşam Döngüsü" ve "Caching en iyi uygulamaları ve maksimum yaş kazanları ", web'e herhangi bir şey dağıtan tüm geliştiricilerin okuması önerilir.