Background Sync API и его ограничения

Основы Background Sync API

Background Sync API позволяет веб-приложениям откладывать выполнение сетевых запросов до тех пор, пока устройство пользователя не восстановит подключение к интернету. Это особенно полезно для прогрессивных веб-приложений (PWA), где пользователи могут временно оказаться офлайн, но действия, такие как отправка формы, комментария или данных аналитики, должны быть выполнены позже.

Работа API строится вокруг двух основных компонентов:

  1. Service Worker – фоновый скрипт, который управляет синхронизацией и сетевыми запросами, даже если вкладка закрыта.
  2. Sync Event – событие, инициируемое браузером, когда устройство снова подключается к сети.

Основной принцип работы: запрос к серверу откладывается в очередь, которая сохраняется в 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 останется активным до завершения асинхронной операции, что критично для успешного выполнения синхронизации.

Ограничения и особенности использования

  1. Поддержка браузеров

    • Background Sync поддерживается в большинстве современных браузеров, но не поддерживается в Safari и некоторых старых версиях Edge.
    • На мобильных устройствах синхронизация может быть отложена системой для экономии батареи.
  2. Ограничения по времени и памяти

    • Каждое событие sync имеет ограничение по времени выполнения — обычно несколько минут. Длительные операции могут быть прерваны.
    • Очередь задач ограничена по размеру, слишком большое количество отложенных операций может привести к их удалению браузером.
  3. Не гарантируется немедленное выполнение

    • Background Sync не запускается мгновенно после восстановления соединения. Браузер может выбрать оптимальный момент для запуска, исходя из состояния сети, батареи и активности устройства.
  4. Однократное срабатывание по тегу

    • Если использовать один и тот же tag для нескольких задач, браузер объединяет их в одно событие sync. Это важно учитывать при проектировании очереди запросов.
  5. Не подходит для критически важной мгновенной синхронизации

    • API предназначен для “доброжелательной синхронизации”, но не для гарантированного моментального выполнения запросов в реальном времени. Для таких случаев лучше использовать WebSocket или другие постоянные соединения.

Интеграция с Workbox

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, которые не могут быть выполнены из-за отсутствия сети, будут добавлены в очередь и повторены автоматически, когда устройство восстановит соединение.

Практические рекомендации

  • Использовать уникальные и осмысленные теги для каждой задачи, чтобы избежать конфликтов.
  • Проверять размер и количество элементов в очереди, чтобы не превышать лимиты браузера.
  • При необходимости объединять несколько действий в один запрос для оптимизации синхронизации.
  • Обрабатывать ошибки внутри Service Worker и предусматривать стратегию повторных попыток с экспоненциальной задержкой.

Background Sync API обеспечивает гибкий механизм отложенной сетевой активности, но требует внимательного проектирования очередей и осознания ограничений браузеров и устройства. Использование Workbox значительно упрощает эту работу, предоставляя готовые инструменты для управления задачами и надежного повторного выполнения сетевых запросов.