runtimeCaching в библиотеке Sw-precache
позволяет настраивать правила кэширования для запросов, которые не были
заранее предкэшированы. Основное предназначение этого блока — определить
стратегию кэширования для динамических ресурсов, таких как API-запросы,
изображения или внешние скрипты. Каждый объект внутри массива
runtimeCaching представляет собой правило с несколькими
ключевыми полями: urlPattern, handler и
options.
urlPatternurlPattern задаёт шаблон URL, который будет
отслеживаться сервис-воркером. Значение может быть:
Регулярным выражением: применяется для динамических и сложных URL.
urlPattern: /\/api\/.*\/*.json/,Строкой: точное совпадение с URL.
urlPattern: '/images/logo.png',Важно понимать, что корректная настройка шаблона URL критически влияет на производительность кэширования. Неверный паттерн может привести к тому, что ресурсы будут либо не кэшироваться, либо кэшироваться слишком агрессивно.
handlerhandler определяет стратегию кэширования для выбранных
ресурсов. Доступные стратегии:
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 — позволяет фильтровать ответы
по наличию определённых заголовков.runtimeCachingruntimeCaching: [
{
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]
}
}
}
]
В этом примере видно, как разные типы ресурсов получают отдельные кэши, стратегии и правила устаревания.
optionsmaxEntries и
maxAgeSeconds предотвращает переполнение и
хранение устаревших данных.cacheableResponse
защищает от кэширования ошибок сервера или некорректных ответов.cacheName) облегчает обновление сервис-воркера
без удаления всего кэша.Эта настройка позволяет создавать гибкую и безопасную стратегию кэширования для любых динамических ресурсов в проекте на JavaScript с использованием Sw-precache.