Сервис-воркер — это скрипт, который браузер запускает в фоновом режиме отдельно от веб-страницы. Он позволяет перехватывать сетевые запросы, кэшировать ресурсы и управлять обновлением контента. Благодаря этому сервис-воркер может существенно ускорять загрузку страниц, минимизируя количество обращений к серверу и обеспечивая мгновенную отдачу контента из локального кэша.
Ключевое свойство сервис-воркера — его независимость от жизненного цикла страницы. Он продолжает работать после закрытия вкладки, что позволяет поддерживать актуальность кэша и обработку push-уведомлений.
Workbox предоставляет набор утилит и стратегий для работы с сервис-воркерами. Основное преимущество — упрощение процессов кэширования, обновления и маршрутизации запросов. Workbox поддерживает несколько стратегий кэширования, каждая из которых подходит для различных типов ресурсов.
1. Стратегия Cache First Используется для статических ресурсов, таких как CSS, JS и изображения. Сначала сервис-воркер проверяет кэш, и если ресурс найден, он возвращается мгновенно. Только при его отсутствии выполняется сетевой запрос.
workbox.routing.registerRoute(
({request}) => request.destination === 'image',
new workbox.strategies.CacheFirst({
cacheName: 'images-cache',
plugins: [
new workbox.expiration.ExpirationPlugin({
maxEntries: 50,
maxAgeSeconds: 30 * 24 * 60 * 60, // 30 дней
}),
],
})
);
2. Стратегия Network First Оптимальна для динамического контента, например API-запросов. Сначала выполняется сетевой запрос. Если сервер недоступен, сервис-воркер возвращает кэшированную версию.
workbox.routing.registerRoute(
({url}) => url.pathname.startsWith('/api/'),
new workbox.strategies.NetworkFirst({
cacheName: 'api-cache',
networkTimeoutSeconds: 5,
plugins: [
new workbox.expiration.ExpirationPlugin({
maxEntries: 100,
maxAgeSeconds: 5 * 60, // 5 минут
}),
],
})
);
3. Стратегия Stale While Revalidate Идеальна для ресурсов, которые часто обновляются, но должны быстро отображаться. Сначала возвращается кэшированная версия, а затем сервис-воркер обновляет кэш из сети.
workbox.routing.registerRoute(
({request}) => request.destination === 'script',
new workbox.strategies.StaleWhileRevalidate({
cacheName: 'js-cache',
})
);
Ускорение времени первой отрисовки Кэширование критических ресурсов позволяет отображать страницу без ожидания сетевых запросов. Даже при медленном соединении первые визуальные элементы появляются мгновенно.
Снижение нагрузки на сервер Часто используемые файлы отдаются из локального кэша, уменьшая количество запросов к серверу и повышая общую производительность приложения.
Поддержка оффлайн-режима Даже при отсутствии соединения с интернетом пользователь получает доступ к ранее загруженным страницам и ресурсам, что улучшает пользовательский опыт и снижает показатель отказов.
Контроль за обновлением контента Workbox
предоставляет плагины для управления кэшом и обновлением ресурсов.
Например, ExpirationPlugin автоматически удаляет устаревшие
файлы, а BroadcastUpdatePlugin уведомляет страницу о
наличии нового контента.
Workbox позволяет использовать предзагрузку ресурсов через манифест. Это ускоряет первичную загрузку страниц, так как необходимые скрипты и стили уже кэшированы до запроса пользователя.
workbox.precaching.precacheAndRoute([
{url: '/index.html', revision: '12345'},
{url: '/styles/main.css', revision: '12345'},
{url: '/scripts/app.js', revision: '12345'},
]);
Особенности использования предзагрузки:
revision гарантирует обновление кэша при изменении
файла.Workbox интегрируется с DevTools браузера для отслеживания работы сервис-воркера:
workbox.broadcastUpdate.BroadcastUpdatePlugin дает
возможность динамически уведомлять страницу о новых версиях
ресурсов.Эти подходы позволяют сервис-воркеру минимизировать задержки, повысить отзывчивость приложения и обеспечить стабильный опыт пользователя даже при нестабильном интернете.