Workbox предоставляет мощные инструменты для работы с
сервис-воркерами, среди которых ключевым является возможность
отслеживания состояния сети и принятия решений о кешировании или
обновлении ресурсов на основе доступности соединения. Работа с сетью в
Workbox строится на концепции стратегий кэширования и событий
сервис-воркера, таких как fetch и install.
Для определения доступности сети в браузере используется объект
navigator.onLine. Он возвращает булево значение:
true, если устройство имеет доступ к сети, и
false, если нет. Однако полагаться только на этот метод не
всегда безопасно, так как он сообщает только об общих сетевых
подключениях, а не о возможности конкретного запроса.
Пример использования:
if (navigator.onLine) {
console.log('Сеть доступна');
} else {
console.log('Сеть недоступна');
}
Для динамических проверок доступности конкретного ресурса лучше использовать попытку запроса и обработку исключений.
async function checkResource(url) {
try {
const response = await fetch(url, { method: 'HEAD' });
return response.ok;
} catch (error) {
return false;
}
}
Workbox предлагает стратегии, которые автоматически учитывают доступность сети при обработке запросов:
Пример использования NetworkFirst для API-запросов:
import { registerRoute } from 'workbox-routing';
import { NetworkFirst } from 'workbox-strategies';
registerRoute(
({ url }) => url.pathname.startsWith('/api/'),
new NetworkFirst({
cacheName: 'api-cache',
networkTimeoutSeconds: 5,
})
);
networkTimeoutSeconds позволяет задать время ожидания
сети. Если за это время ответ не получен, Workbox возвращает
кэшированный ресурс, что повышает устойчивость приложения при слабом
соединении.
Для динамического реагирования на изменения состояния сети
используются события online и offline:
window.addEventListener('online', () => {
console.log('Соединение восстановлено');
});
window.addEventListener('offline', () => {
console.log('Соединение потеряно');
});
Эти события полезны для обновления интерфейса или уведомления пользователя о состоянии подключения.
Для приложений, которые должны работать как в оффлайн-режиме, так и
онлайн, оптимально использовать гибридные стратегии. Например,
комбинирование NetworkFirst с ручной проверкой доступности
сети позволяет обрабатывать ресурсы, недоступные в данный момент, и
минимизировать задержки:
import { CacheFirst } from 'workbox-strategies';
async function fetchWithFallback(request) {
if (navigator.onLine) {
try {
return await fetch(request);
} catch {
const cache = await caches.open('offline-cache');
return cache.match(request);
}
} else {
const cache = await caches.open('offline-cache');
return cache.match(request);
}
}
Workbox поддерживает фоновые операции, которые зависят от доступности сети. Background Sync позволяет откладывать отправку данных на сервер до момента, когда сеть снова станет доступной:
import { BackgroundSyncPlugin } from 'workbox-background-sync';
const bgSyncPlugin = new BackgroundSyncPlugin('queueName', {
maxRetentionTime: 24 * 60, // время хранения в минутах
});
registerRoute(
/\/submit-form/,
new NetworkOnly({
plugins: [bgSyncPlugin]
}),
'POST'
);
Это гарантирует, что формы и события, генерируемые пользователем, будут отправлены даже при временной потере сети.
navigator.onLine
и попытки fetch-запросов.online и offline позволяют
динамически реагировать на изменения соединения.Эффективное использование этих инструментов позволяет создавать Progressive Web App с устойчивым поведением вне зависимости от состояния подключения, минимизируя потерю данных и повышая отзывчивость интерфейса.