Background Sync API позволяет веб-приложениям откладывать выполнение сетевых запросов до тех пор, пока устройство пользователя не восстановит подключение к интернету. Это особенно полезно для прогрессивных веб-приложений (PWA), где пользователи могут временно оказаться офлайн, но действия, такие как отправка формы, комментария или данных аналитики, должны быть выполнены позже.
Работа API строится вокруг двух основных компонентов:
Основной принцип работы: запрос к серверу откладывается в очередь,
которая сохраняется в IndexedDB, после чего Service Worker получает
событие sync и выполняет отложенные действия.
Для регистрации синхронизации используется метод
registration.sync.register(tag), где tag —
уникальная строка, идентифицирующая задачу. Пример:
navigator.serviceWorker.ready.then(registration => {
return registration.sync.register('send-form-data');
});
После этого Service Worker должен слушать событие sync и
обрабатывать задачу:
self.addEventListener('sync', event => {
if (event.tag === 'send-form-data') {
event.waitUntil(sendFormDataToServer());
}
});
Метод event.waitUntil() гарантирует, что Service Worker
останется активным до завершения асинхронной операции, что критично для
успешного выполнения синхронизации.
Поддержка браузеров
Ограничения по времени и памяти
sync имеет ограничение по времени
выполнения — обычно несколько минут. Длительные операции могут быть
прерваны.Не гарантируется немедленное выполнение
Однократное срабатывание по тегу
tag для нескольких
задач, браузер объединяет их в одно событие sync. Это важно
учитывать при проектировании очереди запросов.Не подходит для критически важной мгновенной синхронизации
Workbox упрощает работу с Background Sync через модуль
workbox-background-sync. Основной инструмент —
Queue, который автоматически управляет очередью запросов и
повторными попытками при неудачных сетевых вызовах.
Пример использования:
import {Queue} from 'workbox-background-sync';
import {registerRoute} from 'workbox-routing';
import {NetworkOnly} from 'workbox-strategies';
const queue = new Queue('formQueue');
registerRoute(
/\/api\/submit/,
new NetworkOnly({
plugins: [{
requestWillFetch: async ({request}) => {
return request;
},
fetchDidFail: async ({originalRequest}) => {
await queue.pushRequest({request: originalRequest});
}
}]
}),
'POST'
);
В этом примере любые POST-запросы к /api/submit, которые
не могут быть выполнены из-за отсутствия сети, будут добавлены в очередь
и повторены автоматически, когда устройство восстановит соединение.
Background Sync API обеспечивает гибкий механизм отложенной сетевой активности, но требует внимательного проектирования очередей и осознания ограничений браузеров и устройства. Использование Workbox значительно упрощает эту работу, предоставляя готовые инструменты для управления задачами и надежного повторного выполнения сетевых запросов.