Стратегия networkOnly в библиотеке
Sw-precache реализует максимально «чистое» сетевое
поведение: каждый запрос обрабатывается исключительно через сеть,
полностью игнорируя кэш Service Worker. Это означает:
Такая стратегия применяется в ситуациях, где актуальность данных критичнее производительности и офлайн-доступа.
При использовании networkOnly Service Worker выступает
лишь как прокси:
fetch.fetch().Схематически:
Request → Service Worker → Network → Response
В отличие от других стратегий (cacheFirst,
networkFirst, staleWhileRevalidate), здесь
отсутствуют:
В sw-precache стратегия задаётся через параметр
runtimeCaching.
Пример конфигурации:
module.exports = {
runtimeCaching: [
{
urlPattern: /\/api\/.*$/,
handler: 'networkOnly'
}
]
};
Разбор параметров:
urlPattern — регулярное выражение для сопоставления
URL;handler: 'networkOnly' — указание стратегии.В данном случае все запросы к /api/ будут обрабатываться
исключительно через сеть.
Когда данные часто обновляются и устаревание недопустимо:
{
urlPattern: /\/api\/user\/.*$/,
handler: 'networkOnly'
}
Причины выбора:
Запросы, связанные с безопасностью:
{
urlPattern: /\/auth\/.*$/,
handler: 'networkOnly'
}
Особенности:
Любые финансовые транзакции:
{
urlPattern: /\/payments\/.*$/,
handler: 'networkOnly'
}
Кэширование здесь недопустимо из-за:
Ключевая особенность networkOnly — полное отсутствие
fallback-логики.
Если сеть недоступна:
fetch() выбрасывает ошибку;failed request.Пример обработки ошибки на уровне приложения:
fetch('/api/data')
.then(response => response.json())
.catch(() => {
console.error('Сеть недоступна');
});
| Стратегия | Кэш используется | Поведение при offline | Актуальность данных |
|---|---|---|---|
| cacheFirst | Да | Работает | Низкая |
| networkFirst | Да | Есть fallback | Высокая |
| staleWhileRevalidate | Да | Работает | Средняя |
| networkOnly | Нет | Ошибка | Максимальная |
fetch.В реальных приложениях networkOnly редко используется
изолированно. Чаще применяется в комбинации:
module.exports = {
runtimeCaching: [
{
urlPattern: /\/api\/secure\/.*$/,
handler: 'networkOnly'
},
{
urlPattern: /\/images\/.*$/,
handler: 'cacheFirst'
},
{
urlPattern: /\/.*$/,
handler: 'networkFirst'
}
]
};
Такое разделение позволяет:
Использование networkOnly накладывает требования:
При необходимости можно реализовать собственную логику поверх
networkOnly:
self.addEventListener('fetch', event => {
if (event.request.url.includes('/api/')) {
event.respondWith(
fetch(event.request).catch(() => {
return new Response(
JSON.stringify({ error: 'offline' }),
{ headers: { 'Content-Type': 'application/json' } }
);
})
);
}
});
Здесь добавляется минимальный fallback без полноценного кэширования.
Для проверки работы стратегии:
Ожидаемое поведение:
Важно различать:
Даже при networkOnly браузер может вернуть ответ из
HTTP-кэша, если заголовки позволяют:
Cache-Control: max-age=3600
Для полного отключения кэширования требуется:
Cache-Control: no-store
Показатели:
Оптимизация возможна только на стороне сервера:
Хотя sw-precache считается устаревающим решением (в
пользу Workbox), стратегия networkOnly полностью перенесена
и используется аналогично:
workbox.routing.registerRoute(
/\/api\/.*$/,
new workbox.strategies.NetworkOnly()
);
Логика и поведение остаются идентичными.
Рекомендуется чётко ограничивать URL-паттерны:
Плохо:
{
urlPattern: /\/.*/,
handler: 'networkOnly'
}
Хорошо:
{
urlPattern: /\/api\/v1\/orders\/.*$/,
handler: 'networkOnly'
}
Это предотвращает:
Частые ошибки:
urlPattern;Методы диагностики:
networkOnly занимает нишу строго сетевых операций:
Это инструмент точечного применения, а не универсальное решение для всего приложения.