W niektórych sytuacjach może być zapisywana odpowiedź zastępcza na wypadek, gdyby użytkownik był offline. Implementacja kreacji zastępczych jest alternatywą dla zachowań w pamięci podręcznej, które zapewniają strategie takie jak koncentracja na sieci czy nieaktualne w trakcie ponownej weryfikacji.
Kreacja zastępcza to ogólna, uniwersalna odpowiedź, która stanowi lepszą wartość zastępczą niż domyślnie ustawiona w przeglądarce w przypadku niepowodzenia żądania. Przykłady:
- Alternatywa dla „brakującego obrazu” .
- Alternatywa HTML dla standardowego ustawienia „Brak dostępnego połączenia sieciowego” stronę.
Tylko strona offline
Jeśli wystarczy podać własną stronę HTML offline, ale nic więcej, oto podstawowy przepis, który możesz zastosować:
import {offlineFallback} from 'workbox-recipes'; import {setDefaultHandler} from 'workbox-routing'; import {NetworkOnly} from 'workbox-strategies'; setDefaultHandler(new NetworkOnly()); offlineFallback();
Powyższy kod korzysta ze strategii setDefaultHandler
, aby domyślnie stosować strategię tylko sieciową dla wszystkich tras. Następnie uruchamia przepis offlineFallback
, aby w przypadku wystąpienia błędu wyświetlać kreację zastępczą offline. Przepis zakłada, że Twój zastępczy plik HTML offline będzie miał nazwę offline.html
i będzie wyświetlany z poziomu głównego serwera WWW.
Kompleksowe rozwiązania zastępcze
Gdy wystąpi awaria sieci lub brak pamięci podręcznej, strategie buforowania oferowane przez workbox-strategies
będą konsekwentnie odrzucane. Sprzyja to umieszczaniu w internecie wzorca ustawiania globalnego typu „catch” radzi sobie z wszelkimi błędami w pojedynczej funkcji obsługi, co pozwala oferować różne wartości zastępcze dla różnych wartości request.destination
.
Poniższy przykład korzysta z przepisu warmStrategyCache
z elementu workbox-recipes
i ustawia moduł obsługi żądań do obsługi elementów znajdujących się w pamięci podręcznej z wyprzedzeniem w pamięci podręcznej środowiska wykonawczego. Jednak w Twojej aplikacji lepszym rozwiązaniem mogą być wstępne buforowanie:
import {warmStrategyCache} from 'workbox-recipes'; import {setDefaultHandler, setCatchHandler} from 'workbox-routing'; import {CacheFirst, StaleWhileRevalidate} from 'workbox-strategies'; // Fallback assets to cache const FALLBACK_HTML_URL = '/offline.html'; const FALLBACK_IMAGE_URL = '/images/image-not-found.jpg'; const FALLBACK_STRATEGY = new CacheFirst(); // Warm the runtime cache with a list of asset URLs warmStrategyCache({ urls: [FALLBACK_HTML_URL, FALLBACK_IMAGE_URL], strategy: FALLBACK_STRATEGY, }); // Use a stale-while-revalidate strategy to handle requests by default. setDefaultHandler(new StaleWhileRevalidate()); // This "catch" handler is triggered when any of the other routes fail to // generate a response. setCatchHandler(async ({request}) => { // The warmStrategyCache recipe is used to add the fallback assets ahead of // time to the runtime cache, and are served in the event of an error below. // Use `event`, `request`, and `url` to figure out how to respond, or // use request.destination to match requests for specific resource types. switch (request.destination) { case 'document': return FALLBACK_STRATEGY.handle({event, request: FALLBACK_HTML_URL}); case 'image': return FALLBACK_STRATEGY.handle({event, request: FALLBACK_IMAGE_URL}); default: // If we don't have a fallback, return an error response. return Response.error(); } });
W następnej kolejności odpowiedzi zastępcze są wstępnie zapisywane w pamięci podręcznej za pomocą injectManifest
z narzędziami do kompilacji Workbox i używane w przypadku błędu związanego z metodą matchPrecache
.
import {matchPrecache, precacheAndRoute} from 'workbox-precaching'; import {setDefaultHandler, setCatchHandler} from 'workbox-routing'; import {StaleWhileRevalidate} from 'workbox-strategies'; // Optional: use the injectManifest mode of one of the Workbox // build tools to precache a list of URLs, including fallbacks. precacheAndRoute(self.__WB_MANIFEST); // Use a stale-while-revalidate strategy to handle requests by default. setDefaultHandler(new StaleWhileRevalidate()); // This "catch" handler is triggered when any of the other routes fail to // generate a response. setCatchHandler(async ({request}) => { // Fallback assets are precached when the service worker is installed, and are // served in the event of an error below. Use `event`, `request`, and `url` to // figure out how to respond, or use request.destination to match requests for // specific resource types. switch (request.destination) { case 'document': // FALLBACK_HTML_URL must be defined as a precached URL for this to work: return matchPrecache(FALLBACK_HTML_URL); case 'image': // FALLBACK_IMAGE_URL must be defined as a precached URL for this to work: return matchPrecache(FALLBACK_IMAGE_URL); default: // If we don't have a fallback, return an error response. return Response.error(); } });
Przykładem użycia drugiej konfiguracji kreacji zastępczej jest sytuacja, w której strona została wcześniej zapisana w pamięci podręcznej, ale obrazy (lub inne zasoby) żądane przez stronę nie zostały pobrane. Gdy użytkownik jest offline, stronę można odczytać z pamięci podręcznej, ale w przypadku błędu sieci można użyć obiektów zastępczych lub innych funkcji.
Ogrzewanie pamięci podręcznej środowiska wykonawczego
Workbox przechowuje osobne pamięci podręczne do wstępnego buforowania i pamięci podręcznej środowiska wykonawczego. Może się też zdarzyć, że zechcesz zapisać coś w pamięci podręcznej z wyprzedzeniem i nie korzystać z wstępnego buforowania, ponieważ aktualizacje pliku manifestu precache będą wymagały wdrożenia zaktualizowanego mechanizmu Service Worker.
Aby z wyprzedzeniem uzupełnić pamięć podręczną środowiska wykonawczego o zasoby, możesz to zrobić, korzystając z przepisu warmStrategyCache
z workbox-recipes
. Ta strategia wywołuje w niej Cache.addAll
w zdarzeniu install
skryptu service worker.
import {warmStrategyCache} from 'workbox-recipes'; import {CacheFirst} from 'workbox-strategies'; // This can be any strategy, CacheFirst used as an example. const strategy = new CacheFirst(); const urls = [ '/offline.html', ]; warmStrategyCache({urls, strategy});
Podsumowanie
Zarządzanie odpowiedziami zastępczymi na nieudane żądania jest dość pracochłonne, ale po wcześniejszym zaplanowaniu możesz skonfigurować aplikację internetową tak, by udostępniała pewne treści i funkcje, gdy użytkownik jest offline.