Workbox предоставляет гибкий и мощный механизм маршрутизации запросов в сервис-воркере. Один из ключевых подходов — маршрутизация по типу ресурса. Она позволяет задать отдельные стратегии кеширования для JavaScript, CSS, изображений, шрифтов и других типов файлов, что обеспечивает оптимизацию производительности и точный контроль над поведением кеша.
Маршрутизация по типу ресурса строится на сопоставлении типов
MIME или расширений файлов с определёнными обработчиками.
Workbox предоставляет метод registerRoute, который
принимает следующие аргументы:
cacheFirst, networkFirst,
staleWhileRevalidate и т. д.).GET).Пример базовой маршрутизации по расширению файла:
import { registerRoute } from 'workbox-routing';
import { CacheFirst } from 'workbox-strategies';
registerRoute(
({ request }) => request.destination === 'image',
new CacheFirst({
cacheName: 'images-cache',
plugins: [
// Плагины для управления кешем и его размерами
],
})
);
В данном примере все запросы с типом ресурса image будут
обрабатываться стратегией CacheFirst. Это означает, что
сначала сервис-воркер будет искать ресурс в кеше, и только если его нет
— обращаться к сети.
Workbox определяет несколько основных категорий ресурсов, на которые можно ориентироваться при маршрутизации:
Использование свойства request.destination позволяет
точно определить тип ресурса, независимо от расширения файла или
пути.
JavaScript и CSS
import { StaleWhileRevalidate } from 'workbox-strategies';
registerRoute(
({ request }) => request.destination === 'script' || request.destination === 'style',
new StaleWhileRevalidate({
cacheName: 'static-resources',
plugins: [
// Например, плагин для автоматического удаления старых кешей
],
})
);
Стратегия StaleWhileRevalidate позволяет пользователю
получить мгновенный доступ к кешированной версии файла, а обновление
ресурса происходит в фоне.
Изображения
import { CacheFirst } from 'workbox-strategies';
import { ExpirationPlugin } from 'workbox-expiration';
registerRoute(
({ request }) => request.destination === 'image',
new CacheFirst({
cacheName: 'images-cache',
plugins: [
new ExpirationPlugin({
maxEntries: 50,
maxAgeSeconds: 30 * 24 * 60 * 60, // 30 дней
}),
],
})
);
Для изображений важно ограничивать количество кешированных файлов и срок их хранения, чтобы не перегружать память устройства.
Шрифты
import { CacheFirst } from 'workbox-strategies';
import { ExpirationPlugin } from 'workbox-expiration';
registerRoute(
({ request }) => request.destination === 'font',
new CacheFirst({
cacheName: 'fonts-cache',
plugins: [
new ExpirationPlugin({
maxEntries: 20,
maxAgeSeconds: 365 * 24 * 60 * 60, // 1 год
}),
],
})
);
Шрифты редко обновляются, поэтому стратегией CacheFirst
можно использовать их долгосрочное кеширование.
Иногда полезно маршрутизировать по расширению файла, а не только по
request.destination. Для этого Workbox поддерживает
использование регулярных выражений:
registerRoute(
/\.(?:png|jpg|jpeg|svg|gif)$/,
new CacheFirst({
cacheName: 'images-cache',
plugins: [
new ExpirationPlugin({ maxEntries: 60 }),
],
})
);
Это полезно для случаев, когда сервер возвращает некорректный
Content-Type или когда нужно объединить несколько типов
ресурсов в одну стратегию.
Workbox предоставляет множество плагинов, которые позволяют расширить возможности маршрутизации по типу ресурса:
Пример использования нескольких плагинов одновременно:
import { CacheableResponsePlugin } from 'workbox-cacheable-response';
import { BroadcastUpdatePlugin } from 'workbox-broadcast-update';
registerRoute(
({ request }) => request.destination === 'script',
new StaleWhileRevalidate({
cacheName: 'js-cache',
plugins: [
new CacheableResponsePlugin({ statuses: [0, 200] }),
new BroadcastUpdatePlugin({ channelName: 'js-updates' }),
],
})
);
Workbox позволяет создавать динамические маршруты на основе более
сложной логики, используя функцию matchCallback. Например,
можно обрабатывать определённые файлы по шаблону URL и типу ресурса
одновременно:
registerRoute(
({ request, url }) => url.pathname.startsWith('/assets/') && request.destination === 'image',
new CacheFirst({ cacheName: 'assets-images' })
);
Такой подход позволяет объединять преимущества маршрутизации по типу ресурса и по пути, создавая гибкую и масштабируемую структуру кеширования.
Хотите, я подготовлю следующую часть с детальным разбором стратегий обновления и версионирования кеша в Workbox для разных типов ресурсов? Это будет логичное продолжение данной главы.