Workbox предоставляет набор инструментов для упрощения работы с сервис-воркерами и кешированием ресурсов в веб-приложениях. Основным элементом этой библиотеки являются стратегии кэширования, каждая из которых позволяет детально управлять поведением сервис-воркера при запросах ресурсов. Рассмотрим ключевые параметры настройки стратегий и их влияние на работу приложения.
Workbox включает несколько встроенных стратегий, каждая из которых реализует конкретный алгоритм обработки запросов:
NetworkFirst Пытается сначала получить ресурс с сети. Если сеть недоступна, возвращается закешированная версия. Полезна для динамического контента, который часто обновляется.
CacheFirst Сначала проверяет кэш, а только при его отсутствии — обращается к сети. Подходит для статических ресурсов, таких как изображения, шрифты, иконки.
StaleWhileRevalidate Возвращает сразу закешированную версию, а параллельно обновляет кэш свежей версией из сети. Оптимальна для контента, где важна скорость отклика, но при этом требуется актуальность данных.
NetworkOnly и CacheOnly Стратегии для случаев, когда необходимо полностью полагаться на сеть или только на кэш.
Каждая стратегия в Workbox может быть настроена с использованием объекта конфигурации. Основные параметры:
cacheName Определяет имя кэша, в котором будут храниться ресурсы. Полезно при разделении кэшей для разных типов контента.
new workbox.strategies.CacheFirst({
cacheName: 'images-cache',
});plugins Массив плагинов, позволяющих расширить функциональность стратегии:
ExpirationPlugin — управление сроком жизни и
количеством элементов кэша.CacheableResponsePlugin — фильтрация кэшируемых ответов
по статусу или заголовкам.new workbox.strategies.NetworkFirst({
cacheName: 'api-cache',
plugins: [
new workbox.expiration.ExpirationPlugin({
maxEntries: 50,
maxAgeSeconds: 24 * 60 * 60, // 1 день
}),
],
});fetchOptions Позволяет передавать дополнительные
опции в fetch, например credentials или
mode.
new workbox.strategies.NetworkFirst({
fetchOptions: {
credentials: 'include',
},
});matchOptions Настройки для поиска ресурсов в
кэше (Cache.match). С помощью этих параметров можно
учитывать или игнорировать поисковые параметры URL, методы запроса и
т.д.
new workbox.strategies.CacheFirst({
matchOptions: {
ignoreSearch: true,
},
});Workbox поддерживает систему плагинов, расширяющих стандартное поведение кэширования:
ExpirationPlugin Контролирует количество и возраст кэшируемых элементов:
maxEntries — максимальное число элементов в кэше.maxAgeSeconds — максимальное время хранения.CacheableResponsePlugin Позволяет кэшировать только определённые ответы, например с кодом 200:
new workbox.strategies.CacheFirst({
plugins: [
new workbox.cacheableResponse.CacheableResponsePlugin({
statuses: [0, 200],
}),
],
});BroadcastUpdatePlugin Сообщает клиенту о том, что ресурс в кэше был обновлён, что удобно для синхронизации данных.
BackgroundSyncPlugin Позволяет повторять сетевые запросы при восстановлении соединения, полезно для офлайн-режима.
Приоритет кэша и сети Параметры стратегии
определяют, какой источник является приоритетным. Для динамических API
чаще выбирается NetworkFirst, для статических ресурсов —
CacheFirst.
Срок жизни кэша и количество элементов Оптимизация размера кэша предотвращает переполнение и обеспечивает актуальность данных.
Обработка ошибок сети Стратегии могут быть расширены плагинами для управления ошибками, повторной попыткой или fallback-ресурсами.
Игнорирование query-параметров Иногда требуется кэшировать URL без учёта поисковых параметров, чтобы разные варианты одного ресурса не создавали дублирующие записи.
import {registerRoute} from 'workbox-routing';
import {CacheFirst, NetworkFirst} from 'workbox-strategies';
import {ExpirationPlugin, CacheableResponsePlugin} from 'workbox-plugins';
// Кэширование изображений
registerRoute(
({request}) => request.destination === 'image',
new CacheFirst({
cacheName: 'images-cache',
plugins: [
new ExpirationPlugin({ maxEntries: 100, maxAgeSeconds: 7 * 24 * 60 * 60 }),
new CacheableResponsePlugin({ statuses: [0, 200] })
]
})
);
// Кэширование API-запросов
registerRoute(
({url}) => url.pathname.startsWith('/api/'),
new NetworkFirst({
cacheName: 'api-cache',
plugins: [
new ExpirationPlugin({ maxEntries: 50, maxAgeSeconds: 24 * 60 * 60 }),
],
fetchOptions: { credentials: 'include' }
})
);
В этом примере продемонстрированы две стратегии с разной конфигурацией: для изображений используется быстрый доступ из кэша, а для API — приоритет сети с кэшированием на случай офлайн-доступа. Плагины обеспечивают контроль за сроком хранения и фильтрацию кэшируемых ответов.