Lorsque vous répondez à des requêtes avec des entrées en cache, tout en restant rapide, les utilisateurs peuvent voir des données obsolètes.
Le package workbox-broadcast-update
fournit un moyen standard d'informer les clients de fenêtre qu'une réponse mise en cache a été mise à jour. Elle est le plus souvent utilisée avec la stratégie StaleWhileRevalidate
.
Chaque fois que l'étape de revalidation de cette stratégie récupère une réponse du réseau différente de celle précédemment mise en cache, ce module envoie un message (via postMessage()
) à tous les clients Windows compris dans le champ d'application du service worker actuel.
Les clients Windows peuvent écouter les mises à jour et prendre les mesures appropriées, par exemple afficher automatiquement un message l'informant que des mises à jour sont disponibles.
Comment les mises à jour sont-elles déterminées ?
Certains en-têtes des en-têtes mis en cache et des nouveaux objets
Response
sont comparés. Si l'un des en-têtes a des valeurs différentes, cela est considéré comme une mise à jour.
Par défaut, les en-têtes Content-Length
, ETag
et Last-Modified
sont comparés.
La fonctionnalité Workbox utilise des valeurs d'en-tête au lieu d'une comparaison octet par octet des corps de réponse pour être plus efficace, en particulier pour les réponses potentiellement volumineuses.
Utiliser la mise à jour de diffusion
Cette bibliothèque est destinée à être utilisée avec la stratégie de mise en cache StaleWhileRevalidate
, car cette stratégie implique le renvoi immédiat d'une réponse mise en cache, mais fournit également un mécanisme pour mettre à jour le cache de manière asynchrone.
Pour diffuser des mises à jour, il vous suffit d'ajouter broadcastUpdate.BroadcastUpdatePlugin
à vos options de stratégie.
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()],
})
);
Dans votre application Web, avant le déclenchement de l'événement DOMContentLoaded
, vous pouvez écouter ces événements comme suit:
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 du message
Lorsqu'un écouteur d'événements message
est appelé dans votre application Web, la propriété event.data
a le format suivant:
{
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/'
}
}
Personnaliser les en-têtes à vérifier
Vous pouvez personnaliser les en-têtes à vérifier en définissant la propriété 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'],
}),
],
})
);
Utilisation avancée
Bien que la plupart des développeurs utilisent workbox-broadcast-update
comme plug-in d'une stratégie particulière, comme indiqué ci-dessus, il est possible d'utiliser la logique sous-jacente dans le code du 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,
);
Types
BroadcastCacheUpdate
Utilise l'API postMessage()
pour informer les fenêtres/onglets ouverts lorsqu'une réponse mise en cache a été mise à jour.
Par souci d'efficacité, les corps de réponse sous-jacents ne sont pas comparés. Seuls les en-têtes de réponse spécifiques sont vérifiés.
Propriétés
-
constructor
void
Créez une instance BroadcastCacheUpdate avec un
channelName
spécifique sur lequel diffuser des messagesLa fonction
constructor
se présente comme suit :(options?: BroadcastCacheUpdateOptions) => {...}
-
options
BroadcastCacheUpdateOptions facultatif
-
retours
-
-
notifyIfUpdated
void
Compare deux réponses et envoie un message (via
postMessage()
) à tous les clients de fenêtre si les réponses diffèrent. Aucune des réponses ne peut être opaque.Le message publié a le format suivant (où
payload
peut être personnalisé via l'optiongeneratePayload
avec laquelle l'instance est créée):{ type: 'CACHE_UPDATED', meta: 'workbox-broadcast-update', payload: { cacheName: 'the-cache-name', updatedURL: 'https://example.com/' } }
La fonction
notifyIfUpdated
se présente comme suit :(options: CacheDidUpdateCallbackParam) => {...}
-
options
-
retours
Promise<void>
La résolution est résolue une fois la mise à jour envoyée.
-
BroadcastCacheUpdateOptions
Propriétés
-
headersToCheck
string[] facultatif
-
notifyAllClients
Booléen facultatif
-
generatePayload
vide facultatif
La fonction
generatePayload
se présente comme suit :(options: CacheDidUpdateCallbackParam) => {...}
-
options
-
retours
Enregistrement<stringany>
-
BroadcastUpdatePlugin
Ce plug-in diffuse automatiquement un message chaque fois qu'une réponse mise en cache est mise à jour.
Propriétés
-
constructor
void
Créez une instance
workbox-broadcast-update.BroadcastUpdate
avec les options transmises et appelle sa méthodenotifyIfUpdated
chaque fois que le rappelcacheDidUpdate
du plug-in est appelé.La fonction
constructor
se présente comme suit :(options?: BroadcastCacheUpdateOptions) => {...}
-
options
BroadcastCacheUpdateOptions facultatif
-
retours
-
Méthodes
responsesAreSame()
workbox-broadcast-update.responsesAreSame(
firstResponse: Response,
secondResponse: Response,
headersToCheck: string[],
)
Pour deux valeurs Response's
, compare plusieurs valeurs d'en-tête pour voir si elles sont identiques ou non.
Paramètres
-
firstResponse
Réponse
-
secondResponse
Réponse
-
headersToCheck
chaîne[]
Renvoie
-
boolean