Стратегии кеширования
Сделано
Реализация и проверенные сценарии описаны в офлайн-режиме, связь инструментов и настроек — в сборке и регистрации SW. Ниже сохранён учебный план и его архитектурные объяснения.
Стратегия определяет, откуда взять ответ на текущий запрос. Хранение и наполнение кеша разобраны в теории офлайн-режима; здесь сравним пять порядков обращения к кешу и сети.
Перед выбором стратегии
Получение сетевого ответа и разрешение сохранить его — разные факты. Если стратегия выбрала сеть для текущего запроса, полученный HTTP-ответ возвращается ему независимо от статуса; запись в кеш зависит от отдельной политики. Некешируемый HTTP 503 сам по себе не означает сетевой отказ и не переключает стратегию на старый кеш. Допустимость кеширования — Workbox. Схемы показывают порядок источников, без настройки таймаутов, маршрутов или кешей. Определения стратегий — Workbox, сценарии кеширования — web.dev.
CacheOnly
Источник — только кеш; отсутствующая запись означает отказ, даже при доступной сети.
flowchart TB
Q["Запрос"] --> C{"Запись в кеше?"}
C -->|"есть"| R["Ответ из кеша"]
C -->|"нет"| E["Отказ · сеть не используется"]Загрузка схемы…
NetworkOnly
Источник — только сеть; стратегия не записывает ответ в Cache Storage. Сетевой отказ передаётся дальше, если отдельно не предусмотрена подстановка. Обычный HTTP-кеш остаётся отдельным механизмом.
flowchart TB
Q["Запрос"] --> N{"Сеть вернула ответ?"}
N -->|"да"| R["Сетевой ответ"]
N -->|"нет"| E["Сетевой отказ · кеш не используется"]Загрузка схемы…
CacheFirst
Сначала кеш; при промахе — сетевой ответ независимо от разрешения кешировать. В кеш попадают только разрешённые политикой ответы. Найденная запись может устареть.
flowchart TB
Q["Запрос"] --> C{"Запись в кеше?"}
C -->|"есть"| R["Ответ из кеша"]
C -->|"нет"| N{"Получен ответ сети?"}
N -->|"да"| Rnet["Вернуть сетевой ответ"]
Rnet -.->|"если разрешено"| Save["Сохранить в кеш"]
N -->|"нет"| E["Сетевой отказ"]Загрузка схемы…
NetworkFirst
Сначала сеть: полученный ответ возвращается, а сохранение разрешается отдельно. Только если сеть не вернула ответ, стратегия обращается к существующей записи кеша.
flowchart TB
Q["Запрос"] --> N{"Получен ответ сети?"}
N -->|"да"| Rnet["Вернуть сетевой ответ"]
Rnet -.->|"если разрешено"| Save["Сохранить в кеш"]
N -->|"нет"| C{"Запись в кеше?"}
C -->|"есть"| R["Ответ из кеша"]
C -->|"нет"| E["Отказ"]Загрузка схемы…
StaleWhileRevalidate
При попадании текущий запрос получает кеш, а сеть запрашивается в фоне. Запись обновляется, только если ответ разрешено кешировать; иначе прежняя остаётся. При промахе текущий запрос получает сетевой ответ независимо от разрешения кешировать. Новая запись сама по себе не меняет уже показанный экран.
sequenceDiagram
participant Q as Запрос
participant C as Кеш
participant N as Сеть
Q->>C: Есть запись?
alt Попадание
C-->>Q: Текущий ответ из кеша
rect rgba(128, 128, 128, 0.12)
Note over C,N: Фоновое обновление
C->>N: Получить свежий ответ
alt Получен ответ
opt Разрешено кеширование
N-->>C: Запись для будущих запросов
end
else Сетевой отказ
Note over C: Старая запись остаётся
end
end
else Промах
Q->>N: Ждать сетевой ответ
alt Получен ответ
N-->>Q: Текущий сетевой ответ
opt Разрешено кеширование
N-->>C: Сохранить ответ
end
else Сетевой отказ
N-->>Q: Отказ текущего запроса
end
endЗагрузка схемы…
Сравнение стратегий
| Стратегия | Источник текущего ответа | Обращение к сети | Свежесть и предел |
|---|---|---|---|
| CacheOnly | Кеш | Нет | Зависит от наполнения; промах — отказ |
| NetworkOnly | Сеть | Всегда | Ответ сети; без неё — отказ |
| CacheFirst | Кеш, затем сеть | При промахе | Кеш может устареть; без обоих источников — отказ |
| NetworkFirst | Сеть, затем кеш | Сначала сеть | Сетевой ответ; если ответа нет — возможен старый |
| StaleWhileRevalidate | Кеш либо сеть при промахе | Всегда | При попадании сейчас старый ответ, обновление для будущего |
Далее — архитектура офлайн-режима Cellestial: какие запросы и ресурсы входят в выбранный сценарий. Вернуться к треку «Офлайн-режим».