Класс Route является ключевым элементом системы
маршрутизации в Workbox, отвечающим за определение правил обработки
сетевых запросов сервис-воркером. Каждый объект Route
связывает определённый паттерн запроса с
стратегией кэширования или функцией обработчика
запроса.
Объект Route создаётся с помощью конструктора:
new Route(matchCallback, handler, method = 'GET');
Параметры конструктора:
matchCallback – функция, определяющая, подходит ли запрос для маршрута.
(request: Request, url: URL) => booleantrue, если маршрут должен обработать данный
запрос, и false в противном случае.const matchImages = ({request}) => request.destination === 'image';handler – объект стратегии Workbox или функция, обрабатывающая запрос.
CacheFirst,
NetworkFirst, StaleWhileRevalidate,
NetworkOnly, CacheOnly.(options: {request, url, event}) => Promise<Response>.const imageHandler = new workbox.strategies.CacheFirst({
cacheName: 'images-cache',
plugins: [
new workbox.expiration.ExpirationPlugin({ maxEntries: 50 })
]
});method – HTTP-метод, на который реагирует
маршрут. По умолчанию 'GET'.
'POST', 'PUT' или любые
другие методы.new Route(matchImages, imageHandler, 'GET');Функция matchCallback может быть реализована разными
способами:
По регулярному выражению:
const jsFilesRoute = new workbox.routing.Route(
({url}) => /\.js$/.test(url.pathname),
new workbox.strategies.NetworkFirst()
);По точному совпадению URL:
const specificRoute = new workbox.routing.Route(
({url}) => url.pathname === '/index.html',
new workbox.strategies.CacheFirst()
);С использованием других свойств запроса:
const apiRoute = new workbox.routing.Route(
({request}) => request.headers.get('Accept')?.includes('application/json'),
new workbox.strategies.NetworkFirst()
);Обработчик может быть стратегией кэширования или пользовательской функцией. Основные возможности стратегий:
Пользовательская функция может использовать полный контроль над процессом обработки:
const customHandler = async ({request}) => {
const response = await fetch(request);
// Дополнительная логика, например, модификация заголовков
return response;
};
true или false.Promise<Response>.После создания объектов Route, их нужно зарегистрировать
в Router:
const router = new workbox.routing.Router();
router.registerRoute(jsFilesRoute);
router.registerRoute(specificRoute);
router.registerRoute(apiRoute);
При поступлении запроса сервис-воркер вызывает
router.handleRequest(event), который проверяет все маршруты
и применяет первый подходящий.
'POST' и 'GET' должны быть отдельными, так как
логика обработки отличается.Хотите, я подготовлю наглядную таблицу всех стратегий Workbox с их поведением в контексте Route? Это сильно упрощает понимание взаимодействия matchCallback и handler.