Настройка параметров кэша через options внутри runtimeCaching

runtimeCaching в библиотеке Sw-precache позволяет настраивать правила кэширования для запросов, которые не были заранее предкэшированы. Основное предназначение этого блока — определить стратегию кэширования для динамических ресурсов, таких как API-запросы, изображения или внешние скрипты. Каждый объект внутри массива runtimeCaching представляет собой правило с несколькими ключевыми полями: urlPattern, handler и options.


urlPattern

urlPattern задаёт шаблон URL, который будет отслеживаться сервис-воркером. Значение может быть:

  • Регулярным выражением: применяется для динамических и сложных URL.

    urlPattern: /\/api\/.*\/*.json/,
  • Строкой: точное совпадение с URL.

    urlPattern: '/images/logo.png',

Важно понимать, что корректная настройка шаблона URL критически влияет на производительность кэширования. Неверный паттерн может привести к тому, что ресурсы будут либо не кэшироваться, либо кэшироваться слишком агрессивно.


handler

handler определяет стратегию кэширования для выбранных ресурсов. Доступные стратегии:

  • cacheFirst — сначала проверяет кэш, если ресурс не найден, загружает с сети и кэширует.
  • networkFirst — сначала делает запрос к сети, при неудаче использует кэш.
  • fastest — параллельно обращается к сети и кэшу, возвращает первый доступный ответ.
  • networkOnly — всегда использует сеть, кэш не применяется.
  • cacheOnly — всегда использует только кэш.

Выбор стратегии зависит от характера ресурса: статические файлы лучше хранить через cacheFirst, а динамические данные API — через networkFirst.


options

Ключ options позволяет детально управлять поведением кэша и временем жизни ресурсов. Основные параметры:

cacheName

Определяет имя кэша для конкретного правила runtimeCaching.

options: {
  cacheName: 'api-cache-v1'
}

Использование уникальных имён для разных типов ресурсов упрощает управление кэшами и их очистку.


expiration

Позволяет задать правила устаревания кэша через объект с параметрами:

  • maxEntries — максимальное количество элементов в кэше.

    expiration: {
      maxEntries: 50
    }
  • maxAgeSeconds — время жизни ресурса в секундах.

    expiration: {
      maxAgeSeconds: 24 * 60 * 60 // 1 день
    }

Можно комбинировать оба параметра для ограничения размера кэша и предотвращения хранения устаревших данных.


cacheableResponse

Позволяет указывать, какие ответы можно кэшировать, основываясь на HTTP-статусах и заголовках:

cacheableResponse: {
  statuses: [0, 200],
  headers: {
    'x-cacheable': 'true'
  }
}
  • statuses — массив кодов HTTP, которые будут кэшироваться (обычно 200, иногда 0 для opaque-запросов).
  • headers — позволяет фильтровать ответы по наличию определённых заголовков.

Пример полной настройки runtimeCaching
runtimeCaching: [
  {
    urlPattern: /\/api\/.*\/*.json/,
    handler: 'networkFirst',
    options: {
      cacheName: 'api-cache-v1',
      expiration: {
        maxEntries: 100,
        maxAgeSeconds: 60 * 60 // 1 час
      },
      cacheableResponse: {
        statuses: [0, 200]
      }
    }
  },
  {
    urlPattern: /\/images\/.*\.(png|jpg|jpeg|svg)/,
    handler: 'cacheFirst',
    options: {
      cacheName: 'image-cache',
      expiration: {
        maxEntries: 200,
        maxAgeSeconds: 7 * 24 * 60 * 60 // 7 дней
      },
      cacheableResponse: {
        statuses: [0, 200]
      }
    }
  }
]

В этом примере видно, как разные типы ресурсов получают отдельные кэши, стратегии и правила устаревания.


Рекомендации по использованию options

  1. Разделение кэшей по типу ресурса повышает читаемость и управляемость.
  2. Комбинация maxEntries и maxAgeSeconds предотвращает переполнение и хранение устаревших данных.
  3. Фильтрация через cacheableResponse защищает от кэширования ошибок сервера или некорректных ответов.
  4. Использование уникальных имён кэша (cacheName) облегчает обновление сервис-воркера без удаления всего кэша.

Эта настройка позволяет создавать гибкую и безопасную стратегию кэширования для любых динамических ресурсов в проекте на JavaScript с использованием Sw-precache.