Quando risponde alle richieste con voci memorizzate nella cache, pur essendo veloce, comporta il fatto che gli utenti potrebbero visualizzare dati inattivi.
Il pacchetto workbox-broadcast-update
fornisce un modo standard per informare i client di Windows che una risposta memorizzata nella cache è stata aggiornata. Viene utilizzata più comunemente insieme alla strategia StaleWhileRevalidate
.
Ogni volta che il passaggio "Convalida di nuovo" di questa strategia recupera una risposta dalla rete diversa da quella memorizzata nella cache in precedenza, questo modulo invia un messaggio (tramite postMessage()
) a tutti i client Window nell'ambito dell'attuale service worker.
I client Windows possono rimanere in ascolto degli aggiornamenti e intraprendere le azioni appropriate, come mostrare automaticamente un messaggio all'utente per informarlo che sono disponibili.
Come vengono determinati gli aggiornamenti?
Vengono confrontate alcune intestazioni degli oggetti memorizzati nella cache e nuovi
Response
e, se una delle intestazioni ha valori diversi,
viene considerato un aggiornamento.
Per impostazione predefinita, le intestazioni Content-Length
, ETag
e Last-Modified
sono
confrontato con altri modelli.
La casella di lavoro utilizza i valori di intestazione invece di un confronto byte per byte di di risposta in modo che siano più efficienti, in particolare per risposte grandi
Utilizzo di Aggiornamento di trasmissione
La libreria è progettata per essere utilizzata insieme alla strategia di memorizzazione nella cache StaleWhileRevalidate
, poiché questa strategia prevede il ritorno immediato di una risposta memorizzata nella cache, ma fornisce anche un meccanismo per aggiornare la cache in modo asincrono.
Per trasmettere gli aggiornamenti, devi solo aggiungere un broadcastUpdate.BroadcastUpdatePlugin
alle opzioni di strategia.
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()],
})
);
Nella tua app web, prima dell'evento DOMContentLoaded
, puoi ascoltare questi eventi nel seguente modo:
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();
}
});
Formato messaggio
Quando viene invocato un gestore di eventi message
nella tua app web, la proprietà event.data
avrà il seguente formato:
{
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/'
}
}
Personalizzare le intestazioni da controllare
Puoi personalizzare le intestazioni da verificare impostando il headersToCheck
proprietà.
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'],
}),
],
})
);
Utilizzo avanzato
Sebbene la maggior parte degli sviluppatori utilizzi workbox-broadcast-update
come plug-in di una determinata strategia, come mostrato sopra, è possibile utilizzare la logica di base nel codice del servizio 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,
);
Tipi
BroadcastCacheUpdate
Utilizza l'API postMessage()
per informare le finestre/schede aperte quando una risposta memorizzata nella cache è stata aggiornata.
Per motivi di efficienza, i relativi contenuti non vengono confrontati; vengono controllate solo intestazioni di risposta specifiche.
Proprietà
-
costruttore
null
Crea un'istanza BroadcastCacheUpdate con un
channelName
specifico su cui trasmettere i messaggiLa funzione
constructor
ha il seguente aspetto:(options?: BroadcastCacheUpdateOptions) => {...}
-
opzioni
BroadcastCacheUpdateOptions optional
-
returns
-
-
notifyIfUpdated
nullo
Confronta due risposte e invia un messaggio (tramite
postMessage()
) a tutti i client delle finestre se diverse. Nessuna delle risposte può essere oscura.Il messaggio pubblicato ha il seguente formato (dove
payload
può Essere personalizzata tramite l'opzionegeneratePayload
in cui viene creata l'istanza con):{ type: 'CACHE_UPDATED', meta: 'workbox-broadcast-update', payload: { cacheName: 'the-cache-name', updatedURL: 'https://example.com/' } }
La funzione
notifyIfUpdated
ha questo aspetto:(options: CacheDidUpdateCallbackParam) => {...}
-
opzioni
-
returns
Promise<void>
Il problema si risolve una volta inviato l'aggiornamento.
-
BroadcastCacheUpdateOptions
Proprietà
-
headersToCheck
string[] facoltativo
-
notifyAllClients
booleano facoltativo
-
generatePayload
void facoltativo
La funzione
generatePayload
ha questo aspetto:(options: CacheDidUpdateCallbackParam) => {...}
-
opzioni
-
returns
Registra<stringany>
-
BroadcastUpdatePlugin
Questo plug-in trasmette automaticamente un messaggio ogni volta che una risposta memorizzata nella cache viene aggiornato.
Proprietà
-
costruttore
nullo
Crea un'istanza
workbox-broadcast-update.BroadcastUpdate
con le opzioni passate e chiama il metodonotifyIfUpdated
ogni volta che viene richiamato il callbackcacheDidUpdate
del plug-in.La funzione
constructor
ha questo aspetto:(options?: BroadcastCacheUpdateOptions) => {...}
-
opzioni
BroadcastCacheUpdateOptions facoltativo
-
returns
-
Metodi
responsesAreSame()
workbox-broadcast-update.responsesAreSame(
firstResponse: Response,
secondResponse: Response,
headersToCheck: string[],
)
Dati due Response's
, confronta diversi valori di intestazione per verificare se sono uguali o meno.
Parametri
-
firstResponse
Risposta
-
secondResponse
Risposta
-
headersToCheck
string[]
Resi
-
booleano