Workbox предоставляет мощные инструменты для организации оффлайн-режима и управления запросами к серверу, особенно в ситуациях, когда сеть нестабильна. Одной из ключевых возможностей является возможность отложенного выполнения запросов и их автоматическая отправка после восстановления соединения.
Для реализации воспроизведения очереди используется модуль
Background Sync. Он позволяет сохранять сетевые запросы
в локальном хранилище, если сеть недоступна, и автоматически повторять
их при восстановлении соединения. Основной класс для работы —
workbox.backgroundSync.Queue.
Пример создания очереди:
import { Queue } from 'workbox-background-sync';
const queue = new Queue('myQueue', {
maxRetentionTime: 24 * 60 // 24 часа в минутах
});
myQueue — уникальное имя очереди.maxRetentionTime — время хранения запросов в локальном
хранилище, после которого они удаляются, если не были отправлены.Для работы с Background Sync обычно используется Service Worker с
fetch-перехватом. При недоступной сети запрос добавляется в
очередь:
self.addEventListener('fetch', (event) => {
if (event.request.method === 'POST') {
event.respondWith(
fetch(event.request.clone()).catch((err) => {
return queue.pushRequest({ request: event.request.clone() })
.then(() => new Response(null, { status: 200 }));
})
);
}
});
Ключевые моменты:
request.clone(), чтобы создать копию
запроса, так как объект Request является одноразовым.pushRequest помещает запрос в очередь для
последующей отправки.Workbox автоматически повторяет отправку запросов при восстановлении сети. Дополнительно можно подписаться на события очереди для логирования или изменения поведения:
queue.on('sync', async ({ queue }) => {
let entry;
while ((entry = await queue.shiftRequest())) {
try {
await fetch(entry.request);
} catch (error) {
await queue.unshiftRequest(entry); // вернуть запрос в начало очереди
}
}
});
sync срабатывает, когда сеть снова
доступна.shiftRequest() извлекает запрос из очереди.unshiftRequest().Часто Background Sync комбинируют с Workbox Routing, чтобы автоматически обрабатывать определённые маршруты:
import { registerRoute } from 'workbox-routing';
import { NetworkOnly } from 'workbox-strategies';
registerRoute(
({ url, request }) => url.pathname.startsWith('/api/') && request.method === 'POST',
new NetworkOnly({
plugins: [queue]
}),
'POST'
);
NetworkOnly стратегия используется для отправки запроса
напрямую на сервер.Queue можно использовать вместе с любыми стратегиями Workbox через плагины, создавая более гибкую обработку ошибок и повторную отправку:
import { Plugin } from 'workbox-core';
const queuePlugin = {
fetchDidFail: async ({ request }) => {
await queue.pushRequest({ request });
}
};
registerRoute(
'/submit-form',
new NetworkOnly({ plugins: [queuePlugin] }),
'POST'
);
fetchDidFail срабатывает при любой сетевой ошибке.Для контроля состояния очереди можно использовать методы:
queue.getAll() — получить все запросы в очереди.queue.delete() — удалить все запросы.queue.shiftRequest() /
queue.unshiftRequest() — выборочно управлять отправкой
запросов.Это позволяет создавать кастомные механизмы уведомления пользователей о состоянии оффлайн-запросов или управлять их приоритетами.
Request и
Response, поэтому файлы больших размеров лучше отправлять
напрямую с прогресс-отслеживанием.maxRetentionTime) следует
настраивать исходя из сценария использования, чтобы не перегружать
локальное хранилище.Workbox Background Sync позволяет построить устойчивые к перебоям сети приложения с надежным воспроизведением запросов. Правильная конфигурация очередей и интеграция с маршрутизацией обеспечивают стабильность взаимодействия с сервером даже при частых оффлайн-ситуациях.