HTML-страницы представляют собой динамический контент, который часто обновляется. При выборе стратегии для HTML важно учитывать частоту изменений и необходимость мгновенной загрузки при оффлайн-доступе. В Workbox чаще всего используют стратегию Network First, так как она сначала пытается получить актуальный контент с сети, а только при её недоступности возвращает кэшированную версию.
workbox.routing.registerRoute(
({request}) => request.mode === 'navigate',
new workbox.strategies.NetworkFirst({
cacheName: 'html-pages',
plugins: [
new workbox.expiration.ExpirationPlugin({
maxEntries: 50,
maxAgeSeconds: 24 * 60 * 60, // 1 день
}),
],
})
);
Особенности стратегии Network First для HTML:
ExpirationPlugin предотвращается бесконтрольный рост
хранилища.CSS и JS-файлы меняются реже, чем HTML. Для них лучше подходят стратегии с упором на кэш, такие как Stale While Revalidate или Cache First с версионированием файлов.
workbox.routing.registerRoute(
({request}) => request.destination === 'script' || request.destination === 'style',
new workbox.strategies.StaleWhileRevalidate({
cacheName: 'static-resources',
plugins: [
new workbox.expiration.ExpirationPlugin({
maxEntries: 100,
maxAgeSeconds: 7 * 24 * 60 * 60, // 1 неделя
}),
],
})
);
Преимущества Stale While Revalidate:
Изображения занимают значительный объём данных, поэтому правильная стратегия кэширования критична. Чаще всего используют Cache First с лимитом на количество элементов и временем хранения.
workbox.routing.registerRoute(
({request}) => request.destination === 'image',
new workbox.strategies.CacheFirst({
cacheName: 'images',
plugins: [
new workbox.expiration.ExpirationPlugin({
maxEntries: 60,
maxAgeSeconds: 30 * 24 * 60 * 60, // 30 дней
purgeOnQuotaError: true,
}),
],
})
);
Особенности Cache First для изображений:
Динамические данные, получаемые через API, требуют комбинированного подхода. Workbox поддерживает Network First и Stale While Revalidate в зависимости от требований к свежести данных.
workbox.routing.registerRoute(
({url}) => url.pathname.startsWith('/api/'),
new workbox.strategies.NetworkFirst({
cacheName: 'api-cache',
networkTimeoutSeconds: 5,
plugins: [
new workbox.expiration.ExpirationPlugin({
maxEntries: 50,
maxAgeSeconds: 5 * 60, // 5 минут
}),
],
})
);
Рекомендации для API:
Шрифты редко обновляются, поэтому для них оптимальна стратегия Cache First с длительным сроком хранения.
workbox.routing.registerRoute(
({request}) => request.destination === 'font',
new workbox.strategies.CacheFirst({
cacheName: 'fonts',
plugins: [
new workbox.expiration.ExpirationPlugin({
maxEntries: 30,
maxAgeSeconds: 365 * 24 * 60 * 60, // 1 год
}),
],
})
);
Преимущества Cache First для шрифтов:
Ключевые моменты при настройке кэша в Workbox:
ExpirationPlugin и
CacheableResponsePlugin для контроля размера и условий
кэширования.Хотите, я могу дополнить статью схемами стратегий и примером полной конфигурации Workbox для типичного проекта с HTML, CSS, JS, изображениями, API и шрифтами? Это сделает материал максимально наглядным.