Saat merespons permintaan dengan entri yang di-cache, meskipun cepat, hal ini memiliki konsekuensi bahwa pengguna mungkin akan melihat data yang sudah tidak berlaku.
Paket workbox-broadcast-update
menyediakan cara standar untuk memberi tahu
Klien Windows
bahwa respons yang di-cache telah diperbarui. Ini paling sering digunakan bersama dengan
strategi StaleWhileRevalidate
.
Setiap kali langkah "validasi ulang" dalam strategi tersebut mengambil respons dari
jaringan yang berbeda dengan yang sebelumnya di-cache, modul ini akan mengirimkan
pesan (melalui
postMessage()
)
ke semua Klien Jendela dalam cakupan pekerja layanan saat ini.
Klien Window dapat memproses update dan mengambil tindakan yang sesuai, seperti otomatis menampilkan pesan kepada pengguna yang memberi tahu mereka bahwa update tersedia.
Bagaimana cara menentukan pembaruan?
Header tertentu dari objek Response
yang di-cache dan baru akan dibandingkan, dan jika salah satu header memiliki nilai yang berbeda, header tersebut dianggap sebagai update.
Secara default, header Content-Length
, ETag
, dan Last-Modified
akan dibandingkan.
Workbox menggunakan nilai header, bukan perbandingan byte demi byte dari isi respons, agar lebih efisien, khususnya untuk respons yang berpotensi besar
Menggunakan Update Siaran
Library ini dimaksudkan untuk digunakan bersama dengan strategi caching StaleWhileRevalidate
, karena strategi tersebut melibatkan ditampilkannya respons
yang di-cache secara langsung, tetapi juga menyediakan mekanisme untuk memperbarui
cache secara asinkron.
Untuk menyiarkan update, Anda hanya perlu menambahkan broadcastUpdate.BroadcastUpdatePlugin
ke
opsi strategi Anda.
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()],
})
);
Di aplikasi web, sebelum peristiwa DOMContentLoaded
diaktifkan, Anda dapat memproses peristiwa ini seperti berikut:
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();
}
});
Format pesan
Saat pemroses peristiwa message
dipanggil di aplikasi web Anda, properti event.data
akan memiliki format berikut:
{
type: 'CACHE_UPDATED',
meta: 'workbox-broadcast-update',
// The two payload values vary depending on the actual update:
payload: {
cacheName: 'the-cache-name',
updatedURL: 'https://example.com/'
}
}
Sesuaikan Header untuk Diperiksa
Anda dapat menyesuaikan header yang akan diperiksa dengan menyetel properti
headersToCheck
.
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({
headersToCheck: ['X-My-Custom-Header'],
}),
],
})
);
Penggunaan Lanjutan
Meskipun sebagian besar developer akan menggunakan workbox-broadcast-update
sebagai plugin
strategi tertentu seperti yang ditunjukkan di atas, logika yang mendasarinya dapat digunakan
dalam kode pekerja layanan.
import {BroadcastCacheUpdate} from 'workbox-broadcast-update';
const broadcastUpdate = new BroadcastCacheUpdate({
headersToCheck: ['X-My-Custom-Header'],
});
const cacheName = 'api-cache';
const request = new Request('https://example.com/api');
const cache = await caches.open(cacheName);
const oldResponse = await cache.match(request);
const newResponse = await fetch(request);
broadcastUpdate.notifyIfUpdated({
cacheName,
oldResponse,
newResponse,
request,
);
Jenis
BroadcastCacheUpdate
Menggunakan postMessage()
API untuk memberi tahu setiap jendela/tab yang terbuka saat respons
yang di-cache telah diupdate.
Demi efisiensi, isi respons yang mendasarinya tidak dibandingkan; hanya header respons tertentu yang akan diperiksa.
Properti
-
konstruktor
void
Buat instance BroadcastCacheUpdate dengan
channelName
tertentu untuk menyiarkan pesanFungsi
constructor
terlihat seperti:(options?: BroadcastCacheUpdateOptions) => {...}
-
opsi
BroadcastCacheUpdateOptions opsional
-
akan menampilkan
-
-
notifyIfUpdated
void
Membandingkan dua Respons dan mengirim pesan (melalui
postMessage()
) ke semua klien jendela jika responsnya berbeda. Tidak satu pun Respons yang boleh buram.Pesan yang diposting memiliki format berikut (dengan
payload
dapat disesuaikan melalui opsigeneratePayload
yang digunakan untuk membuat instance):{ type: 'CACHE_UPDATED', meta: 'workbox-broadcast-update', payload: { cacheName: 'the-cache-name', updatedURL: 'https://example.com/' } }
Fungsi
notifyIfUpdated
terlihat seperti:(options: CacheDidUpdateCallbackParam) => {...}
-
akan menampilkan
Promise<void>
Diselesaikan setelah update dikirim.
-
BroadcastCacheUpdateOptions
Properti
-
headersToCheck
string[] opsional
-
notifyAllClients
boolean opsional
-
generatePayload
membatalkan opsional
Fungsi
generatePayload
terlihat seperti:(options: CacheDidUpdateCallbackParam) => {...}
-
akan menampilkan
Rekam<stringany>
-
BroadcastUpdatePlugin
Plugin ini akan otomatis menyiarkan pesan setiap kali respons yang di-cache diperbarui.
Properti
-
konstruktor
void
Buat instance
workbox-broadcast-update.BroadcastUpdate
dengan opsi yang diteruskan, lalu panggil metodenotifyIfUpdated
setiap kali callbackcacheDidUpdate
plugin dipanggil.Fungsi
constructor
terlihat seperti:(options?: BroadcastCacheUpdateOptions) => {...}
-
opsi
BroadcastCacheUpdateOptions opsional
-
akan menampilkan
-
Metode
responsesAreSame()
workbox-broadcast-update.responsesAreSame(
firstResponse: Response,
secondResponse: Response,
headersToCheck: string[],
)
Dengan mempertimbangkan dua Response's
, membandingkan beberapa nilai header untuk melihat apakah nilai tersebut sama atau tidak.
Parameter
-
firstResponse
Respons
-
secondResponse
Respons
-
headersToCheck
string[]
Hasil
-
boolean