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

Bazen hatalı bir hizmet çalışanı dağıtılıyor sorunlar da var. Örneğin, bir hizmet çalışanı kayıt sırasında ayrıştırılabilir ve yükleme başarıyla tamamlanabilir. Yine de fetch etkinliğindeki hatalı kod, isteklere yanıt vermemesine neden olabilir. boş bir sayfayla sonuçlanıyor. Bir diğer olasılık da sayfa işaretlemenin agresif bir şekilde önbelleğe alınmış olmasıdır. ve bir hizmet çalışanı, sonraki ziyaretler için yalnızca bir Cache örneğinden eski işaretleme yanıtlarını döndürür.

Service Worker'lar ters tetikte olmak için çeşitli yöntemler kullanır. bu, prodüksiyon web sitelerinde olması korkunç bir sorun. Yine de hiçbir şey kaybolmaz. Bu durumu düzeltmenin ve sorunu düzeltmenin yolları vardır.

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

Hatalı bir servis çalışanıyla uğraşmak için genellikle gereken tek şey, fetch etkinlik işleyici olmadan hemen yükleyen ve etkinleştiren no-op hizmet çalışanı:

// 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ı, şu çağrıyı yaparak anında yüklenir ve etkinleştirilir: install etkinliğinde self.skipWaiting(). İsteğe bağlı olarak, hizmet çalışanının kontrol ettiği bir WindowClient ile diğer açık sekmeleri zorla yeniden yüklemek için activate etkinliğinde ek kod dağıtılabilir.

İşlemsiz bir hizmet çalışanının fetch etkinlik işleyicisi içermemesi çok önemlidir. Service Worker istekleri işlemediğinde bu istekler tarayıcıya, hizmet çalışanı yokmuş gibi iletilir. İşlemsiz bir 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 çalışanları HTTP önbelleğine yerleştirilmesine karşı güçlü korumalara sahip olduğundan ve güncellemeler için hizmet çalışanının içeriğinde baytlarca kontroller yaptığından işe yarar. Bu varsayılanlar, hatalı bir servis çalışanına sorunu hızla çözmek için işlemsiz bir değişim yapılmasını mümkün kılar.

Alınacak ek önlemler

İşlemsiz bir hizmet çalışanının dağıtımı, hatalı bir çalışanı etkisiz hale getirmek için yeterli olmalıdır. Ancak gerekirse ek önlemler alınabilir.

Eski Service Worker'ın URL'sini bilmiyorsanız ne olur?

Bazen önceden yüklenmiş bir hizmet çalışanının URL'si bilinmiyor. Bunun nedeni dosyanın sürüm oluşturulmuş olması (örneğin, dosya adında bir karma bulunması) 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. Bu, en iyi uygulamalara aykırıdır, çünkü geliştiriciler muhtemelen dağıtılan her Service Worker sürümü için her karmayı hatırlamayacaktır.

Neyse ki, hizmet çalışanı komut dosyası isteğiyle birlikte yararlı bir HTTP istek başlığı gönderilir: Service-Worker. Web sunucusunda bu başlığı kontrol edin ve bunun yerine hizmet dışı bir çalışana hizmet verme isteğine müdahale edin. Bu başarıya ulaşmak, kullanılan web sunucusuna ve arka uç yığınına bağlıdır. Dolayısıyla, bunun nasıl yapılacağını öğrenmek için ilgili dilin dokümanlarına bakın.

Gelecekteki hizmet çalışanı dağıtımlarında ise sürümü olmayan öğe adlarını (ör. sw.js) kullanmaya devam edin. Bu, daha sonra işleri çok daha az karmaşık hale getirecek.

Clear-Site-Data üstbilgisi ayarlayın

Aşağıdaki durumlarda bazı tarayıcılar, bir kaynak için tüm hizmet çalışanlarının kaydını iptal eder 'storage' değerine sahip Clear-Site-Data yanıt başlığı ayarlandı. Ancak bu yaklaşımla ilgili dikkat etmeniz gereken birkaç nokta vardır:

  • Bu işlemin ilişkili kaynağın tüm depolama alanını temizleyeceğini hatırlatırız. Bu, localStorage, IndexedDB, sessionStorage ve diğer depolama alanlarını içerir (ancak kaynak için HTTP önbelleğini içermez).
  • Bu üstbilgi bazı tarayıcılarda desteklenmez.

Bu başlık için tüm destek verilmediğinden, sorunu çözmek için tek başına bu başlıktan yararlanılamaz. Bu nedenle, işlem dışı bir hizmet çalışanı dağıtmaya ek olarak alınacak bir önlem olarak Clear-Site-Data kullanılması önerilir.

Hasar kalıcı değil

Hatalı bir servis çalışanının kullanıcı deneyimini kesintiye uğratması korkutucu olabilir (özellikle de büyük ve tanınmış web sitelerinde) ancak zarar geçici ve geri döndürülebilir.

Durumu düzeltmek için işlemsiz bir hizmet çalışanı dağıtmak gerekiyorsa zaman ayırıp neyin yanlış gittiğini anlamaya çalışır. Gelecekte bir hizmet çalışanının yalnızca kendisinden 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 kendinizden emin olduğunuzda dağıtın.