Workbox предоставляет гибкие инструменты для организации кэширования ресурсов веб-приложений. При работе со статическими ресурсами, такими как шрифты и изображения, правильная стратегия кэширования критически важна для производительности и надежности приложения.
Шрифты часто загружаются с внешних сервисов (например, Google Fonts) или локально. Они редко изменяются, поэтому кэширование их с длительным сроком жизни повышает скорость загрузки страницы.
Рекомендуемые стратегии:
Cache First
import {registerRoute} from 'workbox-routing';
import {CacheFirst} from 'workbox-strategies';
import {CacheableResponsePlugin} from 'workbox-cacheable-response';
import {ExpirationPlugin} from 'workbox-expiration';
registerRoute(
({request}) => request.destination === 'font',
new CacheFirst({
cacheName: 'fonts-cache',
plugins: [
new CacheableResponsePlugin({statuses: [0, 200]}),
new ExpirationPlugin({maxAgeSeconds: 60 * 60 * 24 * 365, maxEntries: 30}),
],
})
);
Особенности:
maxAgeSeconds устанавливает срок хранения в кэше
(например, один год).maxEntries ограничивает количество сохраненных шрифтов,
предотвращая разрастание кэша.Stale While Revalidate
import {StaleWhileRevalidate} from 'workbox-strategies';
registerRoute(
({request}) => request.destination === 'font',
new StaleWhileRevalidate({
cacheName: 'fonts-cache',
plugins: [
new CacheableResponsePlugin({statuses: [0, 200]}),
],
})
);Изображения — один из самых тяжелых элементов страницы. Неправильная стратегия кэширования приводит к медленной загрузке и увеличению потребления трафика.
Рекомендуемые стратегии:
Cache First для статических изображений
registerRoute(
({request}) => request.destination === 'image',
new CacheFirst({
cacheName: 'images-cache',
plugins: [
new CacheableResponsePlugin({statuses: [0, 200]}),
new ExpirationPlugin({
maxEntries: 60,
maxAgeSeconds: 30 * 24 * 60 * 60, // 30 дней
}),
],
})
);
Особенности:
maxEntries предотвращает переполнение кэша.maxAgeSeconds ограничивает срок хранения устаревших
изображений.Stale While Revalidate для часто обновляемых изображений
registerRoute(
({request}) => request.destination === 'image',
new StaleWhileRevalidate({
cacheName: 'dynamic-images-cache',
plugins: [
new CacheableResponsePlugin({statuses: [0, 200]}),
new ExpirationPlugin({
maxEntries: 100,
maxAgeSeconds: 24 * 60 * 60, // 1 день
}),
],
})
);ExpirationPlugin с ограничением maxEntries
предотвращает накопление устаревших ресурсов.CacheableResponsePlugin позволяет кэшировать только
успешные ответы (например, HTTP 200).images-v1, fonts-v2) для принудительного
обновления.Эти подходы обеспечивают баланс между производительностью и актуальностью контента, минимизируют задержки загрузки и снижают нагрузку на сеть.