Перейти к содержимому
Загрузка статьи…

Трек Офлайн-режим · Модуль №2

Стратегии кеширования ​

Сделано

Реализация и проверенные сценарии описаны в офлайн-режиме, связь инструментов и настроек — в сборке и регистрации SW. Ниже сохранён учебный план и его архитектурные объяснения.

Стратегия определяет, откуда взять ответ на текущий запрос. Хранение и наполнение кеша разобраны в теории офлайн-режима; здесь сравним пять порядков обращения к кешу и сети.

Перед выбором стратегии ​

Получение сетевого ответа и разрешение сохранить его — разные факты. Если стратегия выбрала сеть для текущего запроса, полученный HTTP-ответ возвращается ему независимо от статуса; запись в кеш зависит от отдельной политики. Некешируемый HTTP 503 сам по себе не означает сетевой отказ и не переключает стратегию на старый кеш. Допустимость кеширования — Workbox. Схемы показывают порядок источников, без настройки таймаутов, маршрутов или кешей. Определения стратегий — Workbox, сценарии кеширования — web.dev.

CacheOnly ​

Источник — только кеш; отсутствующая запись означает отказ, даже при доступной сети.

Mermaid
mermaid
flowchart TB
  Q["Запрос"] --> C{"Запись в кеше?"}
  C -->|"есть"| R["Ответ из кеша"]
  C -->|"нет"| E["Отказ · сеть не используется"]

Загрузка схемы…

NetworkOnly ​

Источник — только сеть; стратегия не записывает ответ в Cache Storage. Сетевой отказ передаётся дальше, если отдельно не предусмотрена подстановка. Обычный HTTP-кеш остаётся отдельным механизмом.

Mermaid
mermaid
flowchart TB
  Q["Запрос"] --> N{"Сеть вернула ответ?"}
  N -->|"да"| R["Сетевой ответ"]
  N -->|"нет"| E["Сетевой отказ · кеш не используется"]

Загрузка схемы…

CacheFirst ​

Сначала кеш; при промахе — сетевой ответ независимо от разрешения кешировать. В кеш попадают только разрешённые политикой ответы. Найденная запись может устареть.

Mermaid
mermaid
flowchart TB
  Q["Запрос"] --> C{"Запись в кеше?"}
  C -->|"есть"| R["Ответ из кеша"]
  C -->|"нет"| N{"Получен ответ сети?"}
  N -->|"да"| Rnet["Вернуть сетевой ответ"]
  Rnet -.->|"если разрешено"| Save["Сохранить в кеш"]
  N -->|"нет"| E["Сетевой отказ"]

Загрузка схемы…

NetworkFirst ​

Сначала сеть: полученный ответ возвращается, а сохранение разрешается отдельно. Только если сеть не вернула ответ, стратегия обращается к существующей записи кеша.

Mermaid
mermaid
flowchart TB
  Q["Запрос"] --> N{"Получен ответ сети?"}
  N -->|"да"| Rnet["Вернуть сетевой ответ"]
  Rnet -.->|"если разрешено"| Save["Сохранить в кеш"]
  N -->|"нет"| C{"Запись в кеше?"}
  C -->|"есть"| R["Ответ из кеша"]
  C -->|"нет"| E["Отказ"]

Загрузка схемы…

StaleWhileRevalidate ​

При попадании текущий запрос получает кеш, а сеть запрашивается в фоне. Запись обновляется, только если ответ разрешено кешировать; иначе прежняя остаётся. При промахе текущий запрос получает сетевой ответ независимо от разрешения кешировать. Новая запись сама по себе не меняет уже показанный экран.

Mermaid
mermaid
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: какие запросы и ресурсы входят в выбранный сценарий. Вернуться к треку «Офлайн-режим».