Workbox предоставляет мощный механизм для управления кэшированием ресурсов и обработкой сетевых запросов через сервис-воркеры. Одной из ключевых возможностей является настройка fallback-страниц и fallback-ответов, которые используются, когда основной ресурс недоступен, например, из-за отсутствия интернет-соединения.
Fallback — это запасной ресурс, который возвращается пользователю в случае, если запрос к серверу или кэшу не увенчался успехом. В контексте Workbox это может быть:
Fallback помогает сохранить пользовательский опыт даже в условиях ограниченной или отсутствующей сети, предотвращая отображение пустых экранов или ошибок.
workbox.routing.setCatchHandlerДля настройки fallback Workbox использует метод
setCatchHandler, который позволяет
определить глобальную функцию обработки ошибок при запросах.
Пример настройки fallback-страницы для HTML:
import {registerRoute} from 'workbox-routing';
import {NetworkOnly} from 'workbox-strategies';
import {setCatchHandler} from 'workbox-routing';
import {precacheAndRoute} from 'workbox-precaching';
precacheAndRoute([
{url: '/offline.html', revision: '1'},
]);
registerRoute(
({request}) => request.destination === 'document',
new NetworkOnly()
);
setCatchHandler(async ({event}) => {
if (event.request.destination === 'document') {
return caches.match('/offline.html');
}
return Response.error();
});
Объяснение работы кода:
precacheAndRoute обеспечивает предварительное
кэширование страницы /offline.html.registerRoute с стратегией NetworkOnly
означает, что HTML-страницы всегда запрашиваются из сети.setCatchHandler перехватывает ошибки сети и подставляет
кэшированную offline-страницу при недоступности документа.Для API-запросов полезно возвращать заранее подготовленные JSON-ответы или пустые объекты вместо ошибки.
Пример:
setCatchHandler(async ({event}) => {
if (event.request.destination === 'document') {
return caches.match('/offline.html');
} else if (event.request.url.includes('/api/')) {
return new Response(JSON.stringify({error: 'Нет соединения'}), {
headers: {'Content-Type': 'application/json'},
});
}
return Response.error();
});
Такой подход позволяет фронтенду корректно обрабатывать отсутствие сети и отображать сообщения об ошибках вместо падения приложения.
Для статического контента, например, изображений, можно возвращать заглушку при недоступности ресурса:
setCatchHandler(async ({event}) => {
if (event.request.destination === 'image') {
return caches.match('/images/fallback.png');
}
return Response.error();
});
Эта техника особенно полезна для e-commerce сайтов или галерей, где изображение продукта должно быть показано даже при ошибках сети.
Fallback удобно комбинировать с различными стратегиями Workbox:
Пример использования с NetworkFirst:
import {NetworkFirst} from 'workbox-strategies';
registerRoute(
({request}) => request.destination === 'document',
new NetworkFirst({
cacheName: 'pages-cache',
plugins: [
{
fetchDidFail: async () => caches.match('/offline.html')
}
]
})
);
setCatchHandler позволяет централизованно управлять всеми
ошибками.Для мультиязычных сайтов рекомендуется кэшировать несколько версий fallback и подставлять нужную в зависимости от локали:
precacheAndRoute([
{url: '/offline-en.html', revision: '1'},
{url: '/offline-ru.html', revision: '1'},
]);
setCatchHandler(async ({event}) => {
const lang = navigator.language.startsWith('ru') ? 'ru' : 'en';
if (event.request.destination === 'document') {
return caches.match(`/offline-${lang}.html`);
}
return Response.error();
});
Fallback-страницы и fallback-ответы позволяют Workbox создавать устойчивые к сетевым проблемам приложения, обеспечивая бесшовный пользовательский опыт при отсутствии подключения или ошибках сервера.