Migracja z Workbox 3 do 4

Ten przewodnik skupia się na zmianach powodujących niezgodność wprowadzonych w Workbox v4. Zawiera też przykłady zmian, które należy wprowadzić przy przejściu z Workbox v3.

Zmiany powodujące niezgodność

workbox-precaching

Konwencja nazewnictwa wpisów w pamięci podręcznej została zaktualizowana. Teraz w przypadku wpisów, których adresy URL wymagają informacji o wersji (tzn. takich, które zawierają pole revision w pliku manifestu precache), informacje o wersji będą przechowywane jako część klucza pamięci podręcznej w specjalnym parametrze zapytania __WB_REVISION__ URL dołączonym do pierwotnego adresu URL. (wcześniej te informacje były przechowywane oddzielnie od kluczy pamięci podręcznej za pomocą IndexedDB).

Deweloperzy, którzy korzystają z wstępnego buforowania za pomocą workbox.precaching.precacheAndRoute() (co jest najczęstszym przypadkiem użycia), nie muszą wprowadzać żadnych zmian w konfiguracji service workera. Po przejściu na Workboxa 4 zapisane w pamięci podręcznej zasoby użytkowników zostaną automatycznie przeniesione do nowego formatu klucza pamięci podręcznej. W przyszłości zapisane wstępnie zasoby będą nadal wyświetlane w taki sam sposób jak wcześniej.

Bezpośrednie używanie kluczy pamięci podręcznej

Niektórzy deweloperzy mogą potrzebować dostępu do wpisów w precache bezpośrednio, poza kontekstem workbox.precaching.precacheAndRoute(). Możesz na przykład wstępnie ustawić obraz w pamięci podręcznej, który zostanie użyty jako odpowiedź „zastępcza”, gdy rzeczywistego obrazu nie będzie można pobrać z sieci.

Jeśli w ten sposób korzystasz z zasobów z zapamiętanym wcześniej buforem, od wersji Workbox 4 musisz wykonać dodatkowy krok, aby przekształcić oryginalny adres URL w odpowiednią wartość klucza pamięci podręcznej, która może służyć do odczytu zapisanego w pamięci podręcznej wpisu. W tym celu zadzwoń pod numer workbox.precaching.getCacheKeyForURL(originURL).

Jeśli na przykład wiesz, że 'fallback.png' jest przechowywane w pamięci podręcznej:

const imageFallbackCacheKey =
  workbox.precaching.getCacheKeyForURL('fallback.png');

workbox.routing.setCatchHandler(({event}) => {
  switch (event.request.destination) {
    case 'image':
      return caches.match(imageFallbackCacheKey);
      break;
    // ...other fallback logic goes here...
  }
});

Czyszczenie starych danych z pamięci podręcznej

Zmiany wprowadzone w precachingu w Workbox w wersji 4 oznaczają, że starsze dane wstępne utworzone przez poprzednie wersje Workbox są niezgodne. Domyślnie pozostają one w tym samym stanie. Jeśli zaktualizujesz Workboxa z wersji 3 na wersję 4, będziesz mieć 2 kopie wszystkich zasobów z zapamiętanej podręcznej pamięci.

Aby tego uniknąć, możesz dodać wywołanie workbox.precaching.cleanupOutdatedCaches() bezpośrednio do instancji Service Worker lub ustawić nową opcję cleanupOutdatedCaches: true, jeśli używasz narzędzia do kompilacji w trybie GenerateSW. Logika czyszczenia pamięci podręcznej działa na podstawie konwencji nazewnictwa pamięci podręcznej, aby znaleźć starsze pamięci podręczne. Ponieważ deweloperzy mają możliwość zastąpienia tych konwencji, postanowiliśmy zachować ostrożność i nie włączyliśmy tej funkcji domyślnie.

Zachęcamy deweloperów, którzy napotkają jakiekolwiek problemy podczas korzystania z tej funkcji, np. fałszywie pozytywne wyniki w przypadku usuwania, do poinformowania nas o tym.

Wielkość liter w parametrach

Zmieniliśmy nazwy dwóch opcjonalnych parametrów, które można przekazywać do parametrów workbox.precaching.precacheAndRoute() i workbox.precaching.addRoute(), aby ujednolicić ogólną konwencję wielkich liter. ignoreUrlParametersMatching to teraz ignoreURLParametersMatching, a cleanUrls to teraz cleanURLs.

workbox-strategies

Istnieją 2 prawie równoważne sposoby tworzenia instancji modułu obsługi w workbox-strategies. Wycofaliśmy metodę fabryczną na rzecz jawnego wywołania konstruktora strategii.

// This factory method syntax has been deprecated:
const networkFirstStrategy = workbox.strategies.networkFirst({...});

// Instead, use the constructor directly:
// (Note that the class name is Uppercase.)
const networkFirstStrategy = new workbox.strategies.NetworkFirst({...});

Chociaż składnia metody fabrycznej będzie nadal działać w wersji 4, jej użycie spowoduje wygenerowanie ostrzeżenia. Zachęcamy deweloperów do wcześniejszego przeprowadzenia migracji, zanim w przyszłej wersji 5 zostanie wycofane wsparcie dla tej metody.

workbox-background-sync

Klasa workbox.backgroundSync.Queue została zmieniona, aby zapewnić deweloperom większą elastyczność i kontrolę nad sposobem dodawania żądań do kolejki i ponownego odtwarzania.

W wersji 3 klasa Queue miała tylko jeden sposób dodawania żądań do kolejki (metoda addRequest()), ale nie miała możliwości modyfikowania kolejki ani usuwania żądań.

W wersji 4 metoda addRequests() została usunięta, a dodaliśmy następujące metody przypominające tablicowe:

  • pushRequest()
  • popRequest()
  • shiftRequest()
  • unshiftRequest()

W wersji 3 klasa Queue obsługiwała też kilka wywołań zwrotnych, które umożliwiały obserwowanie odtwarzania żądań (requestWillEnqueue, requestWillReplay, queueDidReplay), ale większość deweloperów uznała, że oprócz obserwacji chce mieć kontrolę nad tym, jak kolejka jest odtwarzana, w tym możliwość dynamicznego modyfikowania, zmieniania kolejności czy nawet anulowania poszczególnych żądań.

W wersji 4 te wywołania zwrotne zostały usunięte na rzecz pojedynczego wywołania zwrotnego onSync, które jest wywoływane za każdym razem, gdy przeglądarka próbuje odtworzyć film. Domyślnie wywołanie zwrotne onSync wywołuje replayRequests(), ale jeśli chcesz mieć większą kontrolę nad procesem odtwarzania, możesz użyć wymienionych powyżej metod podobnych do tablic, aby odtworzyć kolejkę w dowolny sposób.

Oto przykład logiki niestandardowego odtwarzania:

const queue = new workbox.backgroundSync.Queue('my-queue-name', {
  onSync: async ({queue}) => {
    let entry;
    while ((entry = await this.shiftRequest())) {
      try {
        await fetch(entry.request);
      } catch (error) {
        console.error('Replay failed for request', entry.request, error);
        await this.unshiftRequest(entry);
        return;
      }
    }
    console.log('Replay complete!');
  },
});

Podobnie klasa workbox.backgroundSync.Plugin akceptuje te same argumenty co klasa Queue (ponieważ tworzy wewnętrznie wystąpienie Queue), więc zmieniła się w ten sam sposób.

data ważności pola roboczego

Pakiet npm został przemianowany na workbox-expiration, aby był zgodny z konwencją nazewnictwa stosowaną w przypadku innych modułów. Pod względem działania ten pakiet jest odpowiednikiem starszego pakietu workbox-cache-expiration, który został wycofany.

workbox-broadcast-update

Pakiet npm został przemianowany na workbox-broadcast-update, aby był zgodny z konwencją nazewnictwa stosowaną w przypadku innych modułów. Ten pakiet ma takie same funkcje jak starszy pakiet workbox-broadcast-cache-update, który został wycofany.

workbox-core

W Workbox w wersji 3 szczegółowość poziomów logu można kontrolować za pomocą metody workbox.core.setLogLevel(), którą należy przekazać w wyliczeniem workbox.core.LOG_LEVELS. Bieżący poziom logowania możesz też odczytać za pomocą polecenia workbox.core.logLevel.

W Workbox w wersji 4 wszystkie te elementy zostały usunięte, ponieważ wszystkie nowoczesne narzędzia dla programistów są wyposażone w zaawansowane funkcje filtrowania dzienników (zobacz filtrowanie danych wyjściowych konsoli pod kątem Narzędzi deweloperskich w Chrome.

workbox-sw

2 metody, które były wcześniej dostępne bezpośrednio w przestrzeni nazw workbox (odpowiadającej modułowi workbox-sw), zostały przeniesione do workbox.core. workbox.skipWaiting() stało się workbox.core.skipWaiting(), a workbox.clientsClaim() – workbox.core.clientsClaim().

Konfiguracja narzędzia do kompilacji

Zmieniła się nazwa niektórych opcji, które można przekazywać do workbox-cli, workbox-build lub workbox-webpack-plugin. W przypadku nazw opcji zawierających „Url” zastosowano nową nazwę „URL”. Oznacza to, że preferowane są te nazwy opcji:

  • dontCacheBustURLsMatching
  • ignoreURLParametersMatching
  • modifyURLPrefix
  • templatedURLs

Wersja „Url” tych nazw opcji nadal działa w wersji 4, ale powoduje wyświetlenie komunikatu ostrzeżenia. Zachęcamy deweloperów do przeprowadzenia migracji przed wydaniem wersji 5.

Nowe funkcje

okno

Nowy moduł workbox-window upraszcza proces rejestracji i wykrywania aktualizacji usług działających w ramach service workera oraz zapewnia standardowy sposób komunikacji między kodem działającym w usłudze działającej w kontekście window aplikacji internetowej.

Korzystanie z funkcji workbox-window jest opcjonalne, ale mamy nadzieję, że deweloperzy uznają ją za przydatną i w odpowiednich przypadkach rozważą przeniesienie części swojej logiki napisane ręcznie. Więcej informacji o korzystaniu z narzędzia workbox-window znajdziesz w przewodniku modułu.

Przykład migracji

Przykład migracji z Workboxa w wersji 3 do wersji 4 znajdziesz w tym Pull Request.

Uzyskiwanie pomocy

Przewidujemy, że migracja w większości przypadków będzie prosta. Jeśli napotkasz problemy, których nie omówiliśmy w tym przewodniku, daj nam znać, otwierając zgłoszenie na GitHubie.