çalışma kutusu-penceresi

workbox-window paketi, şurada çalışmak üzere tasarlanmış bir modül grubudur: window bağlam web sayfalarınızın içinde. Diğer çalışma kutusunu tamamlar hizmet çalışanı içinde çalıştırılan pakettir.

workbox-window ürününün temel özellikleri/hedefleri şunlardır:

Çalışma kutusu penceresini içe aktarma ve kullanma

workbox-window paketi için birincil giriş noktası Workbox sınıfıdır ve kodu CDN'mizden veya popüler uygulamalardan herhangi birini kullanarak JavaScript gruplandırma araçları.

CDN'mizi kullanma

Sitenizdeki Workbox sınıfını içe aktarmanın en kolay yolu CDN'mizdir:

<script type="module">
  import {Workbox} from 'https://storage.googleapis.com/workbox-cdn/releases/6.4.1/workbox-window.prod.mjs';

  if ('serviceWorker' in navigator) {
    const wb = new Workbox('/sw.js');

    wb.register();
  }
</script>

Bu örneğin, şu işlemler için <script type="module"> ve import ifadesinin kullanıldığına dikkat edin: Workbox sınıfını yükler. Bunu her ne kadar farklı proje yönetimi süreçlerini eski tarayıcılarda çalışmasını sağlamak için büyük kod içerir, bu aslında gerekli değildir.

Hizmet çalışanını destekleyen tüm büyük tarayıcılar, yerel JavaScript modüllerini de desteklemektedir. Dolayısıyla, tüm tarayıcılara sorunsuz bir şekilde sunabilir (eski tarayıcılar bunu görmezden gelir).

JavaScript paketleyicileri içeren Çalışma Kutusu yükleniyor

workbox-window kullanmak için kesinlikle herhangi bir araç gerekli olmasa da içerisindeki gibi bir paketleyici içerir. çalışan webpack veya Toplayıcı Bu bağımlılıkları npm bağımlılıklarıyla, workbox-window yükleyin.

İlk adım yükleme Uygulamanızın bağımlılığı olarak workbox-window:

npm install workbox-window

Ardından, uygulamanızın JavaScript dosyalarından birinde, import çalışma kutusunu workbox-window paket adını referans alıyor:

import {Workbox} from 'workbox-window';

if ('serviceWorker' in navigator) {
  const wb = new Workbox('/sw.js');

  wb.register();
}

Paketleyiciniz dinamik içe aktarma ifadeleri aracılığıyla kod bölmeyi destekliyorsa workbox-window değerini de koşullu olarak yükleyebilirsiniz. Bu, sayfanızın ana paketinin boyutunu belirleyin.

workbox-window çok küçük olsa da bir nedeni yoktur ve hizmet çalışanları olarak sitenizin temel uygulama mantığıyla doğaları gereği ilerleyen bir gelişimdir.

if ('serviceWorker' in navigator) {
  const {Workbox} = await import('workbox-window');

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

Gelişmiş paketleme kavramları

Hizmet çalışanında çalışan Çalışma Kutusu paketlerinin aksine, derleme dosyaları workbox-window tarafından referans verildi main ve Şurada module alan var: package.json, ES5'e aktarılır. Bu da onları günümüzde kullanılan yardımcı olacak araçlar geliştiriyoruz. Bu araçların bir kısmı, geliştiricilerin node_module bağımlılıkları.

Derleme sisteminiz bağımlılıklarınızı dönüştürmenize izin veriyorsa (veya hiçbir kodunuzu dönüştürmeniz gerekmiyorsa, belirli bir dosyayı kaynak dosya eklemeniz gerekir.

Workbox içe aktarmanın çeşitli yolları ve açıklamaları her birinin sonucu ne olur?

// Imports a UMD version with ES5 syntax
// (pkg.main: "build/workbox-window.prod.umd.js")
const {Workbox} = require('workbox-window');

// Imports the module version with ES5 syntax
// (pkg.module: "build/workbox-window.prod.es5.mjs")
import {Workbox} from 'workbox-window';

// Imports the module source file with ES2015+ syntax
import {Workbox} from 'workbox-window/Workbox.mjs';

Örnekler

Workbox sınıfını içe aktardıktan sonra sınıfa kaydolmak ve hizmet çalışanınızla etkileşime geçin. Aşağıda, Uygulamanızda Workbox:

Bir hizmet çalışanı kaydetme ve hizmet çalışanı etkin olduğunda kullanıcıyı ilk kez bilgilendirme

Birçok web uygulaması, uygulamalarının çalışması için öğeleri önceden önbelleğe almak üzere hizmet çalışanı kullanır. çevrimdışıyken de kullanılamaz. Bazı durumlarda, bir projeyi tamamlamak için uygulamanın artık çevrimdışı kullanılabilir olduğunu kullanıcıya bildirmelidir.

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

wb.addEventListener('activated', event => {
  // `event.isUpdate` will be true if another version of the service
  // worker was controlling the page when this version was registered.
  if (!event.isUpdate) {
    console.log('Service worker activated for the first time!');

    // If your service worker is configured to precache assets, those
    // assets should all be available now.
  }
});

// Register the service worker after event listeners have been added.
wb.register();

Bir hizmet çalışanı yüklüyse ancak etkinleştirilmeyi beklerken takılırsa kullanıcıyı bilgilendir

Mevcut bir hizmet çalışanı tarafından kontrol edilen bir sayfa yeni bir hizmet kaydettiğinde hizmet çalışanı, tüm istemciler arasında geçiş yapmadığı sürece ilk hizmet çalışanı tarafından kontrol edilenler tamamen kaldırıldı.

Bu durum, özellikle olduğu durumlarda geliştiriciler için geçerli sayfanın yeniden yüklenmesi yeni hizmet çalışanının etkinleştirilmesine neden olmaz.

Kafa karışıklığını en aza indirmek ve söz konusu durumun ne zaman yaşandığını netleştirmek için Workbox sınıfı, dinleyebileceğiniz bir waiting etkinliği sağlar:

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

wb.addEventListener('waiting', event => {
  console.log(
    `A new service worker has installed, but it can't activate` +
      `until all tabs running the current version have fully unloaded.`
  );
});

// Register the service worker after event listeners have been added.
wb.register();

workbox-broadcast-update paketindeki önbellek güncellemelerini kullanıcıya bildir

workbox-broadcast-update paketi, hem önbellekten içerik sunmanın (hızlı teslim için) hem de söz konusu içerikle ilgili güncellemeleri kullanıcıya bildirebilmek ( değerlendirmeyi tekrarlama stratejisini kullanın.

Pencereden bu güncellemeleri almak için şu cihazın message etkinliklerini dinleyebilirsiniz: CACHE_UPDATED yazın:

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

wb.addEventListener('message', event => {
  if (event.data.type === 'CACHE_UPDATED') {
    const {updatedURL} = event.data.payload;

    console.log(`A newer version of ${updatedURL} is available!`);
  }
});

// Register the service worker after event listeners have been added.
wb.register();

Hizmet çalışanına, önbelleğe alınacak URL'lerin listesini gönder

Bazı uygulamalarda, olması gereken tüm öğeleri önceden önbelleğe alınmış olsa da, bazı uygulamalar tamamen farklı sayfalar sunar, Kullanıcı tarafından ilk olarak ulaştığı URL'ye göre.

İkinci kategorideki uygulamalarda yalnızca öğeleri önbelleğe almak mantıklı olabilir. kullanıcının ziyaret ettiği belirli sayfa için gerekli olmasıdır. workbox-routing paketinde, şunları yapabilirsiniz: yönlendiricinize önbelleğe alınacak URL'lerin bir listesini gönderin, bu URL'leri yönlendiricinin kendisinde tanımlanan kurallara uyar.

Bu örnek, bir bağlantı kurulduğunda sayfa tarafından yüklenen URL'lerin bir listesini yönlendiriciye yeni hizmet çalışanı etkinleştirilir. Yalnızca tüm URL'leri gönderebilirsiniz çünkü yalnızca Service Worker'da tanımlanmış bir rotayla eşleşen URL'ler önbelleğe alınır:

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

wb.addEventListener('activated', event => {
  // Get the current page URL + all resources the page loaded.
  const urlsToCache = [
    location.href,
    ...performance.getEntriesByType('resource').map(r => r.name),
  ];
  // Send that list of URLs to your router in the service worker.
  wb.messageSW({
    type: 'CACHE_URLS',
    payload: {urlsToCache},
  });
});

// Register the service worker after event listeners have been added.
wb.register();

Service Worker yaşam döngüsü anları

Service Worker yaşam döngüsü karmaşıktır ve tam olarak anlaşılması zor olabilir. Bir proje yönetimi O kadar karmaşık ki, olası tüm kullanımları için tüm uç hizmet çalışanı (ör. birden fazla hizmet çalışanı kaydettirme, kayıt farklı karelerde farklı hizmet çalışanları göstererek hizmet çalışanlarını farklı adlar vb. kullanabilirsiniz).

Ancak Service Worker'ı uygulayan çoğu geliştirici, basit olduğu için tüm bu uç durumları ele alacağız. Çoğu geliştirici sayfa yükleme başına yalnızca bir hizmet çalışanı kaydedebilir ve hizmet çalışanının adını değiştirmez dosyasını tıklayın.

Workbox sınıfı, hizmet çalışanı yaşam döngüsü için bu basit görünümü kullanır hizmet çalışanı kayıtlarını iki kategoriye ayırarak kendine ait kayıtlı hizmet çalışanı ve harici bir hizmet çalışanıdır:

  • Kayıtlı hizmet çalışanı: register() çağrısı yapan Workbox örneğinin veya zaten etkin olan öğenin sonucu register() çağrısı, kayıtta bir updatefound etkinliğini tetiklemediyse hizmet çalışanı.
  • Harici hizmet çalışanı: Yüklemeye başlamış bir hizmet çalışanı register() çağrısı yapan Workbox örneğinden bağımsız olarak. Bu genelde Kullanıcı başka bir sekmede sitenizin yeni sürümünü açtığında gerçekleşir. Bir etkinlik harici bir hizmet çalışanından kaynaklanıyor, etkinliğin isExternal özelliği true olarak ayarlanır.

Bu iki hizmet çalışanı türü göz önünde bulundurulduğunda, önemli hizmet çalışanı yaşam döngüsü anları ve geliştirici önerileri şu bilgilerden faydalanabilirsiniz:

Service Worker ilk kez yüklendiğinde

Service Worker'ın ilk yüklenişini ilk kez ve gelecekteki tüm güncellemelere yönelik yaklaşımınızdan farklı bir yol izler.

workbox-window ürününde, ilk olarak sürüm arasında ayrım yapabilirsiniz isUpdate özelliğini kontrol ederek yükleme ve gelecekteki güncellemeleri almak için dahil edilir. İlk yüklemede isUpdate, false.

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

wb.addEventListener('installed', event => {
  if (!event.isUpdate) {
    // First-installed code goes here...
  }
});

wb.register();
Etkinlik Etkinlik Önerilen işlem
Yeni bir hizmet çalışanı yüklendi (ilk kez) installed

Bir hizmet çalışanı ilk kez yüklendiğinde genellikle önbelleğe alınır sitenin çevrimdışı çalışması için gereken tüm öğeler. Matbu kataloğun boyutlarını, kullanıcıya sitesinin artık çevrimdışı çalışabileceğini bildirir.

Ayrıca, bir Service Worker ilk yüklediğinde bunu otomatik olarak söz konusu sayfa yüklemesinde müdahale edilmiş getirme etkinlikleri varsa bunları önbelleğe almayı da yüksek seviyeli öğeleri (ancak bu öğeler için öğeler zaten önbelleğe alınıyor). hizmet çalışanı, önbelleğe alınacak URL'lerin listesi örneği, bu.

Hizmet çalışanı sayfayı kontrol etmeye başladı controlling

Yeni bir hizmet çalışanı yüklenip sayfayı kontrol etmeye başladığında sonraki tüm getirme etkinlikleri bu hizmet çalışanından geçer. Eğer hizmet çalışanı, belirli getirme etkinliğini işlemek için özel bir mantık ekler. mantığın işe yarayacağını bildiğiniz nokta burasıdır.

Service Worker'ı ilk yüklediğinizde yüklenirken geçerli sayfayı kontrol etmeye başlamaz. araması clients.claim() öğesini etkinleştirin. Varsayılan kontrol etmeye başlamak için sonraki sayfanın yüklenmesini beklemektir.

workbox-window açısından bu, controlling etkinliği yalnızca hizmet çalışanı, clients.claim() komutunu çağırır. Bu etkinlik sayfa kayıttan önce kontrol edilmişse gönderilir.

Hizmet çalışanı, etkinleştirme işlemini tamamladı activated

Yukarıda belirtildiği gibi, Service Worker ilk kez bir sonraki seferde sayfayı kontrol etmeye başlamış olabilir (veya başlamayabilir).

Bu nedenle, bir yol olarak etkinleştirme etkinliğini hizmet çalışanının sayfanın kontrolünü ele aldığı zamanı bilmek. Ancak, aktif etkinlikte bir mantık çalıştırıyorsanız (hizmet çalışanında) ve işlemi tamamladığında bunu otomatik olarak yaparsa etkinleştirilen etkinlik, unutmayın.

Hizmet çalışanının güncellenmiş bir sürümü bulunduğunda

Mevcut bir sürümün yüklü olduğu ancak yeni bir hizmet çalışanı yüklenmeye başladığında sayfayı kontrol ettiğinde, aşağıdaki tüm etkinliklerin isUpdate özelliği true olmalıdır.

Bu durumda tepkiniz ilk başta verilenden genellikle farklıdır çünkü kullanıcının bu güncellemeyi ne zaman ve nasıl alacağını yönetmeniz gerekir.

Etkinlik Etkinlik Önerilen işlem
Yeni bir hizmet çalışanı yüklendi (önceki çalışan güncelleniyor) installed

Bu ilk Service Worker yüklemesi değilse (event.isUpdate === true), hizmet çalışanı bulundu ve yüklendi (yani farklı bir sürümü .

Bu genellikle sitenin daha yeni bir sürümünün veya yeni öğeler önbellekten almayı az önce bitirmiş olabilir.

Not: Bazı geliştiriciler, installed etkinliğini kullanarak yeni bir sürümünün olduğunu bildirmeliyiz. Ancak, arayıp araman skipWaiting() varsa, hizmet çalışanı hemen etkin olabilir veya etmeyebilir. Şu durumda: skipWaiting() numaralı telefonu ara, kullanıcıları bilgilendirmek en iyisidir yeni hizmet çalışanı etkinleştikten sonra da güncelleme skipWaiting adlı kişiyi aramayın. Bunu, kendilerini bekleyen güncellemedeki bekleyen güncelleme (daha fazla ayrıntı için aşağıya bakın).

Bir hizmet çalışanı yüklendi ancak bekleme aşamasında takıldı waiting

Hizmet çalışanınızın güncellenmiş sürümü çağırmıyorsa skipWaiting() yüklenirken şu anda çalışmaz Şu anda etkin olan hizmet çalışanı tarafından kontrol edilen tüm sayfalar olana kadar etkinleştir geri yüklendi. Kullanıcıya bir güncelleme olduğunu bildirmek isteyebilirsiniz ve bir sonraki ziyaretlerinde uygulanır.

Uyarı! Geliştiricilerin kullanıcılara istem göstermeleri yaygın bir durumdur. güncellemeyi almak için sayfayı yeniden yükleyin, ancak çoğu durumda sayfanın yenilenmesi yüklü çalışanı etkinleştirmez. Öğe Kullanıcı sayfayı yenilerse ve hizmet çalışanı hâlâ bekliyordur. waiting etkinliği tekrar tetiklenir ve event.wasWaitingBeforeRegister özelliği true (doğru) değerine ayarlanır. Not, Gelecekteki bir sürümde bu deneyimi iyileştirmeyi planlıyoruz. 1848 numaralı sorunu takip edin başlıklı makaleye göz atın.

Diğer bir seçenek de kullanıcıya güncellemeyi kabul edin veya beklemeye devam edin. Güncellemeyi almayı seçerseniz şunları yapabilirsiniz: hizmet çalışanına çalışmasını söylemek için postMessage() öğesini kullanın skipWaiting(). Gelişmiş yemek tarifini göster Örneğin, kullanıcılar için sayfayı yeniden yükleme olanağı sunun.

Hizmet çalışanı sayfayı kontrol etmeye başladı controlling

Güncellenen bir hizmet çalışanı sayfayı kontrol etmeye başladığında hizmet çalışanınızın şu anda kontrol ettiği sürümü farklı Sayfa yüklendiğinde kontrol sahibi olan sürüm. Bazı durumlarda bir sorun yaratmayabilir ancak aynı zamanda mevcut sayfa artık önbellekte bulunmaz (ve muhtemelen sunucuda da bulunmaz). Kullanıcıya, sayfanın bazı bölümlerinin kullanıcılar tarafından düzgün çalışmayabilir.

Not: controlling etkinliği tetiklenmez hizmet çalışanınızda skipWaiting() çağrısı yapmazsanız.

Hizmet çalışanı, etkinleştirme işlemini tamamladı activated Güncellenmiş bir hizmet çalışanı etkinleştirmeyi tamamladığında bu, hizmet çalışanının activate mantığında çalıştırdığınız mantık tamamlandı. Herhangi bir şeyi, bu mantığa göre ertelenmesi gereken şimdi çalıştıracaksınız.

Hizmet çalışanının beklenmeyen bir sürümü bulunduğunda

Bazen kullanıcılar sitenizi arka plandaki bir sekmede çok uzun bir süre açık tutar gerekir. Hatta yeni bir sekme açıp web sitenize farkında olmadan gidebilirler. siteniz zaten arka plandaki bir sekmede açık. Böyle durumlarda sitenizin iki sürümünün aynı anda yayınlanmasını mümkün kılmak ve geliştirici olarak bazı ilginç sorunlar ortaya koyabilirsiniz.

Sitenizde v1 A sekmesinin ve B sekmesinin çalıştığı bir senaryo düşünün. sürümünü kullanıyorsunuz. B sekmesi yüklendiğinde hizmetinizin sürümü tarafından kontrol edilir v1 ile gönderilmiş, ancak sunucu tarafından döndürülen sayfa (bir ağ öncelikli önbelleğe alma stratejisi (gezinme istekleriniz için) tüm v2 öğelerinizi içerir.

Ancak v2'nizi yazarken bu durum, B sekmesi için genellikle bir sorun değildir. v1 kodunuzun nasıl çalıştığını biliyordunuz. Ancak bu, bir soruna neden olabilir. Zira v1 kodunuz,programda değişikliklerinden bahsedeceğiz.

workbox-window, bu durumların ele alınmasına yardımcı olmak için yaşam döngüsünü "harici" bir kaynaktan güncelleme algıladığında etkinlikleri hizmet çalışanıdır. "harici" anlamına gelir, mevcut Workbox sürümü ile aynı olmayan herhangi bir sürüm örneği kaydedildi.

Workbox v6 ve sonraki sürümlerde bu etkinlikler, belgelenen etkinliklerle eşdeğerdir. (her etkinliğe bir isExternal: true özelliği eklenerek) nesnesini tanımlayın. Web uygulamanızın, bir "harici" hizmet çalışanı varsa bu özelliği etkinlik işleyicilerinizde kontrol edebilirsiniz.

Yaygın hatalardan kaçınma

Workbox'ın sunduğu en faydalı özelliklerden biri, geliştirici günlük kaydıdır. Ve bu özellikle workbox-window için geçerlidir.

Service Worker ile geliştirme yapmak genellikle kafa karıştırıcı olabilir. beklenmedik durumlarla karşılaşabilirsiniz. Nedenini bilmek zor olabilir.

Örneğin, Service Worker'ınızda değişiklik yapıp sayfayı yeniden yüklediğinizde bu değişikliği tarayıcınızda göremeyebilirsiniz. Bunun en olası nedeni hizmet çalışanınız hâlâ etkinleştirilmeyi bekliyordur.

Ancak Workbox sınıfında bir hizmet çalışanı kaydederken üzerindeki tüm yaşam döngüsü durumu değişiklikleri hakkında İşlerin beklediğiniz gibi olmamasının nedenlerini bulup

Bekleyen çalışan için çalışma kutusu-pencere konsolu uyarısı

Ayrıca geliştiricilerin Service Worker'ı ilk kez kullanırken yaygın olarak yaptıkları bir hata hizmet çalışanının yanlış kapsam.

Bunun olmasını önlemek için Workbox sınıfı, hizmet çalışanının kaydedildiği sayfa, bu hizmet çalışanının kapsamında değil. Bu Ayrıca, Service Worker'ınızın aktif olduğu ancak henüz etkin olmadığı durumlarda da sayfayı kontrol etme:

Kontrol etmeyen çalışan için çalışma kutusu penceresi konsol uyarısı

Pencereden hizmete çalışana iletişim

Gelişmiş Service Worker kullanımının çoğu, kullanıcı ile hizmet çalışanı ve pencere. Workbox sınıfı bu konuda da yardımcı oluyor. messageSW() yöntemi sağlar. Bu yöntem, örneğin postMessage() hizmet çalışanı kayıtlıdır ve yanıt bekleyin.

Hizmet çalışanına herhangi bir biçimde veri gönderebilirsiniz ancak Workbox paketlerinin üç özelliği olan bir nesnedir (son ikisi isteğe bağlı):

Özellik Zorunlu mu? Tür Açıklama
type Evet string

Bu mesajı tanımlayan benzersiz bir dize.

Kural olarak, türlerin tümü büyük harflidir ve birbirinden alt çizgilerle ayrılır kelimeler. Tür, yapılacak bir işlemi temsil ediyorsa bu bir komut olmalıdır şimdiki zaman (ör. CACHE_URLS); tür değeri temsil ediyorsa yalnızca geçmiş zamana sahip olmalıdır (ör. URLS_CACHED) tıklayın.

meta hayır string Çalışma Kutusu'nda bu her zaman mesajını alırsınız. Kendiniz mesaj gönderirken bu özelliği atlayabilirsiniz veya bu ayarı istediğiniz gibi yapabilirsiniz.
payload hayır * Gönderilmekte olan veriler. Bu genellikle bir nesnedir, ancak olmak zorunda değildir.

messageSW() yöntemiyle gönderilen mesajlarda MessageChannel kullanılır. Dolayısıyla alıcı yanıt verebiliyor. Bir mesajı yanıtlamak için şu numarayı arayabilirsiniz: Mesaj etkinliği işleyicinizde event.ports[0].postMessage(response). İlgili içeriği oluşturmak için kullanılan messageSW() yöntemi, response değerine çözümlenecek bir söz döndürür. tercih edebilirsiniz.

Aşağıda, pencereden hizmet çalışanına ileti göndermeyle ilgili bir örnek verilmiştir: yanıt alabilirsiniz. İlk kod bloğu, hizmet çalışanı, ikinci blok ise Workbox sınıfını kullanarak mesaj yazıp yanıtı bekleyin:

sw.js'deki kod:

const SW_VERSION = '1.0.0';

addEventListener('message', event => {
  if (event.data.type === 'GET_VERSION') {
    event.ports[0].postMessage(SW_VERSION);
  }
});

main.js'deki kod (pencerede çalışan):

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

const swVersion = await wb.messageSW({type: 'GET_VERSION'});
console.log('Service Worker version:', swVersion);

Sürüm uyumsuzluklarını yönetme

Yukarıdaki örnekte, Service Worker'ı kontrol etmeyi nasıl uygulayabileceğiniz gösterilmektedir sürümünü seçin. Bu örnek, eski bir feed'i gönderirken hizmet çalışanı arasında ne kadar sık iletişim kurduğunuzu hizmet çalışanınızın farklı bir sürümle çalışmayabileceğini sitenize ve bu durumun çözümüne ilişkin Sayfalarınızı ağ öncelikli olarak yayınlıyor olmanıza bağlı olarak farklı bir sorun veya önbellek öncelikli.

Önce ağ

Sayfa ağınız ilk olarak sunulurken, kullanıcılarınız her zaman HTML'nizin en son sürümünü kaldırın. Ancak bir kullanıcı ilk kez sitenizi yeniden ziyaret ettiğinde (bir güncellemeyi dağıttıktan sonra) aldığı HTML ancak tarayıcısında çalışan hizmet çalışanı daha önce yüklenmiş bir sürüm (muhtemelen birçok eski sürüm).

Bu olasılığı anlamak önemlidir çünkü JavaScript bir mesajı gönderirken sayfanızın eski sürümüne bir ileti gönderir. o sürüm nasıl yanıt vereceğini bilmeyebilir (veya uyumlu olmayan bir biçim).

Sonuç olarak, hizmet çalışanınızı her zaman bir sürümle ayarlayıp uyumlu sürümler yüklü olduğundan emin olun.

Örneğin, yukarıdaki kodda bu yapılandırmanın döndürdüğü hizmet çalışanı sürümü messageSW() çağrısı beklenenden eski olduğu için beklemek mantıklı olabilir bir güncelleme bulunana kadar (register() numaralı telefonu aradığınızda bu durum gerçekleşir). Kuyruklu a işareti Bu noktada, kullanıcıyı bilgilendirebilir veya güncellemeyi tercih edebilirsiniz. bekleme aşamasını atlama hemen etkinleştirin.

Önce önbelleğe alın

Sayfalarınızı önbellek üzerinden sunarken sayfaları ağ öncelikli olarak yayınlamanın aksine, sayfanızın başlangıçta her zaman kullandığınız sürümle aynı sürüm olacağını hizmet çalışanınıza (çünkü bu hizmeti sunuyordu). Sonuç olarak, messageSW() hemen kullanmak için.

Ancak Service Worker'ınızın güncellenmiş bir sürümü bulunur ve etkinleştirilirse Sayfanız register() çağırdığında (yani kasıtlı olarak bekleme aşamasını atladığınızda), bu e-posta adresine mesaj göndermeniz artık güvenli olmayabilir.

Bu olasılığı yönetmeye yönelik stratejilerden biri, size, son dakika güncellemeleri ile tam olmayan güncellemeleri birbirinden ayırmanızı sağlar. Bu nedenle, bozulan bir güncelleme durumunda, hizmet çalışanıdır. Bunun yerine, kullanıcılarınızı eski bir uygulama veya ve güncellemeyi almak için sayfayı yeniden yüklemelerini öneririz.

Bekleyen yardımcıyı atla

Pencereden hizmet çalışanına mesajlaşma için yaygın bir kullanım kuralı, Şuna yüklenmiş bir hizmet çalışanına talimat vermek için {type: 'SKIP_WAITING'} mesajı: bekleme aşamasını atlama ve etkinleştirebilirim.

Workbox v6 sürümünden itibaren, birmessageSkipWaiting() {type: 'SKIP_WAITING'} mesajıyla ilişkili bekleyen hizmet çalışanına mevcut hizmet çalışanı kaydı. E-postanızda herhangi bir hizmet çalışanı var.

Türler

Workbox

Service Worker kaydı, güncellemeleri ve veya hizmet çalışanı yaşam döngüsü olaylarına tepki vermek.

Özellikler

  • oluşturucu

    geçersiz

    Komut dosyası URL'si ve hizmet çalışanı ile yeni bir Workbox örneği oluşturur seçenekleri vardır. Komut dosyası URL'si ve seçenekleri, navigator.serviceWorker.register(scriptURL, options) çağrısı yapılır.

    constructor işlevi aşağıdaki gibi görünür:

    (scriptURL: string | TrustedScriptURL, registerOptions?: object) => {...}

    • scriptURL

      string | TrustedScriptURL

      Hizmet çalışanı komut dosyası bu örnekle ilişkilidir. Bir TrustedScriptURL desteklenir.

    • registerOptions

      nesne isteğe bağlı

  • etkin

    Promise&lt;ServiceWorker&gt;

  • kontrol ediyor

    Promise&lt;ServiceWorker&gt;

  • getSW

    geçersiz

    Komut dosyası URL'si ile eşleşen bir Service Worker referansıyla çözümlenir bu örnek için kullanılabilir hale gelir.

    Kayıt sırasında zaten etkin veya bekleyen bir hizmet varsa eşleşen bir komut dosyası URL'si varsa bu URL kullanılır (bekleyen hizmet çalışanının, etkin hizmet çalışanına göre öncelikli olmasını sağlar. olacaktır. Bunun nedeni, bekleyen hizmet çalışanının bu alan için daha fazla kayıt ). Kayıtta eşleşen etkin veya bekleyen hizmet çalışanı yoksa bir güncelleme bulup başlayana kadar taahhüt devam etmez yükleme sırasında hizmet çalışanı kullanılır.

    getSW işlevi aşağıdaki gibi görünür:

    () => {...}

    • returns

      Promise&lt;ServiceWorker&gt;

  • messageSW

    geçersiz

    İletilen veri nesnesini bu kuruluş tarafından kaydedilen hizmet çalışanına gönderir örnek (workbox-window.Workbox#getSW üzerinden) ve bir yanıt (varsa) gönderin.

    Service Worker'daki mesaj işleyicide yanıt ayarlanabilir. event.ports[0].postMessage(...) aranıyor, böylece söz edilenler messageSW() tarafından iade edildi. Yanıt verilmezse vaat çözer.

    messageSW işlevi aşağıdaki gibi görünür:

    (data: object) => {...}

    • veri

      nesne

      Hizmet çalışanına gönderilecek nesne

    • returns

      Söz veriyorum<herhangi biri>

  • messageSkipWaiting

    geçersiz

    Şu hizmet çalışanına {type: 'SKIP_WAITING'} mesajı gönderir: şu anda mevcut kayıtla ilişkili waiting durumunda.

    Geçerli bir kayıt yoksa veya hizmet çalışanı waiting ise bunu çağırmanın herhangi bir etkisi olmaz.

    messageSkipWaiting işlevi aşağıdaki gibi görünür:

    () => {...}

  • register

    geçersiz

    Bu örnek komut dosyası URL'si ve hizmeti için bir hizmet çalışanı kaydeder seçenekleri sunar. Varsayılan olarak bu yöntem, kaydı pencere yüklendi.

    register işlevi aşağıdaki gibi görünür:

    (options?: object) => {...}

    • seçenekler

      nesne isteğe bağlı

      • hemen

        boole isteğe bağlı

    • returns

      Promise&lt;ServiceWorkerRegistration&gt;

  • update

    geçersiz

    Kayıtlı hizmet çalışanının güncellemelerini kontrol eder.

    update işlevi aşağıdaki gibi görünür:

    () => {...}

    • returns

      Taahhüt<void>

WorkboxEventMap

Özellikler

WorkboxLifecycleEvent

Özellikler

  • isExternal

    boole isteğe bağlı

  • isUpdate

    boole isteğe bağlı

  • originalEvent

    Etkinlik isteğe bağlı

  • sw

    ServiceWorker isteğe bağlı

  • hedef

    WorkboxEventTarget isteğe bağlı

  • tür

    typeOperator

WorkboxLifecycleEventMap

Özellikler

WorkboxLifecycleWaitingEvent

Özellikler

  • isExternal

    boole isteğe bağlı

  • isUpdate

    boole isteğe bağlı

  • originalEvent

    Etkinlik isteğe bağlı

  • sw

    ServiceWorker isteğe bağlı

  • hedef

    WorkboxEventTarget isteğe bağlı

  • tür

    typeOperator

  • wasWaitingBeforeRegister

    boole isteğe bağlı

WorkboxMessageEvent

Özellikler

  • veri

    herhangi

  • isExternal

    boole isteğe bağlı

  • originalEvent

    Etkinlik

  • ports

    typeOperator

  • sw

    ServiceWorker isteğe bağlı

  • hedef

    WorkboxEventTarget isteğe bağlı

  • tür

    "message"

Yöntemler

messageSW()

workbox-window.messageSW(
  sw: ServiceWorker,
  data: object,
)

postMessage üzerinden hizmet çalışanına veri nesnesi gönderir ve şu işlemle çözümlenir: yanıt (varsa).

Service Worker'daki mesaj işleyicide yanıt ayarlanabilir. event.ports[0].postMessage(...) aranıyor, böylece söz edilenler messageSW() tarafından iade edildi. Yanıt verilmezse taahhüt çözer.

Parametreler

  • sw

    ServiceWorker

    Mesajın gönderileceği hizmet çalışanıdır.

  • veri

    nesne

    Hizmet çalışanına gönderilecek nesne.

İadeler

  • Söz veriyorum<herhangi biri>