Szybkie odpowiadanie na żądania przy użyciu wpisów z pamięci podręcznej wiąże się z koniecznością wyświetlania nieaktualnych danych.
Pakiet workbox-broadcast-update
to standardowy sposób powiadamiania klientów Windows o zaktualizowaniu odpowiedzi zapisanej w pamięci podręcznej. Ta metoda jest najczęściej używana w połączeniu ze strategią StaleWhileRevalidate
.
Za każdym razem, gdy etap „ponownej weryfikacji” tej strategii pobierze odpowiedź z sieci, która różni się od odpowiedzi zapisanej w pamięci podręcznej, moduł wyśle wiadomość (za pomocą postMessage()
) do wszystkich klientów okien w zakresie bieżącego skryptu service worker.
Klienty okien mogą nasłuchiwać aktualizacji i podejmować odpowiednie działania, np. automatycznie wyświetlać użytkownikowi komunikat z informacją o dostępnej aktualizacji.
Jak określane są aktualizacje?
Niektóre nagłówki obiektów Response
w pamięci podręcznej i nowych są porównywane i jeśli którykolwiek z nagłówków ma różne wartości, uznaje się to za aktualizację.
Domyślnie porównywane są nagłówki Content-Length
, ETag
i Last-Modified
.
Pole robocze używa wartości nagłówków zamiast porównania treści odpowiedzi na bajty w celu zwiększenia wydajności, zwłaszcza w przypadku potencjalnie dużych odpowiedzi.
Używanie aktualizacji transmisji
Z biblioteki należy korzystać razem ze strategią buforowania StaleWhileRevalidate
, ponieważ strategia ta obejmuje natychmiastowe zwracanie odpowiedzi z pamięci podręcznej, ale zapewnia też mechanizm asynchronicznej aktualizacji pamięci podręcznej.
Aby transmitować aktualizacje, musisz tylko dodać broadcastUpdate.BroadcastUpdatePlugin
do opcji strategii.
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()],
})
);
Przed uruchomieniem zdarzenia DOMContentLoaded
w aplikacji internetowej możesz nasłuchiwać tych zdarzeń:
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 wiadomości
Po wywołaniu w aplikacji internetowej detektor zdarzeń message
właściwość event.data
będzie miała taki format:
{
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/'
}
}
Dostosuj nagłówki do sprawdzenia
Nagłówki do sprawdzenia możesz dostosować, ustawiając właściwość 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'],
}),
],
})
);
Zaawansowane użycie
Większość deweloperów używa workbox-broadcast-update
jako wtyczki do konkretnej strategii, jak pokazano powyżej, ale możliwe jest użycie bazowej logiki w kodzie skryptu service worker.
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,
);
Typy
BroadcastCacheUpdate
Używa interfejsu postMessage()
API do informowania wszystkich otwartych okien i kart o zaktualizowaniu odpowiedzi z pamięci podręcznej.
Aby zadbać o wydajność, porównywane są bazowe treści odpowiedzi – sprawdzane są tylko konkretne nagłówki odpowiedzi.
Właściwości
-
konstruktor
void
Utwórz instancję BroadcastCacheUpdate z określonym poleceniem
channelName
do przesyłania wiadomościFunkcja
constructor
wygląda tak:(options?: BroadcastCacheUpdateOptions) => {...}
-
Opcje
BroadcastCacheUpdateOptions opcjonalnie
-
returns
-
-
notifyIfUpdated
void
Porównuje 2 odpowiedzi i wysyła wiadomość (za pomocą
postMessage()
) do wszystkich klientów okiennych, jeśli odpowiedzi różnią się. Żadna z odpowiedzi nie może być nieprzejrzysta.Opublikowana wiadomość ma ten format (gdzie
payload
można dostosować za pomocą opcjigeneratePayload
, za pomocą której została utworzona instancja):{ type: 'CACHE_UPDATED', meta: 'workbox-broadcast-update', payload: { cacheName: 'the-cache-name', updatedURL: 'https://example.com/' } }
Funkcja
notifyIfUpdated
wygląda tak:(options: CacheDidUpdateCallbackParam) => {...}
-
returns
Promise<void>
Zaniknie po wysłaniu aktualizacji.
-
BroadcastCacheUpdateOptions
Właściwości
-
headersToCheck
string[] opcjonalny
-
notifyAllClients
wartość logiczna opcjonalna
-
generatePayload
void opcjonalny
Funkcja
generatePayload
wygląda tak:(options: CacheDidUpdateCallbackParam) => {...}
-
returns
Rekord<stringany>
-
BroadcastUpdatePlugin
Ta wtyczka automatycznie przesyła komunikat po każdej zmianie odpowiedzi zapisanej w pamięci podręcznej.
Właściwości
-
konstruktor
void
Utwórz instancję
workbox-broadcast-update.BroadcastUpdate
z przekazanymi opcjami i wywołaj metodęnotifyIfUpdated
za każdym razem, gdy wywoływane jest wywołanie zwrotnecacheDidUpdate
wtyczki.Funkcja
constructor
wygląda tak:(options?: BroadcastCacheUpdateOptions) => {...}
-
Opcje
BroadcastCacheUpdateOptions opcjonalnie
-
returns
-
Metody
responsesAreSame()
workbox-broadcast-update.responsesAreSame(
firstResponse: Response,
secondResponse: Response,
headersToCheck: string[],
)
Przy podanym 2 parametrach Response's
porównuje kilka wartości nagłówków, aby sprawdzić, czy są takie same.
Parametry
-
firstResponse
Odpowiedź
-
secondResponse
Odpowiedź
-
headersToCheck
string[]
Akcje powrotne
-
boolean