Hatalı hizmet çalışanlarını kaldırma

Bazen hatalı bir hizmet çalışanı dağıtılır ve ardından sorunlar ortaya çıkar. Örneğin, bir Service Worker kayıt sırasında ayrıştırılabilir ve yükleme başarıyla tamamlanabilir. Bununla birlikte, fetch etkinliğindeki hatalı kod, isteklere yanıt vermemesine ve boş sayfanın ortaya çıkmasına neden olabilir. Diğer bir olasılık da sayfa işaretlemenin yoğun şekilde önbelleğe alınması ve bir hizmet çalışanının sonraki ziyaretler için yalnızca bir Cache örneğinden eski işaretleme yanıtları döndürmesidir.

Service Worker'lar pek çok farklı şekilde ters tepebilir ve bu, bir üretim web sitesinde bulunması korkutucu bir sorundur. Yine de her şey kaybolmuş değil. Bu durumu düzeltip tekrar yoluna girmenin yolları vardır.

İşlemsiz hizmet çalışanı dağıtma

Hatalı hizmet çalışanı ile başa çıkmak için genellikle tek gereken, fetch etkinlik işleyicisi olmadan hemen yüklenen ve etkinleştirilen bir temel no-op hizmet çalışanı dağıtmaktır:

// sw.js

self.addEventListener('install', () => {
  // Skip over the "waiting" lifecycle state, to ensure that our
  // new service worker is activated immediately, even if there's
  // another tab open controlled by our older service worker code.
  self.skipWaiting();
});

self.addEventListener('activate', () => {
  // Optional: Get a list of all the current open windows/tabs under
  // our service worker's control, and force them to reload.
  // This can "unbreak" any open windows/tabs as soon as the new
  // service worker activates, rather than users having to manually reload.
  self.clients.matchAll({
    type: 'window'
  }).then(windowClients => {
    windowClients.forEach((windowClient) => {
      windowClient.navigate(windowClient.url);
    });
  });
});

Bu hizmet çalışanı, install etkinliğinde self.skipWaiting() çağrısı yaparak hemen yükler ve etkinleştirilir. İsteğe bağlı olarak, hizmet çalışanının kontrol ettiği bir WindowClient ile diğer açık sekmelerin zorla yeniden yüklenmesi için activate etkinliğinde ek kod dağıtılabilir.

İşlemsiz bir hizmet çalışanının fetch etkinlik işleyici içermemesi çok önemlidir. Bir hizmet çalışanı isteklerle ilgilenmediğinde, bu istekler tarayıcıya hizmet çalışanı yokmuş gibi iletilir. İşlemsiz hizmet çalışanı dağıtıldıktan sonra hatalı hizmet çalışanı düzeltilebilir ve daha sonra güncelleme olarak dağıtılabilir.

Bu yaklaşım kısmen, tarayıcıların hizmet işçilerini HTTP önbelleğine yerleştirilmesine karşı güçlü korumalara sahip olması ve güncellemeler için Service Worker içeriğinin baytlar bazında kontrol edilmesini sağlaması nedeniyle işe yarar. Bu varsayılan ayarlar, sorunu hızlı bir şekilde düzeltmek amacıyla hatalı bir hizmet çalışanı için işlemsiz bir değişimin dağıtılmasını mümkün kılar.

Alınacak ek önlemler

İşlemsiz bir Service Worker dağıtmak, hatalı bir hatayı etkisiz hale getirmek için yeterli olacaktır ancak gerekirse ek önlemler alınabilir.

Eski hizmet çalışanının URL'sini bilmiyorsanız ne olur?

Bazen daha önce yüklenen bir hizmet çalışanının URL'si bilinmiyor. Bunun nedeni dosyanın sürüm olması (örneğin, dosya adında bir karma değeri içermesi) olabilir. Bu durumda, kayıtlı olabilecek her eski hizmet çalışanının URL'siyle eşleşen işlemsiz bir hizmet çalışanı dağıtmak zor olabilir. Geliştiriciler, dağıtılan her Service Worker sürümünün her karmasını büyük olasılıkla hatırlamayacağından, bu durum en iyi uygulamalara aykırıdır.

Neyse ki, Service Worker komut dosyası isteğiyle birlikte faydalı bir HTTP istek başlığı gönderilir: Service-Worker. Web sunucusunda bu başlığı kontrol edin ve bunun yerine işlemsiz hizmet çalışanı sunma isteğine müdahale edin. Bu başarının gerçekleştirilmesi web sunucusuna ve kullanılan arka uç yığınına bağlıdır. Bu işlemi nasıl yapacağınızı öğrenmek için ilgili dilin belgelerine bakın.

Gelecekteki hizmet çalışanı dağıtımları söz konusu olduğunda, eski haline getirilmemiş öğe adlarını (örneğin, sw.js) kullanmaya devam edin. Bu, ileride işleri çok daha az karmaşık hale getirecektir.

Clear-Site-Data üstbilgisi ayarla

'storage' değerine sahip bir Clear-Site-Data yanıt başlığı ayarlanırsa bazı tarayıcılar, kaynak için tüm Service Worker'ların kaydını iptal eder. Ancak bu yaklaşımla ilgili olarak dikkate alınması gereken birkaç nokta vardır:

  • Bu işlemin, ilişkili kaynak için tüm depolama alanını temizleyeceğini unutmayın. Buna localStorage, IndexedDB, sessionStorage ve diğer depolama alanları dahildir (ancak kaynak için HTTP önbelleği dahil değildir).
  • Bu başlık tüm tarayıcılarda desteklenmez.

Bu başlıkta verilen destek toplamda yeterli olmadığından, sorunu çözme konusunda tek başına yeterli değildir. Bu nedenle, işlemsiz bir hizmet çalışanı dağıtmanın yanı sıra alınması gereken bir önlem olarak Clear-Site-Data görüntülemek en iyisidir.

Hasar kalıcı değildir

Kötü niyetli bir hizmet çalışanı özellikle büyük ve tanınmış web sitelerinde kullanıcı deneyiminin kesintiye uğraması korkutucu olabilir. Ancak verilen hasar geçici ve geri döndürülebilirdir.

Durumu düzeltmek için işlemsiz bir hizmet çalışanı dağıtmak gerekiyorsa tam olarak neyin yanlış gittiğini anlamak için biraz zaman ayırın. Gelecekte bir hizmet çalışanının yalnızca beklenen istekleri işlediğinden emin olun. Hazırlık aşamasında sık sık test yapın ve güncellemeleri yalnızca kendinize güveniyorsanız dağıtın.