Фоновая синхронизация (Background Sync) позволяет
веб-приложению откладывать выполнение сетевых запросов до тех пор, пока
устройство пользователя не восстановит соединение с интернетом. В
библиотеке Workbox она реализуется через модуль
workbox-background-sync, который обеспечивает надёжную и
автоматическую повторную отправку запросов, когда сеть становится
доступной.
Для начала необходимо импортировать класс
BackgroundSyncPlugin:
import { BackgroundSyncPlugin } from 'workbox-background-sync';
Основной параметр конструктора — имя очереди, в которой будут сохраняться запросы, пока они не будут успешно выполнены:
const bgSyncPlugin = new BackgroundSyncPlugin('myQueue', {
maxRetentionTime: 24 * 60 // время хранения в минутах
});
Ключевые опции:
maxRetentionTime — максимальное время хранения запросов
в очереди, после которого они будут отброшены.callbacks — объект с функциями обратного вызова для
обработки событий, таких как queueDidReplay,
queueDidFail.Фоновая синхронизация чаще всего применяется к POST-запросам. Для
этого создаётся стратегия с использованием NetworkOnly,
дополненная плагином:
import { registerRoute } from 'workbox-routing';
import { NetworkOnly } from 'workbox-strategies';
registerRoute(
/\/api\/.*\/*.json/,
new NetworkOnly({
plugins: [bgSyncPlugin]
}),
'POST'
);
Особенности:
/api/*.json, не прошедший из-за
отсутствия сети, будет помещён в очередь myQueue.Для отладки важно понимать внутреннее состояние очереди. Workbox
предоставляет методы работы с очередью через класс
Queue:
import { Queue } from 'workbox-background-sync';
const queue = new Queue('myQueue');
// Проверка количества запросов в очереди
queue.getAll().then(requests => {
console.log('Запросов в очереди:', requests.length);
});
// Очистка очереди
queue.deleteQueue();
Основные методы для диагностики:
queue.getAll() — возвращает все запросы, находящиеся в
очереди.queue.replayRequests() — вручную инициирует повторную
отправку всех запросов.queue.shiftRequest() — извлекает первый запрос из
очереди.queue.unshiftRequest(request) — добавляет запрос в
начало очереди.Для отслеживания процессов полезно подключить обратные вызовы при создании плагина:
const bgSyncPlugin = new BackgroundSyncPlugin('myQueue', {
maxRetentionTime: 24 * 60,
callbacks: {
queueDidReplay: (queue) => {
console.log(`Очередь ${queue.name} успешно обработана`);
},
queueDidFail: (queue, error) => {
console.error(`Ошибка при обработке очереди ${queue.name}:`, error);
}
}
});
Пояснение:
queueDidReplay срабатывает после успешной повторной
отправки всех запросов.queueDidFail вызывается при критических ошибках,
которые помешали повторной отправке.Эмуляция оффлайн-режима в браузере Используется для проверки, что запросы корректно сохраняются в очереди при отсутствии сети.
Ручной вызов replayRequests()
Позволяет проверить, что все накопленные запросы успешно обрабатываются
после восстановления соединения.
Просмотр IndexedDB Workbox хранит очереди в IndexedDB, что даёт возможность анализировать их содержимое через DevTools → Application → IndexedDB → workbox-background-sync.
maxRetentionTime на этапе
разработки, чтобы быстро проверять повторную отправку.callbacks для отслеживания
каждого этапа работы очереди.Workbox позволяет:
BackgroundSyncPlugin с другими плагинами
Workbox, например, кешированием через
CacheableResponsePlugin.Эти возможности делают фоновые запросы устойчивыми к нестабильному интернет-соединению и значительно упрощают разработку оффлайн-функционала.