В Workbox обработчики маршрутов (route handlers) являются ключевым элементом построения сервис-воркера. Они определяют, каким образом будет обрабатываться каждый запрос: кэшироваться, получать обновления с сервера или комбинировать различные стратегии. Для эффективной работы с ними критически важно понимать типизацию обработчиков, особенно в TypeScript, где строгие типы помогают предотвратить ошибки на этапе компиляции.
В Workbox выделяют несколько способов определения обработчиков:
RouteHandlerCallback) Функция, которая принимает
объект запроса и возвращает Promise<Response>:import { RouteHandlerCallback } from 'workbox-core/types';
const handler: RouteHandlerCallback = async ({ request, event, params }) => {
const response = await fetch(request);
return response;
};
Ключевые моменты:
request: Request – объект запроса, переданный
браузером.event: FetchEvent – событие fetch, позволяющее
использовать event.waitUntil().params: Record<string, string> – объект с
параметрами маршрута, если используются динамические сегменты
(:id, :slug и т.д.).Promise<Response>.RouteHandler)
Классы-обработчики предоставляют интерфейс handle для
работы с запросами:import { RouteHandler } from 'workbox-core/types';
class CustomHandler implements RouteHandler {
async handle({ request, event, params }: Parameters<RouteHandler['handle']>[0]) {
return fetch(request);
}
}
Особенности:
handle, что снижает риск ошибок типизации.Маршруты с динамическими сегментами
(/users/:userId/posts/:postId) позволяют автоматически
получать параметры из URL. Workbox поддерживает типизацию
параметров:
interface Params {
userId: string;
postId: string;
}
const handler: RouteHandlerCallback<Params> = ({ params }) => {
console.log(params.userId, params.postId);
return fetch(`/api/users/${params.userId}/posts/${params.postId}`);
};
RequestInit и Response.Workbox предоставляет готовые стратегии (CacheFirst,
NetworkFirst, StaleWhileRevalidate), каждая из
которых реализует интерфейс RouteHandler:
import { CacheFirst } from 'workbox-strategies';
import { registerRoute } from 'workbox-routing';
const cacheFirstHandler = new CacheFirst({
cacheName: 'images-cache',
});
registerRoute(
({ request }) => request.destination === 'image',
cacheFirstHandler
);
Типы обеспечивают:
cacheName,
plugins).handle() вернет
Promise<Response>.Workbox позволяет комбинировать обработчики через цепочку middleware.
Для типизации используется RouteHandlerCallback:
import { Router } from 'workbox-routing';
const router = new Router();
const logger: RouteHandlerCallback = async ({ request }, next) => {
console.log('Запрос:', request.url);
return next ? next() : fetch(request);
};
const cacheHandler: RouteHandlerCallback = async ({ request }) => {
return caches.match(request) || fetch(request);
};
router.registerRoute('/api/:endpoint', [logger, cacheHandler]);
request,
event и params.params и
аргумента next().WorkboxPlugin и типамиОбработчики маршрутов часто используют плагины
(WorkboxPlugin) для кэширования, повторных запросов или
логирования. Типизация помогает:
import { CacheableResponsePlugin } from 'workbox-cacheable-response';
import { CacheFirst } from 'workbox-strategies';
const handler = new CacheFirst({
cacheName: 'api-cache',
plugins: [
new CacheableResponsePlugin({
statuses: [0, 200],
}),
],
});
statuses,
headers, cacheWillUpdate и т.д.).CacheFirst гарантирует, что возвращаемый объект
соответствует Promise<Response>.Типизация обработчиков маршрутов в Workbox позволяет:
Правильная типизация — это не только инструмент компиляции, но и архитектурный подход к построению надежных маршрутов и стратегий работы с сетью и кэшем.