Workbox — это набор инструментов для работы с сервис-воркерами в JavaScript, обеспечивающий гибкую реализацию кеширования и управления ресурсами. Одним из ключевых преимуществ Workbox является возможность создавать стратегии плавного обновления, минимизируя потерю данных и обеспечивая непрерывный пользовательский опыт.
Сервис-воркер регистрируется с использованием стандартного API браузера:
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/sw.js')
.then(registration => {
console.log('Service Worker зарегистрирован:', registration);
})
.catch(error => {
console.error('Ошибка регистрации Service Worker:', error);
});
}
В файле sw.js подключается библиотека Workbox:
importScripts('https://storage.googleapis.com/workbox-cdn/releases/6.6.2/workbox-sw.js');
if (workbox) {
console.log("Workbox загружен успешно");
}
После этого доступны все функции Workbox, включая стратегии кеширования, маршрутизацию запросов и управление обновлениями.
Workbox предоставляет несколько встроенных стратегий, каждая из которых подходит для определённых сценариев обновления:
CacheFirst
NetworkFirst
StaleWhileRevalidate
Workbox поддерживает контролируемое обновление воркера, что важно для плавного обновления приложений:
Пример безопасного обновления:
workbox.core.skipWaiting();
workbox.core.clientsClaim();
Это обеспечивает моментальную активацию новой версии и предотвращает потерю данных при одновременной работе с разными вкладками.
Ключевой элемент плавного обновления — контроль версий ресурсов:
workbox.precaching.precacheAndRoute([
{ url: '/index.html', revision: 'v2' },
{ url: '/styles/main.css', revision: 'v5' },
{ url: '/scripts/app.js', revision: 'v3' }
]);
revision указывает уникальную версию файла.Дополнительно можно использовать runtime caching для ресурсов, изменяющихся динамически:
workbox.routing.registerRoute(
({ request }) => request.destination === 'image',
new workbox.strategies.CacheFirst({
cacheName: 'images-cache',
plugins: [
new workbox.expiration.ExpirationPlugin({
maxEntries: 50,
maxAgeSeconds: 7 * 24 * 60 * 60 // 7 дней
})
]
})
);
Стратегия StaleWhileRevalidate идеально подходит для
фоновго обновления данных. Работает по следующему принципу:
Пример для JSON API:
workbox.routing.registerRoute(
/\/api\/data/,
new workbox.strategies.StaleWhileRevalidate({
cacheName: 'api-cache',
plugins: [
new workbox.expiration.ExpirationPlugin({
maxEntries: 100,
maxAgeSeconds: 60 * 60 // 1 час
})
]
})
);
Такой подход позволяет не блокировать интерфейс и обновлять данные в фоне, что особенно критично для приложений с офлайн-режимом.
Для ресурсов, которые нельзя потерять (например, пользовательские данные формы), Workbox поддерживает Background Sync:
const bgSyncPlugin = new workbox.backgroundSync.BackgroundSyncPlugin('formQueue', {
maxRetentionTime: 24 * 60 // 24 часа
});
workbox.routing.registerRoute(
/\/api\/submit/,
new workbox.strategies.NetworkOnly({
plugins: [bgSyncPlugin]
}),
'POST'
);
Иногда требуется информировать пользователя о доступности новой
версии. Workbox позволяет отслеживать события waiting:
self.addEventListener('message', (event) => {
if (event.data === 'skipWaiting') {
self.skipWaiting();
}
});
self.addEventListener('install', (event) => {
event.waitUntil(
caches.keys().then(cacheNames => {
// дополнительная логика для управления кешем
})
);
});
С помощью таких событий можно создавать гибкие механизмы уведомления без прерывания работы приложения и минимизации потерь данных.