actualización-de-transmisión-de-caja de trabajo

Cuando se responde a solicitudes con entradas almacenadas en caché, si bien es rápido, conlleva la desventaja de que los usuarios podrían terminar viendo datos obsoletos.

El paquete workbox-broadcast-update proporciona una forma estándar de notificar a los clientes de Windows que se actualizó una respuesta almacenada en caché. Por lo general, se usa junto con la estrategia StaleWhileRevalidate.

Cada vez que el paso "revalidar" de esa estrategia recupera una respuesta de la red que difiere de la que se almacenó en caché anteriormente, este módulo enviará un mensaje (a través de postMessage()) a todos los clientes de ventana dentro del alcance del trabajador de servicio actual.

Los clientes de ventanas pueden detectar actualizaciones y tomar las medidas correspondientes, como mostrar automáticamente un mensaje al usuario que le informa que las actualizaciones están disponibles.

¿Cómo se determinan las actualizaciones?

Se comparan ciertos encabezados de los objetos Response nuevos y almacenados en caché, y si alguno de los encabezados tiene valores diferentes, se considera una actualización.

De forma predeterminada, se comparan los encabezados Content-Length, ETag y Last-Modified.

Workbox usa valores de encabezado en lugar de una comparación byte a byte de para que los cuerpos de respuesta sean más eficientes, respuestas grandes

Cómo usar la actualización de transmisión

La biblioteca está diseñada para usarse junto con la estrategia de almacenamiento en caché de StaleWhileRevalidate, ya que esa estrategia implica mostrar una respuesta almacenada en caché de inmediato, pero también proporciona un mecanismo para actualizar la caché de forma asíncrona.

Para transmitir actualizaciones, solo debes agregar un broadcastUpdate.BroadcastUpdatePlugin a las opciones de estrategia.

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()],
  })
);

En tu app web, antes de DOMContentLoaded evento activado, puedes escuchar estos eventos como:

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 mensaje

Cuando se invoque un objeto de escucha de eventos message en tu app web, la propiedad event.data tendrá el siguiente 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/'
  }
}

Personaliza los encabezados que quieres comprobar

Puedes personalizar los encabezados que se deben verificar configurando el headersToCheck propiedad.

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 avanzado

Si bien la mayoría de los desarrolladores usarán workbox-broadcast-update como un complemento de una estrategia en particular, como se muestra más arriba, es posible usar la lógica subyacente en el código del trabajador de servicio.

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 la API de postMessage() para informar a las ventanas o pestañas abiertas cuando se actualiza una respuesta almacenada en caché.

Por razones de eficiencia, los cuerpos de respuesta subyacentes no se comparan; solo se verifican encabezados de respuesta específicos.

Propiedades

  • constructor

    void

    Construye una instancia de BroadcastCacheUpdate con un channelName específico para enviar anuncios en

    La función constructor se ve de la siguiente manera:

    (options?: BroadcastCacheUpdateOptions) => {...}

  • notifyIfUpdated

    void

    Compara dos respuestas y envía un mensaje (a través de postMessage()) a todos los clientes de la ventana si el las respuestas son diferentes. Ninguna de las respuestas puede opaco.

    El mensaje que se publica tiene el siguiente formato (en el que payload se puede personalizar a través de la opción generatePayload con la que se crea la instancia):

    {
      type: 'CACHE_UPDATED',
      meta: 'workbox-broadcast-update',
      payload: {
        cacheName: 'the-cache-name',
        updatedURL: 'https://example.com/'
      }
    }
    

    La función notifyIfUpdated se ve de la siguiente manera:

    (options: CacheDidUpdateCallbackParam) => {...}

    • muestra

      Promesa<void>

      Se resuelve una vez que se envía la actualización.

BroadcastCacheUpdateOptions

Propiedades

  • headersToCheck

    string[] opcional

  • notifyAllClients

    booleano opcional

  • generatePayload

    void opcional

    La función generatePayload se ve de la siguiente manera:

    (options: CacheDidUpdateCallbackParam) => {...}

    • muestra

      Grabar<stringany>

BroadcastUpdatePlugin

Este complemento transmitirá automáticamente un mensaje cada vez que se actualice una respuesta almacenada en caché.

Propiedades

  • constructor

    void

    Construye una instancia workbox-broadcast-update.BroadcastUpdate con las opciones pasadas y llama a su método notifyIfUpdated cada vez que se invoca la devolución de llamada cacheDidUpdate del complemento.

    La función constructor se ve de la siguiente manera:

    (options?: BroadcastCacheUpdateOptions) => {...}

Métodos

responsesAreSame()

workbox-broadcast-update.responsesAreSame(
  firstResponse: Response,
  secondResponse: Response,
  headersToCheck: string[],
)

Dadas dos Response's, compara varios valores de encabezado para ver si son son iguales o no.

Parámetros

  • firstResponse

    Respuesta

  • secondResponse

    Respuesta

  • headersToCheck

    string[]

Muestra

  • booleano