Класс Route и его параметры

Класс Route является ключевым элементом системы маршрутизации в Workbox, отвечающим за определение правил обработки сетевых запросов сервис-воркером. Каждый объект Route связывает определённый паттерн запроса с стратегией кэширования или функцией обработчика запроса.


Конструктор Route

Объект Route создаётся с помощью конструктора:

new Route(matchCallback, handler, method = 'GET');

Параметры конструктора:

  1. matchCallback – функция, определяющая, подходит ли запрос для маршрута.

    • Сигнатура: (request: Request, url: URL) => boolean
    • Возвращает true, если маршрут должен обработать данный запрос, и false в противном случае.
    • Пример использования:
    const matchImages = ({request}) => request.destination === 'image';
  2. 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 })
        ]
    });
  3. method – HTTP-метод, на который реагирует маршрут. По умолчанию 'GET'.

    • Можно задать 'POST', 'PUT' или любые другие методы.
    • Пример:
    new Route(matchImages, imageHandler, 'GET');

Параметры matchCallback

Функция matchCallback может быть реализована разными способами:

  1. По регулярному выражению:

    const jsFilesRoute = new workbox.routing.Route(
        ({url}) => /\.js$/.test(url.pathname),
        new workbox.strategies.NetworkFirst()
    );
  2. По точному совпадению URL:

    const specificRoute = new workbox.routing.Route(
        ({url}) => url.pathname === '/index.html',
        new workbox.strategies.CacheFirst()
    );
  3. С использованием других свойств запроса:

    const apiRoute = new workbox.routing.Route(
        ({request}) => request.headers.get('Accept')?.includes('application/json'),
        new workbox.strategies.NetworkFirst()
    );

Параметры handler

Обработчик может быть стратегией кэширования или пользовательской функцией. Основные возможности стратегий:

  • CacheFirst: сначала ищет ресурс в кэше, при отсутствии – запрашивает из сети.
  • NetworkFirst: сначала обращается к сети, при ошибке или отсутствии – берёт из кэша.
  • StaleWhileRevalidate: отдаёт кэшированный ресурс и параллельно обновляет его из сети.
  • CacheOnly: всегда берёт ресурс из кэша.
  • NetworkOnly: всегда запрашивает ресурс из сети.

Пользовательская функция может использовать полный контроль над процессом обработки:

const customHandler = async ({request}) => {
    const response = await fetch(request);
    // Дополнительная логика, например, модификация заголовков
    return response;
};

Методы и свойства Route

  • match(request) – проверяет, подходит ли запрос под маршрут, возвращает true или false.
  • handle(request, event) – вызывает обработчик маршрута и возвращает Promise<Response>.
  • method – свойство маршрута, указывающее HTTP-метод.
  • handler – возвращает объект стратегии или функцию-обработчик.
  • matchCallback – возвращает функцию сопоставления запроса.

Использование Route с Router

После создания объектов Route, их нужно зарегистрировать в Router:

const router = new workbox.routing.Router();
router.registerRoute(jsFilesRoute);
router.registerRoute(specificRoute);
router.registerRoute(apiRoute);

При поступлении запроса сервис-воркер вызывает router.handleRequest(event), который проверяет все маршруты и применяет первый подходящий.


Рекомендации по использованию

  • Чётко разделять маршруты: отдельные маршруты для статических ресурсов, API и страниц.
  • Оптимизировать регулярные выражения: сложные паттерны могут замедлять сопоставление.
  • Использовать плагины Workbox для обработки кэша, ограничения количества записей и контроля времени хранения.
  • Обращать внимание на метод HTTP: маршруты для 'POST' и 'GET' должны быть отдельными, так как логика обработки отличается.

Хотите, я подготовлю наглядную таблицу всех стратегий Workbox с их поведением в контексте Route? Это сильно упрощает понимание взаимодействия matchCallback и handler.