Background Sync позволяет сервис-воркерам задерживать сетевые запросы
и повторно отправлять их при восстановлении соединения с интернетом. В
Workbox эта функциональность реализуется через модуль
workbox-background-sync, который предоставляет удобный API
для создания очередей и управления повторными отправками запросов.
import { BackgroundSyncPlugin } from 'workbox-background-sync';
import { registerRoute } from 'workbox-routing';
import { NetworkOnly } from 'workbox-strategies';
Создание очереди для синхронизации
const formQueue = new BackgroundSyncPlugin('formQueue', {
maxRetentionTime: 24 * 60 // время в минутах
});
maxRetentionTime определяет, как долго запросы могут
оставаться в очереди, ожидая восстановления сети. Это ключевой параметр
для приложений, где пользователи могут быть офлайн продолжительное
время.
Background Sync особенно полезен для форм, данные которых необходимо отправить на сервер, даже если пользователь временно потерял соединение.
registerRoute(
/\/api\/submit-form/,
new NetworkOnly({
plugins: [formQueue]
}),
'POST'
);
Принцип работы:
Workbox позволяет задать обработчик для событий успешной синхронизации.
formQueue.onS ync = async ({ queue }) => {
let entry;
while ((entry = await queue.shiftRequest())) {
try {
await fetch(entry.request);
console.log('Форма успешно отправлена:', entry.request.url);
} catch (error) {
console.error('Ошибка при повторной отправке формы:', error);
await queue.unshiftRequest(entry);
break;
}
}
};
shiftRequest извлекает запрос из очереди, а
unshiftRequest возвращает его обратно при неудаче. Это
гарантирует, что запросы не теряются при временных проблемах с
сетью.
Background Sync удобно использовать для любых POST-запросов к API, где важна гарантированная доставка данных.
registerRoute(
/\/api\/update-data/,
new NetworkOnly({
plugins: [formQueue]
}),
'POST'
);
Рекомендации:
onSync можно
реализовать стратегию повторных попыток с экспоненциальной
задержкой.maxRetentionTime предотвращает бесконечное накопление
старых запросов.Для приложений с формами и сложными объектами данных полезно комбинировать Background Sync с IndexedDB или другими локальными хранилищами. Это позволяет:
async function saveFormLocally(formData) {
const db = await openDB('formDB', 1, {
upgrade(db) {
db.createObjectStore('forms', { keyPath: 'id', autoIncrement: true });
}
});
await db.add('forms', formData);
}
Workbox предоставляет встроенные инструменты для проверки состояния очередей и синхронизации:
formQueue.getAll().then(entries => {
console.log('Текущие запросы в очереди:', entries);
});
Регулярный мониторинг позволяет выявлять проблемные запросы и предотвращать потерю данных.
maxRetentionTime с учётом специфики
приложения. Для критичных данных стоит использовать более длительные
значения.sync не только для повторной
отправки, но и для уведомления пользователя о восстановлении соединения
и успешной отправке данных.Background Sync в сочетании с Workbox позволяет создавать надёжные веб-приложения, обеспечивающие сохранность пользовательских данных и непрерывную работу интерфейса даже при нестабильной сети.