Migracja z Workbox 5 do 6

W tym przewodniku znajdziesz informacje o najważniejszych zmianach wprowadzonych w Workbox v6. Znajdziesz w nim przykłady zmian, które musisz wprowadzić podczas przechodzenia z tej wersji.

Istotne zmiany

Rdzeń skrzynki roboczej

Metoda skipWaiting() w workbox-core nie będzie już dodawana do modułu obsługi install i jest odpowiednikiem wywołania metody self.skipWaiting().

Od teraz używaj zasady self.skipWaiting(), ponieważ skipWaiting() zostanie prawdopodobnie usunięta z Workbox w wersji 7.

tworzenie buforowania w polu roboczym

  • Dokumentów HTML z innych domen powiązanych z adresami URL, które odpowiadają przekierowaniam HTTP, nie można już używać w celu spełnienia żądania nawigacji z użyciem workbox-precaching. Taki scenariusz jest zwykle rzadki.
  • Parametr zapytania URL fbclid jest teraz ignorowany przez workbox-precaching podczas wyszukiwania odpowiedzi na dane żądanie w pamięci podręcznej.
  • Konstruktor PrecacheController zamiast ciągu znaków przyjmuje teraz obiekt o określonych właściwościach. Ten obiekt obsługuje te właściwości: cacheName (służący do tego samego przeznaczenia co ciąg przekazany do konstruktora w wersji 5), plugins (zastępuje metodę addPlugins() z wersji 5) oraz fallbackToNetwork (zastępuje podobną opcję przekazaną do createHandler() i `createHandlerBoundToURL()() w wersji 5).
  • Metody install() i activate() klasy PrecacheController przyjmują teraz dokładnie 1 parametr, który należy ustawić odpowiednio na InstallEvent lub ActivateEvent.
  • Metoda addRoute() została usunięta z PrecacheController. Możesz zamiast niej użyć nowej klasy PrecacheRoute do utworzenia trasy, którą możesz potem zarejestrować.
  • Metoda precacheAndRoute() została usunięta z PrecacheController. (Nadal będzie ona istnieć jako statyczna metoda pomocnicza wyeksportowana przez moduł workbox-precaching). Została usunięta, ponieważ zamiast niej można użyć: PrecacheRoute.
  • Metoda createMatchCalback() została usunięta z PrecacheController. Zamiast niego możesz użyć nowej wersji PrecacheRoute.
  • Metoda createHandler() została usunięta z PrecacheController. Zamiast tego do obsługi żądań można używać właściwości strategy obiektu PrecacheController.
  • Eksport statyczny createHandler() został już usunięty z modułu workbox-precaching. W jej miejsce deweloperzy powinni utworzyć instancję PrecacheController i wykorzystać jej właściwość strategy.
  • Trasa zarejestrowana w precacheAndRoute() jest teraz „prawdziwą” trasą korzystającą z klasy Router systemu workbox-routing. Może to spowodować zmianę kolejności oceny tras, jeśli przeplatasz wywołania do registerRoute() i precacheAndRoute().

routing skrzynki roboczej

Metoda setDefaultHandler() przyjmuje teraz opcjonalny drugi parametr odpowiadający metodzie HTTP, do której ma zastosowanie. Domyślna wartość to 'GET'.

  • Jeśli korzystasz z usługi setDefaultHandler(), a wszystkie Twoje żądania mają wartość GET, nie musisz wprowadzać żadnych zmian.
  • Jeśli masz jakieś żądania, które nie są związane z GET (POST, PUT itp...), setDefaultHandler() nie będzie już wiązać ze sobą tych żądań.

Konfiguracja kompilacji

Opcja mode dla trybów getManifest i injectManifest w aplikacjach workbox-build i workbox-cli nie była obsługiwana i została usunięta. Nie dotyczy to domeny workbox-webpack-plugin, która obsługuje interfejs mode we wtyczce InjectManifest.

Narzędzia do kompilacji wymagają środowiska Node.js w wersji 10 lub nowszej

Wersje Node.js starsze niż 10 nie są już obsługiwane przez workbox-webpack-plugin, workbox-build ani workbox-cli. Jeśli używasz środowiska Node.js w wersji starszej niż 8, zaktualizuj środowisko wykonawcze do obsługiwanej wersji.

Nowe ulepszenia

strategie skrzynki roboczej

Workbox w wersji 6 wprowadza nowy sposób definiowania własnych strategii przez deweloperów zewnętrznych. Dzięki temu deweloperzy zewnętrzni mogą rozszerzać Workbox w sposób, który w pełni zaspokaja ich potrzeby.

Nowa klasa bazowa strategii

W wersji 6 wszystkie klasy strategii Workbox muszą stanowić rozszerzenie nowej klasy bazowej Strategy. Wszystkie wbudowane strategie zostały napisane na nowo, aby to ułatwić.

Klasa bazowa Strategy odpowiada za 2 główne funkcje:

  • Wywoływanie wywołań zwrotnych cyklu życia wtyczki, które są wspólne dla wszystkich modułów obsługi strategii (np. w momencie uruchomienia, odpowiedzi i zakończenia).
  • utworzenie instancji „modułu obsługi”, która może zarządzać stanem w przypadku każdego indywidualnego żądania obsługiwanego przez strategię;

Nowa klasa „handlowa”

Wcześniej moduły wewnętrzne wywołują fetchWrapper i cacheWrapper, które (jak sama nazwa wskazuje) zawierają haki do różnych interfejsów API pobierania i pamięci podręcznej. Obecnie umożliwiają one działanie wtyczek, ale nie są dostępne dla programistów.

Nowa klasa „obsługi” (StrategyHandler) będzie udostępniać te metody, dzięki czemu strategie niestandardowe mogą wywoływać metodę fetch() lub cacheMatch() i korzystać z wtyczek dodanych do instancji strategii automatycznie.

Umożliwia ona też programistom dodawanie własnych niestandardowych wywołań zwrotnych cyklu życia, które mogą być specyficzne dla ich strategii, i działają po prostu z obecnym interfejsem wtyczki.

Nowy stan cyklu życia wtyczki

W Workbox w wersji 5 wtyczki nie są stanowe. Oznacza to, że jeśli żądanie dotyczące /index.html wywoła zarówno wywołania zwrotne requestWillFetch, jak i cachedResponseWillBeUsed, te 2 wywołania zwrotne nie mogą się ze sobą komunikować ani nawet nie wiedzą, że zostały wywołane przez to samo żądanie.

W wersji 6 wszystkie wywołania zwrotne wtyczki będą też przekazywane nowy obiekt state. Obiekt stanu będzie unikalny dla tego konkretnego obiektu wtyczki i tego wywołania strategii (tj. wywołania handle()). Pozwala to programistom pisać wtyczki, w których jedno wywołanie zwrotne może warunkowo wykonać działanie na podstawie tego, co zrobiło inne wywołanie zwrotne w tej samej wtyczce (np. obliczenie różnicy czasu między uruchomieniami requestWillFetch a fetchDidSucceed lub fetchDidFail).

Wywołania zwrotne cyklu życia nowej wtyczki

Dodaliśmy nowe wywołania zwrotne cyklu życia wtyczki, aby umożliwić deweloperom pełne wykorzystanie stanu cyklu życia wtyczki:

  • handlerWillStart: wywoływana przed uruchomieniem jakichkolwiek działań logicznych modułu obsługi. Tego wywołania zwrotnego można użyć do ustawienia początkowego stanu modułu obsługi (np. aby zarejestrować czas rozpoczęcia).
  • handlerWillRespond: wywoływana przed zwróceniem odpowiedzi metody handle() strategii. Tego wywołania zwrotnego można użyć do zmodyfikowania odpowiedzi przed jej zwróceniem do modułu obsługi trasy lub innej niestandardowej logice.
  • handlerDidRespond: wywoływana po zwróceniu odpowiedzi ze strategii handle(). Tego wywołania zwrotnego można użyć do rejestrowania szczegółów końcowej odpowiedzi, np. po zmianach wprowadzonych przez inne wtyczki.
  • handlerDidComplete: wywołano po ugruntowaniu wszystkich obietnic życiowych dodanych do zdarzenia w wyniku wywołania tej strategii. Tego wywołania zwrotnego można użyć do raportowania danych, które muszą czekać na zakończenie działania modułu obsługi w celu obliczenia (np. stan trafienia w pamięci podręcznej, czas oczekiwania w pamięci podręcznej, opóźnienie sieci).
  • handlerDidError: wywoływana, jeśli moduł obsługi nie mógł udzielić prawidłowej odpowiedzi z żadnego źródła. Tego wywołania zwrotnego można użyć, aby udostępnić treść zastępczą jako alternatywę dla błędu sieci.

Deweloperzy implementujący własne strategie niestandardowe nie muszą się martwić o samodzielne wywoływanie tych wywołań zwrotnych. Zajmuje się tym nowa klasa bazowa Strategy.

Dokładniejsze typy TypeScriptu na potrzeby modułów obsługi

Definicje TypeScript dla różnych metod wywołania zwrotnego zostały znormalizowane. Powinno to zapewnić większy komfort programistom, którzy używają TypeScriptu i piszą własny kod do implementacji lub wywoływania modułów obsługi.

okno-skrzynki roboczej

Nowa metoda messageSkipWaiting()

Do modułu workbox-window została dodana nowa metoda (messageSkipWaiting()), która upraszcza aktywowanie oczekującego” skryptu service worker. W ten sposób możesz:

  • Wywołuje on postMessage() ze standardową treścią wiadomości {type: 'SKIP_WAITING'}, pod kątem której skrypt service worker wygenerowany przez skrzynkę roboczą sprawdza, aby aktywować skipWaiting().
  • Wybiera prawidłowy „oczekujący” skrypt service worker, w którym zostanie wysłana wiadomość, nawet jeśli nie jest to ten sam skrypt service worker, za pomocą którego zarejestrowano aplikację workbox-window.

Usunięcie zdarzeń „zewnętrznych” na rzecz usługi isExternal

Wszystkie zdarzenia "external" w lokalizacji workbox-window zostały usunięte zamiast „normalnych” zdarzeń z właściwością isExternal ustawioną na true. Dzięki temu deweloperzy, którym zależy na różnicy, będą ją mogli wykryć, a deweloperzy, którzy nie potrzebują informacji, będą mogli ją zignorować.

Przepis na temat czyszczenia strony „Zaproponuj użytkownikom ponowne załadowanie strony”

Dzięki obu powyższych zmianom przepis „Zaproponuj użytkownikom ponowne załadowanie strony” można uprościć:

MULTI_LINE_CODE_PLACEHOLDER_0

routing skrzynki roboczej

Nowy parametr logiczny sameOrigin jest przekazywany do funkcji matchCallback używanej w obiekcie workbox-routing. Ma wartość true, jeśli żądanie dotyczy adresu URL z tej samej domeny. W przeciwnym razie ma wartość false (fałsz).

Upraszcza to niektóre popularne schematy:

MULTI_LINE_CODE_PLACEHOLDER_1

MatchOptions w oknie Workbox-expiration

Możesz teraz ustawić matchOptions w workbox-expiration, który będzie następnie przekazywany jako CacheQueryOptions do odpowiedniego wywołania cache.delete(). (Większość programistów nie musi tego robić).

tworzenie buforowania w polu roboczym

Korzysta ze strategii dotyczących pól roboczych

Tabela workbox-precaching została przepisana i używa workbox-strategies jako podstawy. Nie powinno to spowodować żadnych zmian powodujących błędy i powinno prowadzić do długotrwałej spójności sposobu, w jaki dwa moduły uzyskują dostęp do sieci i pamięci podręcznej.

Blokowanie obecnie przetwarza wpisy pojedynczo, a nie zbiorczo

Pakiet workbox-precaching został zaktualizowany, tak aby w pliku manifestu precache przechowywane były tylko 1 wpisy naraz, zamiast próbować wysyłać żądania i pamięć o nich w pamięci podręcznej jednocześnie (zachowywać przeglądarkę w celu określenia, jak ograniczyć działanie).

Powinno to zmniejszyć prawdopodobieństwo wystąpienia błędów net::ERR_INSUFFICIENT_RESOURCES podczas wstępnego buforowania, a także ograniczyć rywalizację o przepustowość między zapisywaniem w pamięci podręcznej a jednoczesnymi żądaniami wysyłanymi przez aplikację internetową.

PrecacheFallbackPlugin ułatwia tworzenie reklam zastępczych offline

Komponent workbox-precaching zawiera teraz element PrecacheFallbackPlugin, który implementuje nową metodę cyklu życia handlerDidError dodaną w wersji 6.

Ułatwia to określenie adresu URL zapisanego w pamięci podręcznej jako „zastępczej” dla danej strategii, gdy odpowiedź w innym przypadku nie byłaby dostępna. Wtyczka zadba o prawidłową skonstruowanie klucza pamięci podręcznej dla wstępnie zapisanego adresu URL z uwzględnieniem wszystkich potrzebnych parametrów wersji.

Oto przykład użycia obiektu /offline.html w pamięci podręcznej w sytuacji, gdy strategia NetworkOnly nie może wygenerować odpowiedzi na żądanie nawigacji – innymi słowy, wyświetla niestandardową stronę HTML offline:

MULTI_LINE_CODE_PLACEHOLDER_2

precacheFallback w pamięci podręcznej w czasie działania

Jeśli zamiast ręcznego pisania skryptu service worker tworzysz za pomocą generateSW, możesz użyć nowej opcji konfiguracji precacheFallback w runtimeCaching, aby osiągnąć to samo:

{
  // ... other generateSW config options...
  runtimeCaching: [{
    urlPattern: ({request}) => request.mode === 'navigate',
    handler: 'NetworkOnly',
    options: {
      precacheFallback: {
        // This URL needs to be included in your precache manifest.
        fallbackURL: '/offline.html',
      },
    },
  }],
}

Jak uzyskać pomoc

Przewidujemy, że większość migracji będzie prosta. Jeśli napotkasz problemy, których nie obejmuje ten przewodnik, daj nam znać, otwierając problem na GitHubie.