В современных веб-приложениях часто возникает ситуация, когда пользователь теряет соединение с сервером, а после его восстановления требуется синхронизировать состояние приложения. Workbox предоставляет инструменты для реализации этой задачи через Service Worker, позволяя эффективно управлять кэшированием и очередями запросов.
Workbox предлагает несколько подходов к организации запросов при отсутствии соединения:
Background Sync Модуль
workbox-background-sync позволяет откладывать отправку
запросов до восстановления сети. Создается очередь, куда помещаются все
неудачные запросы, и после появления соединения они автоматически
повторяются.
Пример создания очереди:
import { Queue } from 'workbox-background-sync';
const myQueue = new Queue('requestQueue', {
maxRetentionTime: 24 * 60 // время хранения запросов в минутах
});
self.addEventListener('fetch', (event) => {
if (event.request.method === 'POST') {
event.respondWith(
fetch(event.request.clone()).catch((err) => {
return myQueue.pushRequest({ request: event.request });
})
);
}
});
Ключевые моменты:
maxRetentionTime задает максимальное время хранения
запроса в очереди.fetch и
pushRequest используют тело запроса, которое может быть
прочитано только один раз.Автоматическая повторная отправка Workbox позволяет настраивать автоматическое повторение запросов с экспоненциальной задержкой, что особенно полезно для REST API с критичными POST-запросами.
import { NetworkOnly } from 'workbox-strategies';
import { registerRoute } from 'workbox-routing';
registerRoute(
/\/api\/.*\/update/,
new NetworkOnly({
plugins: [
myQueue
]
}),
'POST'
);
Этот подход комбинирует стратегию NetworkOnly с очередью
Background Sync, обеспечивая безопасную доставку данных
после восстановления сети.
Для корректной синхронизации состояния важно правильно организовать кэширование. Workbox позволяет:
Стратегия StaleWhileRevalidate –
мгновенная отдача старых данных с одновременной загрузкой свежих. Это
гарантирует, что пользователь видит информацию без задержек, а Service
Worker обновляет кэш для будущих обращений.
Стратегия CacheFirst с
ограничениями – полезна для медиа-ресурсов и больших файлов.
Параметры maxEntries и maxAgeSeconds позволяют
контролировать размер кэша и срок жизни данных.
Пример:
import { CacheFirst } from 'workbox-strategies';
import { ExpirationPlugin } from 'workbox-expiration';
registerRoute(
({ request }) => request.destination === 'image',
new CacheFirst({
cacheName: 'images-cache',
plugins: [
new ExpirationPlugin({
maxEntries: 50,
maxAgeSeconds: 7 * 24 * 60 * 60, // неделя
}),
],
})
);
Когда офлайн-запросы накапливаются, а серверная версия данных изменяется, возникает проблема конфликтов. Для минимизации рисков используют:
version или timestamp. При
синхронизации Service Worker проверяет актуальность версии перед
отправкой запроса.Workbox предоставляет события для отслеживания состояния очередей:
myQueue.on('sync', ({ queue }) => {
console.log(`${queue.name} синхронизирована`);
});
myQueue.on('requestfailure', ({ request }) => {
console.error(`Не удалось отправить запрос: ${request.url}`);
});
Это позволяет вести журнал операций и информировать интерфейс приложения о статусе синхронизации.
idb или аналогичной библиотекой для удобной работы с
локальными хранилищами.Синхронизация состояния через Workbox позволяет построить надежные офлайн-ориентированные приложения, где потеря соединения не приводит к потере данных и обеспечивает плавное восстановление работы при возвращении сети.