Bu dokümanda henüz çok fazla yer verilmeyen bir Workbox modülü workbox-window
'dir. workbox-window
, window
'te çalışacak bir modül grubudur. Bu modülün hedefleri şunlardır:
- Geliştiricilerin hizmet çalışanı yaşam döngüsündeki kritik anları belirlemelerine ve bu anlarda yanıt vermeyi kolaylaştırarak hizmet çalışanı kaydını ve güncellemelerini kolaylaştırmak.
- Geliştiricilerin, bir hizmet çalışanını yanlış kapsama kaydetmek gibi yaygın hatalar yapmasını önlemek için.
window
ile Service Worker kapsamı arasındaki mesajlaşmayı basitleştirmek için.
workbox-window
dosyalarını içe aktarma ve kullanma
workbox-window
ürününden en sık kullanacağınız dışa aktarma işlemi, Workbox
sınıfıdır. Bu sınıfı Düğüm'de veya bir web sayfasındaki CDN'den içe aktarabilirsiniz.
Yerel paket oluşturma
Aracı zincirinizde webpack veya Rollup gibi bir paketleyici varsa workbox-window
'i yerel olarak paketleyebilirsiniz.
Öncelikle workbox-window
'ü uygulamanızın üretim bağımlılığı olarak yükleyin:
npm install workbox-window --save
Ardından, uygulamanızın JavaScript'inde, workbox-window
'dan Workbox
sınıfını import
:
<script type="module">
import {Workbox} from 'workbox-window';
if ('serviceWorker' in navigator) {
const wb = new Workbox('/sw.js');
wb.register();
}
</script>
workbox-window
oldukça küçük olsa da dinamik import
kullanarak sayfanızın ana uygulama mantığından bölebilirsiniz. Bu işlem sayfanızın ana paketinin boyutunu küçültebilir:
<script type="module">
if ('serviceWorker' in navigator) {
const {Workbox} = await import('workbox-window');
const wb = new Workbox('/sw.js');
wb.register();
}
</script>
CDN'yi kullanma
Önerilen yaklaşım olmasa da workbox-window
öğesini kullanmanın daha kolay bir yolu, dosyayı bir CDN'den içe aktarmaktır:
<script type="module">
import {Workbox} from 'https://storage.googleapis.com/workbox-cdn/releases/6.2.0/workbox-window.prod.mjs';
if ('serviceWorker' in navigator) {
const wb = new Workbox('/sw.js');
wb.register();
}
</script>
Yukarıdaki örnekte <script>
öğesinin type="module"
özelliğini kullandığına dikkat edin. Tarayıcıda statik import
ifadelerini derleme adımı olmadan kullanmak istiyorsanız bu gereklidir. Servis çalışanlarını destekleyen tüm büyük tarayıcılar JavaScript modüllerini de destekler. Bu nedenle, bu kodu herhangi bir tarayıcıya sunabilirsiniz. Eski tarayıcılar, type
özelliğinin değeri "module"
olan <script>
öğelerini yoksayar.
Hizmet çalışanı kaydetme
Bir hizmet çalışanını workbox-window
'e kaydetme işlemi, Workbox
sınıfının register
yöntemiyle aşağıdaki gibi yapılır:
import {Workbox} from 'workbox-window';
const wb = new Workbox('/sw.js');
wb.register();
Bunun, navigator.serviceWorker.register
kullanarak kendi hizmet çalışanı kaydetmenizle aynı olduğu anlaşılıyor. Ancak Workbox.register
, hizmet çalışanını kaydetmeden önce window
load
etkinliğine kadar beklemeyle ilgilenir. Bu, önceden önbelleğe almanın söz konusu olduğu durumlarda, sayfa açılışını geciktirebilecek bant genişliği anlaşmazlığının önlenebilmesi için tercih edilir.
window
ile hizmet çalışanı kapsamı arasında iletişim kurma
Service Worker'lar, window
ürününden ayrı olarak kendi kapsamına sahiptir ve window
içinde kullanılabilen API'lerin yalnızca bir alt kümesine erişebilirler. Ancak window
ile hizmet çalışanı arasında iletişim kurulabilir. workbox-window
, workbox-window
modülünün messageSW
yöntemiyle iki kapsam arasında daha kolay iletişim kurulmasını sağlar.
Çalışma kutusu, mesajlar için belirli bir biçim kullanır ve nesne aşağıdaki özelliklere sahiptir:
type
, mesajı tanımlayan gerekli bir benzersiz dizedir. Biçim büyük harflerle yazılmalı ve kelimeler alt çizgiyle ayrılmalıdır (örneğin,CACHE_URLS
).meta
, iletiyi gönderen Workbox paketinin adını temsil eden isteğe bağlı bir dizedir ve genellikle atlanır.payload
, göndermek istediğiniz verileri temsil eden isteğe bağlı bir parametredir. Bu, herhangi bir veri türü olabilir.
Aşağıda, hizmet çalışanınızdaki kodla başlayarak messageSW
'nin nasıl çalıştığına dair bir örnek verilmiştir:
// sw.js
const SW_VERSION = '1.0.0';
self.addEventListener('message', (event) => {
if (event.data.type === 'GET_VERSION') {
event.ports[0].postMessage(SW_VERSION);
}
});
Ardından web sayfanıza aşağıdaki kodu ekleyin:
const wb = new Workbox('/sw.js');
wb.register();
const swVersion = await wb.messageSW({type: 'GET_VERSION'});
console.log('Service Worker version:', swVersion);
Bir hizmet çalışanı ile window
arasında iletişim kurmanın faydalı olabileceği birçok durum vardır (ör. bir hizmet çalışanı güncellemesi mevcut olduğunda kullanıcıyı bilgilendirme). Bu tarif, self.skipWaiting
için messageSkipWaiting
adlı özel bir yardımcı yöntem kullanır. Bu yöntem, type
değeri SKIP_WAITING
olan bir ileti gönderir.