Stale-While-Revalidate (SWR) — это стратегия кэширования, которая позволяет отдавать пользователю устаревшую версию ресурса из кэша сразу, а затем параллельно обновлять этот ресурс в кэше с сервера. Такой подход обеспечивает мгновенный отклик и одновременно поддерживает актуальность данных, минимизируя задержки при загрузке.
Мгновенная отдача кэшированного ресурса При запросе ресурса сначала возвращается версия из кэша, если она доступна. Это позволяет ускорить отображение интерфейса и снизить время ожидания для пользователя.
Фоновое обновление кэша После отправки кэшированного ответа библиотека Workbox инициирует запрос к серверу для получения свежей версии ресурса. Когда новый ресурс получен, он заменяет старый в кэше.
Следующие запросы получают свежие данные Пользователь получает обновлённый контент при последующих обращениях, что обеспечивает баланс между скоростью и актуальностью.
Workbox предоставляет готовый класс для реализации этой стратегии:
import { registerRoute } from 'workbox-routing';
import { StaleWhileRevalidate } from 'workbox-strategies';
registerRoute(
({ request }) => request.destination === 'script',
new StaleWhileRevalidate({
cacheName: 'js-cache',
plugins: [
// Можно добавить плагины, например, для ограничения размера кэша
],
})
);
Пояснения к коду:
registerRoute — функция для регистрации маршрута и
соответствующей стратегии.request.destination — позволяет фильтровать тип
ресурсов (скрипты, стили, изображения).cacheName — имя кэша, куда будут сохраняться
ресурсы.plugins — массив плагинов Workbox для расширения
функционала (например, ExpirationPlugin для ограничения
количества кэшируемых элементов).1. ExpirationPlugin Позволяет ограничить размер кэша или срок жизни ресурсов.
import { ExpirationPlugin } from 'workbox-expiration';
new StaleWhileRevalidate({
cacheName: 'js-cache',
plugins: [
new ExpirationPlugin({
maxEntries: 50, // максимум 50 файлов
maxAgeSeconds: 7 * 24 * 60 * 60, // 7 дней
}),
],
});
2. CacheableResponsePlugin Фильтрует кэшируемые ответы по статусу или заголовкам.
import { CacheableResponsePlugin } from 'workbox-cacheable-response';
new StaleWhileRevalidate({
cacheName: 'api-cache',
plugins: [
new CacheableResponsePlugin({
statuses: [0, 200], // кэшируем только успешные ответы
}),
],
});
ExpirationPlugin,
чтобы не переполнять память устройства.Stale-While-Revalidate обеспечивает баланс между быстродействием и актуальностью данных, делая пользовательский интерфейс отзывчивым, даже при работе с сетевыми ресурсами, изменяющимися с течением времени.