Bu dokümanda henüz yeterli kapsamı bulunmayan Çalışma Kutusu modüllerinden biri olan workbox-window
, window
üzerinde çalışması amaçlanan bir dizi modüldür. Bu modülün hedefleri şunlardır:
- Geliştiricilerin hizmet çalışanı yaşam döngüsündeki kritik anları belirlemelerine yardımcı olarak hizmet çalışanı kaydını ve güncellemeleri basitleştirir ve bu anlarda yanıt vermeyi kolaylaştırır.
- Geliştiricilerin, bir hizmet çalışanını yanlış kapsamda kaydettirmek gibi yaygın hatalar yapmasını önlemek için.
window
ile hizmet çalışanı kapsamı arasındaki mesajlaşmayı basitleştirmek için.
workbox-window
içe aktarılıyor ve kullanılıyor
workbox-window
kaynağından en sık kullanacağınız dışa aktarma işlemi, Düğümde veya bir web sayfasındaki CDN'den içe aktarabileceğiniz Workbox
sınıfıdır.
Yerel paket oluşturma
Araç zincirinizde webpack veya Toplayıcı gibi bir paketleyici varsa workbox-window
'yi yerel olarak gruplandırabilirsiniz.
Öncelikle, uygulamanızın üretim bağımlılığı olarak workbox-window
uygulamasını yükleyin:
npm install workbox-window --save
Ardından, uygulamanızın JavaScript'inde workbox-window
öğesinden 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, sayfanızın ana paketinin boyutunu küçültebilecek dinamik import
özelliğini kullanarak onu web sitenizin temel uygulama mantığından bölebilirsiniz:
<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
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 yer alan <script>
öğesinin type="module"
özelliğini kullandığını unutmayın. Tarayıcıda derleme adımı olmadan statik import
ifadelerini kullanmak istiyorsanız bu gereklidir. Service Worker'ları destekleyen başlıca tüm tarayıcılar JavaScript modüllerini de destekler. Bu nedenle, eski tarayıcılar type
özellik değeri "module"
olan <script>
öğelerini yoksayacağından, bu kodu tüm tarayıcılara sunabilirsiniz.
Hizmet çalışanı kaydetme
workbox-window
ile bir hizmet çalışanı kaydetme işlemi, Workbox
sınıfının register
yöntemiyle yapılır ve şu şekilde yapılır:
import {Workbox} from 'workbox-window';
const wb = new Workbox('/sw.js');
wb.register();
Bu işlem, navigator.serviceWorker.register
aracını kullanarak kendiniz bir hizmet çalışanı kaydettirmekle aynı gibi görünebilir. Ancak Workbox.register
, hizmet çalışanını kaydetmeden önce window
load
etkinliğine kadar beklemeyi üstlenir. Önbelleğe almanın söz konusu olduğu durumlarda bu tercih edilir. Böylece, sayfa başlangıcını geciktirebilecek bant genişliği çakışması önlenebilir.
window
ve hizmet çalışanı kapsamı arasında iletişim
Service Worker'lar window
dışında kendi kapsamlarına sahiptir ve window
içinde bulunan API'lerin yalnızca bir alt kümesine erişebilir. Ancak window
ve hizmet çalışanı arasında iletişim kurulabilir. workbox-window
, workbox-window
modülünün messageSW
yöntemini kullanarak iki kapsam arasında daha kolay iletişim kurulmasını sağlar.
Çalışma kutusu, iletiler için belirli bir biçimi kullanır ve aşağıdaki özelliklere sahip bir nesnedir:
type
, iletiyi tanımlayan gerekli benzersiz dizedir. Biçim, kelimeleri ayıran alt çizgiler ve büyük harfle yazılmalıdır (örneğin,CACHE_URLS
).meta
, mesajı 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 tüm veri türleri olabilir.
Aşağıda, hizmet çalışanınızdaki kodla başlayarak messageSW
özelliğinin 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ızda şu 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ı güncellemesi olduğunda kullanıcıyı bilgilendirmek gibi, bir hizmet çalışanı ile window
arasındaki iletişimin yararlı olabileceği birçok durum vardır. Bu tarif, self.skipWaiting
için messageSkipWaiting
adlı özel bir yardımcı yönteme dayanır. Bu yöntem, SKIP_WAITING
type
değerine sahip bir mesaj gönderir.