Принцип работы
Стратегия Cache Only в библиотеке Workbox предназначена
для ситуаций, когда все запросы должны обслуживаться исключительно из
кэша. Любые сетевые обращения при использовании этой стратегии
отсутствуют. Если запрошенный ресурс отсутствует в кэше, запрос
завершится неудачей с соответствующей ошибкой. Эта стратегия идеально
подходит для ресурсов, которые редко изменяются, но должны быть доступны
оффлайн, например, статические изображения, шрифты или локальные
скрипты.
Использование с Workbox
Для реализации стратегии Cache Only необходимо
импортировать соответствующие классы из Workbox:
import { registerRoute } from 'workbox-routing';
import { CacheOnly } from 'workbox-strategies';
Пример регистрации маршрута
registerRoute(
({ request }) => request.destination === 'image',
new CacheOnly({
cacheName: 'images-cache',
matchOptions: {
ignoreSearch: true
}
})
);
В этом примере:
request.destination === 'image' фильтрует запросы
только к изображениям.cacheName: 'images-cache' задаёт имя кэша, из которого
будут извлекаться ресурсы.matchOptions.ignoreSearch: true позволяет игнорировать
параметры запроса в URL при поиске ресурса в кэше.Настройка параметров стратегии
Объект CacheOnly поддерживает несколько ключевых
параметров, которые позволяют гибко управлять поведением стратегии:
cacheName — имя кэша, где хранятся ресурсы. Если не
задано, используется кэш по умолчанию.matchOptions — объект с опциями для метода
Cache.match, например, ignoreSearch,
ignoreVary, cacheName.plugins — массив плагинов Workbox, которые можно
использовать для расширения функционала кэширования. Например,
ExpirationPlugin для ограничения числа элементов в кэше или
BroadcastUpdatePlugin для уведомления об изменениях.Пример с плагином ExpirationPlugin
import { ExpirationPlugin } from 'workbox-expiration';
registerRoute(
({ request }) => request.destination === 'script',
new CacheOnly({
cacheName: 'scripts-cache',
plugins: [
new ExpirationPlugin({
maxEntries: 50,
maxAgeSeconds: 7 * 24 * 60 * 60, // 7 дней
})
]
})
);
Здесь:
maxEntries ограничивает количество элементов в
кэше.maxAgeSeconds задаёт срок жизни ресурсов.Особенности и рекомендации
Cache Only не подходит для
данных, которые часто обновляются или критичны к актуальности.
Использование её для таких ресурсов приведёт к устаревшему
контенту.Cache Only
перекрывает другой с более гибкой стратегией, сетевой запрос может не
выполняться.Cache Only идеально подходит для
предварительно кэшируемых ассетов через precache,
обеспечивая мгновенный доступ без сетевых задержек.Совмещение с precaching
import { precacheAndRoute } from 'workbox-precaching';
precacheAndRoute([
{ url: '/offline.html', revision: '1234' },
{ url: '/styles/main.css', revision: '5678' }
]);
registerRoute(
({ request }) => request.destination === 'document',
new CacheOnly({
cacheName: 'precache-v1'
})
);
В этом примере документы будут извлекаться исключительно из
предзагруженного кэша. Если документ отсутствует в кэше, сервис-воркер
вернёт ошибку, что подчёркивает строгость стратегии
Cache Only.
Отладка и тестирование
ignoreSearch и другие
опции, чтобы избежать ситуации, когда запросы с параметрами не находят
ресурсы.Преимущества стратегии Cache Only
Ограничения
Заключение по применению
Cache Only используется там, где ключевым
является оффлайн-доступ и стабильность ресурсов, а не
актуальность. Чёткая настройка cacheName,
matchOptions и плагинов позволяет адаптировать стратегию
под конкретные задачи, избегая лишнего сетевого трафика и обеспечивая
мгновенную загрузку кэшированных файлов.