Workbox предоставляет мощный механизм для управления кэшированием и обработкой сетевых запросов через сервис-воркеры. Одним из ключевых компонентов этого механизма является сопоставление запросов с помощью функций, которое позволяет гибко контролировать, какие ресурсы должны обрабатываться определёнными стратегиями кэширования.
Сопоставление запросов осуществляется через регулярные выражения, строки или функции обратного вызова. Наиболее гибкий и настраиваемый способ — использование функций, так как они позволяют применять любую логику для определения, подходит ли запрос под стратегию.
Сигнатура функции сопоставления выглядит следующим образом:
function matchCallback({ url, request, event }) {
// url: объект URL запроса
// request: объект Request
// event: событие fetch
return true | false;
}
Возвращаемое значение функции должно быть
логическим: true для соответствия
стратегии, false — если стратегия применяться не
должна.
import { registerRoute } from 'workbox-routing';
import { NetworkFirst } from 'workbox-strategies';
registerRoute(
({ url }) => url.pathname.startsWith('/api/data') && url.searchParams.has('v'),
new NetworkFirst({
cacheName: 'api-cache',
})
);
В этом примере стратегия NetworkFirst применяется только
к запросам с путём, начинающимся с /api/data и содержащим
параметр v.
registerRoute(
({ request }) => request.headers.get('X-Custom-Header') === 'Workbox',
new NetworkFirst({
cacheName: 'custom-header-cache',
})
);
Использование заголовков позволяет динамически реагировать на специфические типы запросов и применять индивидуальные стратегии кэширования.
registerRoute(
({ url, request }) => url.pathname.endsWith('.json') && request.method === 'GET',
new NetworkFirst({
cacheName: 'json-cache',
})
);
Это позволяет кэшировать только GET-запросы к JSON-файлам, игнорируя POST или PUT-запросы.
Функции сопоставления можно комбинировать с любыми стратегиями Workbox:
Пример:
import { StaleWhileRevalidate } from 'workbox-strategies';
registerRoute(
({ url }) => url.origin === 'https://cdn.example.com',
new StaleWhileRevalidate({
cacheName: 'cdn-assets',
plugins: [
{
cacheWillUpdate: async ({ response }) => {
if (response.status === 200) return response;
return null;
}
}
]
})
);
Здесь используется функция для фильтрации только запросов к конкретному хосту и условие для обновления кэша только при успешном ответе.
Функции сопоставления запросов в Workbox создают мощный инструмент для тонкой настройки сервис-воркеров и управления кэшированием, позволяя реализовать сложные сценарии обработки запросов без усложнения основной логики приложения.