Параметр runtimeCaching в библиотеке Sw-precache
предназначен для описания стратегий кэширования ресурсов, которые не
были заранее добавлены в precache-манифест. В отличие от статического
кэширования (precache), где список файлов фиксируется на этапе сборки,
runtimeCaching управляет поведением service worker во время
выполнения — при перехвате сетевых запросов.
Основная задача — определить, как обрабатывать запросы к динамическим ресурсам: API, изображениям, сторонним скриптам, шрифтам и другим данным, которые появляются уже после установки service worker.
runtimeCaching представляет собой массив объектов,
каждый из которых описывает правило обработки запросов:
runtimeCaching: [
{
urlPattern: /\/api\/.*$/,
handler: 'networkFirst',
options: {
cacheName: 'api-cache',
expiration: {
maxEntries: 50,
maxAgeSeconds: 300
}
}
}
]
Каждый объект включает три ключевых элемента:
urlPattern — шаблон URL для перехватаhandler — стратегия кэшированияoptions — дополнительные параметры настройкиurlPatternОпределяет, какие запросы будут обрабатываться данным правилом. Поддерживаются разные типы значений:
Наиболее распространённый способ:
urlPattern: /\/images\/.*\.(png|jpg|jpeg|svg)$/
Используются для точного совпадения:
urlPattern: '/api/data'
Позволяют реализовать сложную логику:
urlPattern: function({ url, event }) {
return url.origin === 'https://api.example.com';
}
Функция получает объект с параметрами запроса (url,
event, request) и должна возвращать
true или false.
handlerОпределяет стратегию кэширования. Sw-precache предоставляет несколько встроенных стратегий:
cacheFirstСначала пытается взять ресурс из кэша, при отсутствии — обращается к сети.
Применение:
handler: 'cacheFirst'
networkFirstСначала делает запрос к сети, при неудаче — возвращает кэшированную версию.
Применение:
handler: 'networkFirst'
fastestПараллельно делает запрос к сети и кэшу, возвращает первый полученный ответ.
Применение:
handler: 'fastest'
networkOnlyВсегда обращается к сети, игнорируя кэш.
handler: 'networkOnly'
cacheOnlyВозвращает только кэшированные данные.
handler: 'cacheOnly'
optionsПозволяет детально настроить поведение кэширования.
cacheNameИмя кэша, в котором будут храниться ресурсы:
options: {
cacheName: 'image-cache'
}
Разделение кэшей облегчает управление и очистку.
expirationКонтроль времени жизни и размера кэша:
options: {
expiration: {
maxEntries: 100,
maxAgeSeconds: 86400
}
}
maxEntries — максимальное количество записейmaxAgeSeconds — срок хранения в секундахПри превышении лимитов старые записи автоматически удаляются.
cacheableResponseФильтрация ответов, которые можно кэшировать:
options: {
cacheableResponse: {
statuses: [0, 200]
}
}
Позволяет исключить ошибки или нежелательные ответы.
fetchOptionsНастройки запроса fetch:
options: {
fetchOptions: {
credentials: 'include'
}
}
Используется для управления куки, CORS и другими параметрами.
matchOptionsНастройки поиска в кэше:
options: {
matchOptions: {
ignoreSearch: true
}
}
Позволяет игнорировать query-параметры при поиске ресурса.
Массив runtimeCaching обрабатывается сверху вниз. При
совпадении с первым подходящим urlPattern дальнейшие
правила игнорируются.
runtimeCaching: [
{
urlPattern: /\/api\/.*/,
handler: 'networkFirst'
},
{
urlPattern: /\/api\/special\/.*/,
handler: 'cacheFirst'
}
]
В данном случае второй обработчик никогда не будет применён,
поскольку первый перехватывает все запросы /api/.
Часто используется несколько правил для разных типов ресурсов:
runtimeCaching: [
{
urlPattern: /\/api\/.*$/,
handler: 'networkFirst',
options: {
cacheName: 'api-cache'
}
},
{
urlPattern: /\.(?:png|jpg|jpeg|svg)$/,
handler: 'cacheFirst',
options: {
cacheName: 'image-cache',
expiration: {
maxEntries: 60
}
}
},
{
urlPattern: /https:\/\/fonts\.googleapis\.com\/.*/,
handler: 'cacheFirst',
options: {
cacheName: 'google-fonts'
}
}
]
runtimeCaching особенно важен для ресурсов с других
доменов:
{
urlPattern: /^https:\/\/cdn\.example\.com\/.*$/,
handler: 'cacheFirst',
options: {
cacheName: 'cdn-cache'
}
}
Без таких правил сторонние ресурсы не будут кэшироваться автоматически.
Для API-запросов обычно применяется networkFirst, но с
таймаутом:
{
urlPattern: /\/api\/.*$/,
handler: 'networkFirst',
options: {
networkTimeoutSeconds: 3,
cacheName: 'api-cache'
}
}
Если сеть не отвечает в течение указанного времени, используется кэш.
Грамотно настроенный runtimeCaching:
Ошибки в настройке могут привести к:
Статические изображения:
handler: 'cacheFirst'
REST API:
handler: 'networkFirst'
CDN-библиотеки:
handler: 'cacheFirst'
HTML-страницы:
handler: 'networkFirst'
runtimeCaching дополняет precache:
Оба механизма работают совместно внутри service worker.
Для проверки работы runtimeCaching используется:
Хотя handler принимает строковые значения, возможно
внедрение пользовательской логики через обёртки и модификации service
worker, генерируемого Sw-precache.
Это позволяет реализовать:
runtimeCaching является ключевым элементом для: