Hizmet çalışanlarını ve Cache Storage API'yi kullanan geliştiriciler, Chrome 71'de kullanıma sunulan iki küçük değişiklikten haberdar olmalıdır. Her iki değişiklik de Chrome'un uygulamasını özelliklere ve diğer tarayıcılara daha uygun hale getiriyor.
Eşzamansız importScripts() işlemine izin verme
importScripts()
, ana hizmet çalışanı komut dosyanıza mevcut yürütmesini duraklatmasını, belirli bir URL'den ek kod indirmesini ve geçerli global kapsamda tamamlanana kadar çalıştırmasını bildirir. Bu işlem tamamlandıktan sonra ana hizmet çalışanı komut dosyası yürütülmeye devam eder. importScripts()
, ana hizmet çalışanı komut dosyanızı organizasyonel nedenlerle daha küçük parçalara ayırmak veya hizmet çalışanınıza işlev eklemek için üçüncü taraf kodunu dahil etmek istediğinizde kullanışlıdır.
Tarayıcılar, importScripts()
aracılığıyla alınan her şeyi otomatik olarak önbelleğe alarak "bazı senkronize kodları indirip çalıştırma" işleminin olası performans sorunlarını azaltmaya çalışır. Bu sayede, ilk indirme işleminden sonra içe aktarılan kodun yürütülmesiyle ilgili çok az ek yük oluşur.
Ancak bunun işe yaraması için tarayıcının, ilk kurulumdan sonra hizmet çalışanına "sürpriz" bir kodun aktarılmayacağını bilmesi gerekir.
Hizmet çalışanı spesifikasyonuna göre, importScripts()
çağrısının yalnızca üst düzey hizmet çalışanı komut dosyasının eşzamanlı yürütülmesi sırasında veya gerekirse install
işleyici içinde eşzamansız olarak çalışması gerekir.
Chrome 71'den önceki sürümlerde importScripts()
, install
işleyicisinin dışında eşzamansız olarak çağrılıyordu. Chrome 71'den itibaren bu çağrılar, diğer tarayıcılardaki davranışla eşleşecek şekilde (aynı URL daha önce bir install
işleyiciye aktarılmadığı sürece) çalışma zamanında istisna oluşturur.
Aşağıdaki gibi bir kod yerine:
// This only works in Chrome 70 and below.
self.addEventListener('fetch', event => {
importScripts('my-fetch-logic.js');
event.respondWith(self.customFetchLogic(event));
});
Hizmet çalışanı kodunuz aşağıdaki gibi görünmelidir:
// Move the importScripts() to the top-level scope.
// (Alternatively, import the same URL in the install handler.)
importScripts('my-fetch-logic.js');
self.addEventListener('fetch', event => {
event.respondWith(self.customFetchLogic(event));
});
Cache.addAll() işlevine iletilen tekrarlanan URL'lerin desteği sonlandırılıyor
Cache Storage API'yi bir hizmet çalışanıyla birlikte kullanıyorsanız Chrome 71'de ilgili spesifikasyona uygun olarak yapılan küçük bir değişiklik daha var. Aynı URL, cache.addAll()
öğesine yapılan tek bir çağrıya birden çok kez iletildiğinde, belirtilen spesifikasyonda çağrı tarafından verilen taahhüdün reddedilmesi gerektiği belirtilir.
Chrome 71'den önce bu algılanmıyordu ve yinelenen URL'ler etkili bir şekilde yoksayılıyordu.
Bu günlük kaydı, Chrome 72'nin bir başlangıcıdır. Chrome 72'de, yinelenen URL'ler yalnızca günlük kaydına alınan bir uyarı yerine cache.addAll()
reddedilmesine neden olur. cache.addAll()
'yi, yaygın uygulama olduğu üzere InstallEvent.waitUntil()
'ye iletilen bir promise zinciri kapsamında çağırıyorsanız bu ret, hizmet çalışanınızın yüklenememesi sorununa neden olabilir.
Aşağıdaki durumlarda sorunla karşılaşabilirsiniz:
const urlsToCache = [
'/index.html',
'/main.css',
'/app.js',
'/index.html', // Oops! This is listed twice and should be removed.
];
self.addEventListener('install', event => {
event.waitUntil(
caches.open('my-cache').then(cache => cache.addAll(urlsToCache))
);
});
Bu kısıtlama yalnızca cache.addAll()
adresine iletilen gerçek URL'ler için geçerlidir ve '/'
ve '/index.html'
gibi farklı URL'lere sahip iki eşdeğer yanıtın önbelleğe alınması reddi tetiklemez.
Hizmet çalışanı uygulamanızı geniş çapta test etme
Hizmet çalışanları bu noktada, tüm önemli "her zaman etkin" tarayıcılarda kapsamlı bir şekilde uygulanmaktadır. Progresif web uygulamanızı çeşitli tarayıcılarda düzenli olarak test ediyorsanız veya Chrome'u kullanmayan çok sayıda kullanıcınız varsa tutarsızlığı tespit edip kodunuzu güncellemişsinizdir. Ancak diğer tarayıcılarda bu davranışı fark etmemiş olmanız ihtimaline karşı, Chrome'un davranışını değiştirmeden önce bu değişikliği sizinle paylaşmak istedik.