Migracja z Workbox 5 do 6

Ten przewodnik skupia się na zmianach wprowadzonych w wersji 6 Workboxa, a także zawiera przykłady zmian, które należy wprowadzić podczas aktualizacji z wersji 5 Workboxa.

Zmiany powodujące niezgodność

workbox-core

Metoda skipWaiting() w metodzie workbox-core nie będzie już dodawać modułu obsługi install i odpowiada wyłącznie wywołaniu self.skipWaiting().

Od teraz użyj self.skipWaiting(), ponieważ skipWaiting() zostanie prawdopodobnie usunięty z Workboxa w wersji 7.

workbox-precaching

  • Dokumentów HTML z innych domen, które odpowiadają adresom URL przekierowania HTTP, nie można już używać w celu spełnienia żądania nawigacji za pomocą workbox-precaching. Ten scenariusz jest zazwyczaj nietypowy.
  • Parametr zapytania w adresie URL fbclid jest teraz ignorowany przez workbox-precaching podczas wyszukiwania odpowiedzi z poziomu pamięci podręcznej dla danego żądania.
  • Konstruktor PrecacheController przyjmuje teraz jako parametr obiekt z określonymi właściwościami zamiast ciągu znaków. Ten obiekt obsługuje te właściwości: cacheName (służący do tego samego celu co ciąg przekazany do konstruktora w wersji 5), plugins (zastępuje metodę addPlugins() w wersji 5) i fallbackToNetwork (zastępuje podobną opcję przekazaną do createHandler() i „createHandlerBoundToURL() w wersji 5).
  • Metody install()activate() klasy PrecacheController przyjmują teraz dokładnie 1 parametr, który powinien być ustawiony odpowiednio na InstallEvent lub ActivateEvent.
  • Metoda addRoute() została usunięta z funkcji PrecacheController. Zamiast tego możesz użyć nowej klasy PrecacheRoute do utworzenia trasy, którą następnie możesz zarejestrować.
  • Metoda precacheAndRoute() została usunięta z funkcji PrecacheController. (nadal istnieje jako statyczna metoda pomocnicza wyeksportowana przez moduł workbox-precaching). Został on usunięty, ponieważ zamiast niego można użyć pola PrecacheRoute.
  • Metoda createMatchCalback() została usunięta z funkcji PrecacheController. Zamiast tego możesz użyć nowego atrybutu PrecacheRoute.
  • Metoda createHandler() została usunięta z metody PrecacheController. Zamiast tego do obsługi żądań można użyć właściwości strategy obiektu PrecacheController.
  • Eksport statyczny createHandler() został już usunięty z modułu workbox-precaching. Zamiast tego deweloperzy powinni utworzyć instancję PrecacheController i użyć właściwości strategy.
  • Trasa zarejestrowana w precacheAndRoute() jest teraz „prawdziwą” trasą, która korzysta z klasy Routerworkbox-routing. Może to spowodować inny porządek oceny tras, jeśli przeplatasz wywołania do funkcji registerRoute()precacheAndRoute().

workbox-routing

Metoda setDefaultHandler() przyjmuje teraz opcjonalny drugi parametr odpowiadający metodzie HTTP, której dotyczy, domyślnie 'GET'.

  • Jeśli używasz setDefaultHandler() i wszystkie Twoje żądania mają wartość GET, nie musisz wprowadzać żadnych zmian.
  • Jeśli masz prośby inne niż GET (POST, PUT itp.), setDefaultHandler() nie będzie już powodować dopasowywania tych żądań.

Konfiguracja kompilacji

Opcja mode w trybach getManifestinjectManifest w wersjach workbox-buildworkbox-cli nie była obsługiwana zgodnie z planem i została usunięta. Nie dotyczy to workbox-webpack-plugin, który obsługuje mode w ramach wtyczki InjectManifest.

Narzędzia do kompilowania wymagają Node.js w wersji 10 lub nowszej

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

Nowe ulepszenia

workbox-strategies

Wersja 6.0 Workbox wprowadza nowy sposób definiowania własnych strategii Workbox przez zewnętrznych deweloperów. Dzięki temu deweloperzy zewnętrzni mogą rozszerzać Workbox w sposób w pełni odpowiadający ich potrzebom.

Nowa klasa podstawowa strategii

W wersji 6 wszystkie klasy strategii Workbox muszą rozszerzać nową klasę podstawową Strategy. Wszystkie wbudowane strategie zostały przekształcone, aby je obsługiwać.

Klasa podstawowa Strategy odpowiada za 2 główne kwestie:

  • wywoływanie funkcji zwrotnych cyklu życia wtyczki wspólnej dla wszystkich elementów obsługi strategii (np. podczas uruchamiania, odpowiadania i zatrzymywania).
  • Tworzenie instancji „handlera”, która może zarządzać stanem każdej pojedynczej prośby obsługiwanej przez strategię.

Nowa klasa „handler”

Wcześniej mieliśmy moduły wewnętrzne o nazwach fetchWrappercacheWrapper, które (jak sama nazwa wskazuje) otaczają różne interfejsy API do pobierania i użytkowania pamięci podręcznej za pomocą haka w ich cyklu życia. Obecnie ten mechanizm umożliwia działanie wtyczek, ale deweloperzy nie mają do niego dostępu.

Nowa klasa obsługi (StrategyHandler) będzie udostępniać te metody, aby strategie niestandardowe mogły wywoływać fetch() lub cacheMatch() i mieć automatyczne wywoływanie wtyczek dodanych do instancji strategii.

Ta klasa umożliwiłaby też deweloperom dodawanie własnych niestandardowych wywołań zwrotnych cyklu życia, które mogłyby być specyficzne dla ich strategii i działałyby „bezproblemowo” z dotychczasowym interfejsem wtyczki.

Nowy stan cyklu życia wtyczki

W wersji 5 Workboxa wtyczki są stanowe. Oznacza to, że jeśli żądanie /index.html powoduje wywołanie funkcji zwrotnych requestWillFetchcachedResponseWillBeUsed, te 2 funkcje nie mogą się ze sobą komunikować ani nawet wiedzieć, że zostały wywołane przez to samo żądanie.

W wersji 6 wszystkie wywołania zwrotne wtyczki również będą przekazywane nowy obiekt state. Ten obiekt stanu będzie unikalny dla tego konkretnego obiektu wtyczki i tej konkretnej wywołania strategii (czyli wywołania funkcji handle()). Umożliwia to deweloperom pisanie wtyczek, w których jedna funkcja zwracająca wywołanie może warunkowo wykonać jakąś czynność na podstawie tego, co zrobiła inna funkcja zwracająca wywołanie w tym samym pliku wtyczki (np. obliczyć różnicę czasową między wykonaniem funkcji requestWillFetchfetchDidSucceed lub fetchDidFail).

Nowe wywołania zwrotne cyklu życia wtyczki

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

  • handlerWillStart: wywoływany przed rozpoczęciem działania logiki obsługi. To wywołanie zwrotne może służyć do ustawiania początkowego stanu modułu obsługi (np. zarejestrowania czasu rozpoczęcia).
  • handlerWillRespond: wywoływana przed zwróceniem odpowiedzi przez metodę strategii handle(). Ten wywołanie zwrotne może służyć do modyfikowania odpowiedzi przed jej przekazaniem do modułu obsługi trasy lub innej logiki niestandardowej.
  • handlerDidRespond: jest wywoływany po zwróceniu odpowiedzi przez metodę handle() strategii. To wywołanie zwrotne może służyć do rejestrowania szczegółów ostatecznej odpowiedzi, np. po zmianach wprowadzonych przez inne wtyczki.
  • handlerDidComplete: wywoływana po ustaniu wszystkich przedłużonych obietnic dodanych do zdarzenia z wywołania tej strategii. Ta funkcja z powrotem może służyć do raportowania wszelkich danych, które wymagają oczekiwania na zakończenie działania obsługi, aby można było je obliczyć (np. stan trafienia do pamięci podręcznej, opóźnienie w pamięci podręcznej, opóźnienie w sieci).
  • handlerDidError: wywoływany, gdy moduł obsługi nie może podać prawidłowej odpowiedzi z żadnego źródła. Ten wywołania zwrotnego można użyć do dostarczenia treści „zastępczych” jako alternatywy dla błędu sieci.

Programiści wdrażający własne strategie nie muszą się martwić o wywoływanie tych funkcji zwracania wartości, ponieważ robi to nowa klasa bazowa Strategy.

Dokładniejsze typy TypeScript dla obsługi

Znormalizowane zostały definicje TypeScript dla różnych metod wywołań zwrotnych. Powinna ona ułatwić pracę programistom, którzy używają TypeScript i pisują własny kod do implementacji lub wywoływania obsługi.

workbox-window

Nowa metoda messageSkipWaiting()

Aby uprościć proces aktywowania „oczekującego” pracownika usługi, do modułu workbox-window dodano nową metodę messageSkipWaiting(). Dzięki temu:

  • Wywołuje ona postMessage() z faktycznie standardowym tekstem wiadomości, {type: 'SKIP_WAITING'}, który sprawdza usługa robocza wygenerowana przez Workbox, aby wywołać skipWaiting().
  • Wybiera prawidłowy skrypt service worker, w którym ma zostać opublikowana ta wiadomość, nawet jeśli nie jest to ten sam skrypt service worker, u którego zarejestrowano workbox-window.

Usunięcie zdarzeń „external” na rzecz właściwości isExternal

Wszystkie zdarzenia „zewnętrzne”workbox-window zostały usunięte, a zamiast nich występują „normalne” zdarzenia z ustawionym atrybutem isExternal o wartości true. Dzięki temu deweloperzy, którym zależy na tej różnicy, mogą ją wykryć, a deweloperzy, którzy nie muszą jej znać, mogą zignorować tę właściwość.

Lepsza receptura „Oferuj użytkownikom odświeżanie strony”

Dzięki tym dwóm zmianom można uprościć regułę „Zaoferuj użytkownikom możliwość ponownego załadowania strony”:

MULTI_LINE_CODE_PLACEHOLDER_0

workbox-routing

Do funkcji matchCallback używanej w funkcji workbox-routing jest przekazywany nowy parametr logiczny sameOrigin. Ma wartość true, jeśli żądanie dotyczy adresu URL z tej samej domeny. W przeciwnym razie ma wartość false.

Upraszcza to niektóre popularne schematy:

MULTI_LINE_CODE_PLACEHOLDER_1

matchOptions w workbox-expiration

Teraz możesz ustawić wartość matchOptions w funkcji workbox-expiration, która zostanie przekazana jako parametr CacheQueryOptions do wywołania funkcji cache.delete(). (większość deweloperów nie musi tego robić).

workbox-precaching

Używa strategii dotyczących workboxa.

Element workbox-precaching został przepisany, aby używać jako podstawy elementu workbox-strategies. Nie powinno to spowodować żadnych zmian powodujących niezgodność i powinno poprawić długoterminową spójność sposobu, w jaki oba moduły uzyskują dostęp do sieci i pamięci podręcznej.

Wstępne buforowanie przetwarza teraz wpisy pojedynczo, a nie zbiorczo

Pole workbox-precaching zostało zaktualizowane, dzięki czemu żąda i buforuje tylko 1 wpis w pliku manifestu precache, zamiast żądać wszystkich jednocześnie i buforować je w pamięci podręcznej (pozostawiając zapytanie w przeglądarce, aby dowiedzieć się, jak ograniczyć ruch).

To powinno zmniejszyć ryzyko net::ERR_INSUFFICIENT_RESOURCES błędów podczas wstępnego buforowania. Powinno to też zmniejszyć rywalizację o przepustowość między wczytywaniem w pamięci podręcznej a równoczesnymi żądaniami wysyłanymi przez aplikację internetową.

PrecacheFallbackPlugin umożliwia łatwiejszy tryb offline

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

Dzięki temu możesz łatwo określić wstępnie z pamięci podręcznej adres URL jako „awaryjny” dla danej strategii, gdy odpowiedź nie jest dostępna. Wtyczka zajmie się prawidłowym skonstruowaniem klucza pamięci podręcznej dla wstępnie z pamięci podręcznej adresu URL, w tym dowolnego wymaganego parametru rewizji.

Oto przykład użycia tej funkcji do wyświetlenia w odpowiedzi z wykorzystaniem wcześniej wygenerowanego /offline.html, gdy strategia NetworkOnly nie może wygenerować odpowiedzi na żądanie nawigacyjne (czyli wyświetla niestandardową stronę HTML offline):

MULTI_LINE_CODE_PLACEHOLDER_2

precacheFallback w pamięci podręcznej środowiska wykonawczego

Jeśli zamiast ręcznego pisania serwisowego workera używasz generateSW, aby utworzyć go dla siebie, możesz użyć nowej opcji konfiguracji precacheFallbackruntimeCaching, aby osiągnąć ten sam efekt:

{
  // ... 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',
      },
    },
  }],
}

Uzyskiwanie pomocy

Przewidujemy, że migracja w większości przypadków będzie prosta. Jeśli napotkasz problemy, których nie ma w tym przewodniku, otwórz zgłoszenie na GitHubie.