Service Worker'ları içeren sayfalarda güncellemeler yayınlama

Andrew Guan
Andrew Guan
Demián Renzulli
Demián Renzulli

Bazı senaryolarda, Service Worker'ın etkin durumdaki herhangi bir kuruluşla proaktif olarak kontrol ettiği sekmelerdir. Örnekler:

  • Service Worker'ın yeni bir sürümü yüklendiğinde sayfayı bilgilendirme yeni işlevlere erişmesi için kullanıcıya bir "Yenilemek için güncelle" düğmesi gösterebilir hemen teslim edebilirsiniz.
  • Hizmet çalışanı tarafında önbelleğe alınan verilerde gerçekleşen bir değişikliği kullanıcıya bildirmek için "Uygulama artık çevrimdışı çalışmaya hazır" veya "Uygulamanın yeni sürümü içerik mevcut".
Güncelleme göndermek için sayfayla iletişim kuran bir hizmet çalışanının gösterildiği şema.

Service Worker'ın mesaj alması gerekmeyen durumlara bu tür kullanımlar denir. "güncelleme güncellemeleri" ile iletişim kurmak için bu sayfayı ziyaret edin. Bu kılavuzda, farklı proje yönetimi metodolojilerini standart özelliklerini kullanarak sayfalar ve hizmet çalışanları arasında bu tür bir iletişimin tarayıcı API'leri ve Workbox kitaplığı gibi özellikler dahildir.

Üretim durumları

Tinder

Tinder PWA, kullanıcıların dinlemek için workbox-window kullanıyor Service Worker yaşam döngüsü önemli anlarını ("yüklü", "kontrollü" ve "etkinleştirildi"). Bu şekilde, yeni bir hizmet çalışanı devreye girdiğinde "Güncelleme Mevcut" gösterilir. banner'ını kullanarak PWA'yı yenileyebilir ve en yeni özelliklere erişebilir:

Tinder'ın "Güncelleme Mevcut" web uygulamasının ekran görüntüsü işlevi görür.
Tinder PWA'da Service Worker, sayfaya yeni sürümün hazır olduğunu bildiriyor ve sayfada kullanıcılara "Güncelleme Mevcut" gösteriliyor banner'ı tıklayın.

Squoosh

Squoosh PWA'da, hizmet çalışanı gerekli tüm çevrimdışı çalışmasını sağlamak için sayfaya bir mesaj göndererek "Çevrimdışı çalışmaya hazır" kısa mesajı gönderin:

Squoosh web uygulamasının "Çevrimdışı çalışmaya hazır" ekran görüntüsü işlevi görür.
Squoosh PWA'da hizmet çalışanı, önbellek hazır olduğunda sayfada bir güncelleme yayınlar ve sayfada "Çevrimdışı çalışmaya hazır" ifadesi gösterilir. kısa mesaj.

Workbox'ı kullanma

Service Worker yaşam döngüsü etkinliklerini dinleyin

workbox-window, önemli hizmet çalışanı yaşam döngüsünü dinlemek için basit bir arayüz sağlar etkinlikler başlıklı makaleyi inceleyin. Temelde kitaplık, istemci tarafı API'ler (ör. updatefound ve statechange ve workbox-window nesnesinde daha üst düzey etkinlik işleyiciler sağlar. Böylece, bu etkinlikleri tükettiğini düşünelim.

Aşağıdaki sayfa kodu, Service Worker'ın yeni sürümü yüklendiğinde bunu tespit etmenizi sağlar. böylece kullanıcıya iletebilmek için:

const wb = new Workbox('/sw.js');

wb.addEventListener('installed', (event) => {
  if (event.isUpdate) {
    // Show "Update App" banner
  }
});

wb.register();

Önbellek verilerindeki değişiklikler sayfasını bildir

Çalışma kutusu paketi workbox-broadcast-update , önbelleğe alınan bir yanıtın güncellendiğini pencere istemcilerine bildirmek için standart bir yol sunar. Bu StaleOtherReValid ile birlikte en yaygın olarak kullanılır. stratejisini inceleyin.

Güncellemeleri yayınlamak için strateji seçeneklerinize broadcastUpdate.BroadcastUpdatePlugin ekleyin: hizmet çalışanı tarafı:

import {registerRoute} from 'workbox-routing';
import {StaleWhileRevalidate} from 'workbox-strategies';
import {BroadcastUpdatePlugin} from 'workbox-broadcast-update';

registerRoute(
  ({url}) => url.pathname.startsWith('/api/'),
  new StaleWhileRevalidate({
    plugins: [
      new BroadcastUpdatePlugin(),
    ],
  })
);

Web uygulamanızda aşağıdaki gibi etkinlikleri dinleyebilirsiniz:

navigator.serviceWorker.addEventListener('message', async (event) => {
  // Optional: ensure the message came from workbox-broadcast-update
  if (event.data.meta === 'workbox-broadcast-update') {
    const {cacheName, updatedUrl} = event.data.payload;

    // Do something with cacheName and updatedUrl.
    // For example, get the cached content and update
    // the content on the page.
    const cache = await caches.open(cacheName);
    const updatedResponse = await cache.match(updatedUrl);
    const updatedText = await updatedResponse.text();
  }
});

Tarayıcı API'lerini kullanma

Workbox'ın sağladığı işlevler ihtiyaçlarınız için yeterli değilse aşağıdaki tarayıcıyı kullanın "Yayın güncellemelerini" uygulayacak API'ler:

Yayın Kanalı API'si

Hizmet çalışanı, bir BroadcastChannel oluşturur nesne alır ve iletilerse buna benzer. Bu mesajları almakla ilgilenen herhangi bir bağlam (ör. sayfa) BroadcastChannel nesnesini tanımlayın ve mesaj almak için bir mesaj işleyici uygulayın.

Yeni bir hizmet çalışanı yüklendiğinde sayfayı bildirmek için aşağıdaki kodu kullanın:

// Create Broadcast Channel to send messages to the page
const broadcast = new BroadcastChannel('sw-update-channel');

self.addEventListener('install', function (event) {
  // Inform the page every time a new service worker is installed
  broadcast.postMessage({type: 'CRITICAL_SW_UPDATE'});
});

Sayfa, sw-update-channel için abone olarak şu etkinlikleri dinler:

// Create Broadcast Channel and listen to messages sent to it
const broadcast = new BroadcastChannel('sw-update-channel');

broadcast.onmessage = (event) => {
  if (event.data && event.data.type === 'CRITICAL_SW_UPDATE') {
    // Show "update to refresh" banner to the user.
  }
};

Bu basit bir tekniktir, ancak bununla ilgili sınırlama, tarayıcı desteğidir: Bu yazıyı yazıldığı anda, Safari bu API'yi desteklemiyor.

İstemci API'si

Client API, istemciler arasında hizmet çalışanının birden fazla müşteriyle iletişim kurma yöntemidir. Client nesne.

Odaklanılan son sekmeye mesaj göndermek için aşağıdaki Service Worker kodunu kullanın:

// Obtain an array of Window client objects
self.clients.matchAll(options).then(function (clients) {
  if (clients && clients.length) {
    // Respond to last focused tab
    clients[0].postMessage({type: 'MSG_ID'});
  }
});

Sayfa, şu mesajlara müdahale etmek için bir mesaj işleyici uygular:

// Listen to messages
navigator.serviceWorker.onmessage = (event) => {
     if (event.data && event.data.type === 'MSG_ID') {
         // Process response
   }
};

Client API, birden fazla etkin sekmeye bilgi yayınlama gibi durumlar için mükemmel bir seçenektir. İlgili içeriği oluşturmak için kullanılan API tüm önemli tarayıcılar tarafından desteklenir, ancak tüm yöntemleri desteklenmez. Tarayıcı desteğini kontrol edin anlamaktır.

Mesaj Kanalı

Mesaj Kanalı için gerekenler Sayfadan hizmet çalışanına bir bağlantı noktası geçirerek kanalı vardır. Sayfa, bir MessageChannel nesnesini örneklendirir ve postMessage() arayüzü üzerinden hizmet çalışanına bağlantı noktası:

const messageChannel = new MessageChannel();

// Init port
navigator.serviceWorker.controller.postMessage({type: 'PORT_INITIALIZATION'}, [
  messageChannel.port2,
]);

Sayfa, bir "onmessage" komutu uygulayarak mesajları dinler işleyicisi şu bağlantı noktasında:

// Listen to messages
messageChannel.port1.onmessage = (event) => {
  // Process message
};

Hizmet çalışanı, bağlantı noktasını alır ve buna bir referans kaydeder:

// Initialize
let communicationPort;

self.addEventListener('message', (event) => {
  if (event.data && event.data.type === 'PORT_INITIALIZATION') {
    communicationPort = event.ports[0];
  }
});

Bu noktadan sonra postMessage() öğesini çağırarak sayfaya mesaj gönderebilir. bağlantı noktası:

// Communicate
communicationPort.postMessage({type: 'MSG_ID' });

MessageChannel bağlantı noktalarının başlatılması gerektiğinden uygulanması daha karmaşık olabilir ancak tüm başlıca tarayıcılar tarafından desteklenir.

Sonraki adımlar

Bu kılavuzda, pencereden hizmet çalışanı iletişimine dair belirli bir durumu inceledik: "güncelleme güncellemeleri yayınla". İncelenen örnekler arasında önemli hizmet çalışanının dinlenmesi yer alır ve içerikteki ya da önbelleğe alınan verilerdeki değişikliklerle ilgili sayfaya iletilmesini sağlayan bir iletişim yöntemidir. Örneğin, Service Worker'ın sayfayla proaktif olarak iletişim kurduğu daha ilginç kullanım ve hiç mesaj almadan.

Pencere ve hizmet çalışanı iletişimleriyle ilgili diğer kalıplar için aşağıdaki makalelere göz atın:

Ek kaynaklar