Workbox предоставляет мощный инструмент для управления кэшированием и обработкой сетевых запросов через сервис-воркеры. В основе этой функциональности лежит роутер, который определяет, как обрабатывать различные запросы, и позволяет реализовать стратегии кэширования, переадресации и других сетевых операций.
Роут в Workbox — это объект, который связывает определённый паттерн запроса с конкретной стратегией обработки. Паттерн может быть:
true для обработки конкретного
запроса.Пример регистрации маршрута с использованием регулярного выражения:
import { registerRoute } from 'workbox-routing';
import { StaleWhileRevalidate } from 'workbox-strategies';
registerRoute(
({ request }) => request.destination === 'image',
new StaleWhileRevalidate({
cacheName: 'images-cache',
plugins: [
// Возможные плагины, например, для ограничения размера кэша
],
})
);
Здесь каждый запрос на изображение обрабатывается стратегией
StaleWhileRevalidate, а кэш для изображений хранится
отдельно.
Роутер в Workbox представлен как централизованный объект, который хранит все зарегистрированные маршруты и определяет логику их применения при каждом запросе.
Основные элементы:
Процесс обработки запроса можно описать пошагово:
Роутер тесно связан с стратегиями, которые определяют поведение кэша и сети. Workbox предоставляет несколько встроенных стратегий:
Каждая стратегия может быть дополнена плагинами:
ExpirationPlugin).CacheableResponsePlugin).BroadcastUpdatePlugin).Роутер обрабатывает маршруты в порядке регистрации, что позволяет задавать приоритет. Более конкретные маршруты следует регистрировать первыми, а универсальные шаблоны — последними.
Пример:
// Конкретный маршрут для API-запросов
registerRoute(
/\/api\/.*$/,
new NetworkFirst({
cacheName: 'api-cache',
})
);
// Универсальный маршрут для всех остальных запросов
registerRoute(
({ request }) => request.destination === 'document',
new StaleWhileRevalidate({
cacheName: 'pages-cache',
})
);
Роутер позволяет назначать fallback-ресурсы для случаев, когда запрос не может быть выполнен ни через сеть, ни через кэш. Это реализуется с помощью страховых стратегий или собственного обработчика:
import { setCatchHandler } from 'workbox-routing';
setCatchHandler(async ({ event }) => {
if (event.request.destination === 'document') {
return caches.match('/offline.html');
}
return Response.error();
});
Таким образом, роутер обеспечивает централизованное управление всеми запросами и позволяет внедрять гибкую, детализированную стратегию кэширования для различных типов ресурсов.
Workbox поддерживает динамическое добавление маршрутов во время выполнения. Это позволяет адаптировать поведение сервис-воркера к изменяющимся условиям приложения, например:
import { workbox } from 'workbox-core';
self.addEventListener('message', (event) => {
if (event.data && event.data.type === 'ADD_ROUTE') {
registerRoute(
event.data.pattern,
new CacheFirst({
cacheName: 'dynamic-cache',
})
);
}
});
Для сложных проектов Workbox предоставляет возможность отслеживать работу роутера. Включение debug-режима позволяет видеть, какой маршрут обрабатывает конкретный запрос:
import { setConfig } from 'workbox-core';
setConfig({ debug: true });
Каждое совпадение маршрута и использование стратегии будет выводиться в консоль, что значительно упрощает отладку и анализ поведения сервис-воркера.