Workbox-broadcast-update

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ści

    Funkcja constructor wygląda tak:

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

  • 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ą opcji generatePayload, 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

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 zwrotne cacheDidUpdate wtyczki.

    Funkcja constructor wygląda tak:

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

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