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.