Ao responder a solicitações com entradas em cache, embora seja rápido, há uma compensação, já que os usuários podem acabar vendo dados desatualizados.
O pacote workbox-broadcast-update
fornece uma maneira padrão de notificar
Clientes de janela
que uma resposta em cache foi atualizada. Essa estratégia é mais comumente usada com a
estratégia StaleWhileRevalidate
.
Sempre que a etapa "revalidar" dessa estratégia recuperar uma resposta da
rede que é diferente do que foi armazenado em cache anteriormente, esse módulo vai enviar uma
mensagem (por meio de
postMessage()
)
a todos os clientes de janela no escopo do service worker atual.
Os clientes do Windows podem detectar atualizações e tomar as medidas apropriadas, como mostrando automaticamente uma mensagem ao usuário informando que as atualizações estão disponíveis.
Como as atualizações são determinadas?
Alguns cabeçalhos das instâncias novas e em cache
Response
objetos são comparados e, se algum dos cabeçalhos tiver valores diferentes,
isso é considerado uma atualização.
Por padrão, os cabeçalhos Content-Length
, ETag
e Last-Modified
são
comparados.
A caixa de trabalho usa valores de cabeçalho em vez de uma comparação byte por byte dos para que os corpos de resposta sejam mais eficientes, em especial respostas grandes
Como usar a atualização por transmissão
A biblioteca precisa ser usada com o StaleWhileRevalidate
de cache, já que ela envolve retornar um valor
a resposta imediata, mas também fornece um mecanismo para atualizar a
armazenar em cache de maneira assíncrona.
Para transmitir atualizações, basta adicionar um broadcastUpdate.BroadcastUpdatePlugin
ao seu
de estratégia de visualização de dados.
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()],
})
);
No app da Web, antes que o evento DOMContentLoaded
seja acionado, é possível detectar esses eventos da seguinte maneira:
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 de mensagem
Quando um listener de evento message
é invocado no app da Web, a propriedade event.data
tem o seguinte 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/'
}
}
Personalizar cabeçalhos para verificar
É possível personalizar os cabeçalhos a serem verificados definindo o 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'],
}),
],
})
);
Uso Avançado
Embora a maioria dos desenvolvedores use workbox-broadcast-update
como um plug-in
de uma estratégia específica, conforme mostrado acima, é possível usar a lógica
subjacente no código do worker de serviço.
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,
);
Tipos
BroadcastCacheUpdate
Usa a API postMessage()
para informar todas as janelas/guias abertas quando uma
resposta foi atualizada.
Para fins de eficiência, os corpos de resposta subjacentes não são comparados. Somente cabeçalhos de resposta específicos são verificados.
Propriedades
-
construtor
void
Criar uma instância de BroadcastCacheUpdate com um
channelName
específico para transmitir mensagens emA função
constructor
tem esta aparência:(options?: BroadcastCacheUpdateOptions) => {...}
-
opções
BroadcastCacheUpdateOptions optional
-
retorna
-
-
notifyIfUpdated
void
Compara duas respostas e envia uma mensagem (por
postMessage()
) a todos os clientes de janela se as respostas forem diferentes. Nenhuma das Respostas pode ser opaque.A mensagem postada tem o seguinte formato (em que
payload
pode ser personalizado pela opçãogeneratePayload
com que a instância é criada):{ type: 'CACHE_UPDATED', meta: 'workbox-broadcast-update', payload: { cacheName: 'the-cache-name', updatedURL: 'https://example.com/' } }
A função
notifyIfUpdated
é semelhante a esta:(options: CacheDidUpdateCallbackParam) => {...}
-
opções
-
retorna
Promise<void>
resolve quando a atualização é enviada.
-
BroadcastCacheUpdateOptions
Propriedades
-
headersToCheck
string[] opcional
-
notifyAllClients
booleano opcional
-
generatePayload
void optional
A função
generatePayload
tem esta aparência:(options: CacheDidUpdateCallbackParam) => {...}
-
opções
-
retorna
Registro<stringany>
-
BroadcastUpdatePlugin
Esse plug-in vai transmitir automaticamente uma mensagem sempre que uma resposta em cache for atualizada.
Propriedades
-
construtor
void
Crie uma instância
workbox-broadcast-update.BroadcastUpdate
com as opções transmitidas e chama o métodonotifyIfUpdated
sempre que ocacheDidUpdate
do plug-in será invocado.A função
constructor
tem esta aparência:(options?: BroadcastCacheUpdateOptions) => {...}
-
opções
BroadcastCacheUpdateOptions optional
-
retorna
-
Métodos
responsesAreSame()
workbox-broadcast-update.responsesAreSame(
firstResponse: Response,
secondResponse: Response,
headersToCheck: string[],
)
Dado dois Response's
, compara vários valores de cabeçalho para saber se eles são
iguais ou não.
Parâmetros
-
firstResponse
Resposta
-
secondResponse
Resposta
-
headersToCheck
string[]
Retorna
-
booleano