Workbox — это набор библиотек и инструментов для управления кэшированием и стратегиями работы с ресурсами в браузере. При использовании серверного рендеринга (SSR) в JavaScript-приложениях его функции становятся особенно важными, так как необходимо учитывать динамически сгенерированные HTML-страницы наряду со статическими ассетами.
В отличие от SPA, где HTML практически всегда одинаковый, при SSR
каждая HTML-страница может быть уникальной для конкретного запроса. Для
таких случаев Workbox предоставляет стратегию NetworkFirst.
Она сначала пытается загрузить свежую версию страницы с сервера, а в
случае ошибки или недоступности сети возвращает кэшированную версию:
workbox.routing.registerRoute(
({ request }) => request.mode === 'navigate',
new workbox.strategies.NetworkFirst({
cacheName: 'html-cache',
plugins: [
new workbox.expiration.ExpirationPlugin({
maxEntries: 50,
maxAgeSeconds: 3600,
}),
],
})
);
Ключевые моменты:
request.mode === 'navigate' позволяет обрабатывать
именно HTML-запросы при навигации.NetworkFirst обеспечивает свежесть данных, что критично
для SSR.ExpirationPlugin предотвращает бесконтрольный
рост кэша.JS-бандлы, CSS, изображения и шрифты кэшируются с помощью стратегии
CacheFirst с длительным сроком хранения, так как они редко
изменяются. Это уменьшает количество сетевых запросов и ускоряет
рендеринг:
workbox.routing.registerRoute(
({ request }) => request.destination === 'script' || request.destination === 'style',
new workbox.strategies.CacheFirst({
cacheName: 'static-resources',
plugins: [
new workbox.expiration.ExpirationPlugin({
maxEntries: 100,
maxAgeSeconds: 30 * 24 * 60 * 60, // 30 дней
}),
new workbox.cacheableResponse.CacheableResponsePlugin({
statuses: [0, 200],
}),
],
})
);
Особенности:
CacheableResponsePlugin позволяет
кэшировать только успешные ответы.SSR-приложения часто делают запросы к API для генерации данных на
странице. Для таких запросов применяются стратегии
StaleWhileRevalidate или NetworkFirst в
зависимости от требований к свежести данных:
workbox.routing.registerRoute(
({ url }) => url.pathname.startsWith('/api/'),
new workbox.strategies.StaleWhileRevalidate({
cacheName: 'api-cache',
plugins: [
new workbox.expiration.ExpirationPlugin({
maxEntries: 50,
maxAgeSeconds: 5 * 60, // 5 минут
}),
],
})
);
Пояснения:
StaleWhileRevalidate возвращает кэшированную версию
мгновенно, а затем обновляет кэш в фоне.Workbox поддерживает механизм precache, позволяющий
заранее кэшировать критические страницы и ассеты на этапе установки
сервис-воркера. Для SSR это особенно полезно для страниц с высокой
посещаемостью:
workbox.precaching.precacheAndRoute([
{ url: '/', revision: '1234' },
{ url: '/about', revision: '5678' },
{ url: '/main.js', revision: 'abcd' },
]);
Рекомендации:
revision необходим для обновления кэша при изменении
контента.Для SSR важно корректно управлять обновлением HTML-кэша, чтобы пользователи всегда видели актуальный контент. Workbox предоставляет события, позволяющие отслеживать установку нового сервис-воркера и применять его обновления:
self.addEventListener('message', (event) => {
if (event.data && event.data.type === 'SKIP_WAITING') {
self.skipWaiting();
}
});
Это позволяет немедленно активировать новую версию воркера и очистить устаревшие данные.
Workbox включает встроенные возможности логирования, что помогает проверять, какие ресурсы кэшируются, а какие запрашиваются с сети:
workbox.setConfig({ debug: true });
Советы по применению:
SSR-приложения выигрывают от комбинирования разных стратегий в зависимости от типа ресурса:
NetworkFirstStaleWhileRevalidate или
NetworkFirstCacheFirstЭто позволяет оптимизировать скорость загрузки, минимизировать задержки и поддерживать актуальность контента.
Работа с Workbox в контексте серверного рендеринга требует точного понимания структуры приложения и характера данных, что обеспечивает баланс между производительностью и актуальностью информации.