Workbox предоставляет гибкий механизм для управления кэшированием ресурсов в сервис-воркерах, включая возможность ограничения времени жизни (TTL — Time To Live) кэшированных записей. Это критически важно для обеспечения актуальности данных, предотвращения устаревших ресурсов и контроля размера кэша.
ExpirationPluginОсновной инструмент для управления временем жизни записей — плагин
ExpirationPlugin, который входит в пакет
workbox-expiration. Он позволяет задавать два ключевых
ограничения: максимальный срок хранения и максимальное количество
записей в кэше.
import {registerRoute} from 'workbox-routing';
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, // Максимум 50 изображений
maxAgeSeconds: 7 * 24 * 60 * 60, // 7 дней
}),
],
})
);
Пояснение ключевых параметров:
maxEntries — ограничение количества объектов в кэше.
Если лимит превышен, старые записи удаляются по принципу LRU (Least
Recently Used).maxAgeSeconds — максимальный возраст записи в секундах.
После его истечения ресурс автоматически удаляется из кэша.Плагин ExpirationPlugin можно
использовать совместно с различными стратегиями кэширования:
CacheFirst, StaleWhileRevalidate,
NetworkFirst. Это позволяет одновременно управлять временем
жизни ресурсов и определять, как именно будет производиться поиск и
обновление данных.
import {StaleWhileRevalidate} from 'workbox-strategies';
registerRoute(
({request}) => request.destination === 'script',
new StaleWhileRevalidate({
cacheName: 'scripts-cache',
plugins: [
new ExpirationPlugin({
maxAgeSeconds: 24 * 60 * 60, // 1 день
}),
],
})
);
В этом примере скрипты кэшируются, а устаревшие автоматически удаляются через сутки, при этом пользователи получают всегда актуальную версию при первом запросе на сервер.
Workbox обеспечивает автоматическую очистку кэша при превышении
ограничений maxEntries или maxAgeSeconds.
Пользователю не требуется вручную проверять устаревшие записи. Плагин
работает на основе принципа LRU:
maxAgeSeconds).maxEntries).Для динамического контента, например JSON-ответов API,
ExpirationPlugin также применяется. Рекомендуется задавать
короткие TTL, чтобы пользователи не получали устаревшие данные.
registerRoute(
({url}) => url.origin === 'https://api.example.com' && url.pathname.startsWith('/data'),
new NetworkFirst({
cacheName: 'api-cache',
plugins: [
new ExpirationPlugin({
maxEntries: 100,
maxAgeSeconds: 60 * 60, // 1 час
}),
],
})
);
CacheableResponsePluginЧасто вместе с ExpirationPlugin используют
CacheableResponsePlugin для фильтрации
записей, которые кэшируются по статусу ответа или заголовкам. Это
позволяет ограничить время жизни только для успешных ответов, исключая
ошибки или редиректы.
import {CacheableResponsePlugin} from 'workbox-cacheable-response';
new CacheFirst({
cacheName: 'html-cache',
plugins: [
new ExpirationPlugin({ maxAgeSeconds: 24 * 60 * 60 }),
new CacheableResponsePlugin({ statuses: [200] }),
],
});
ExpirationPlugin работает только с кэшами, управляемыми
Workbox. Для сторонних кэшей или ручного кэширования требуется
дополнительная логика.maxAgeSeconds на срок обновления версии.maxEntries, чтобы контролировать размер
кэша и предотвращать переполнение устройства пользователя.CacheableResponsePlugin, чтобы
исключить кэширование ошибок.Ограничение времени жизни записей в Workbox — фундаментальный инструмент для поддержания актуальности кэша и управления ресурсами, особенно при работе с большими приложениями и динамическим контентом.