Обработчик fastest в библиотеке
sw-precache реализует стратегию, при которой ответ
возвращается из того источника, который отработает быстрее — кэша или
сети. Это гибридный подход, объединяющий преимущества стратегий
cacheFirst и networkFirst, но без жесткого
приоритета одной из сторон.
Алгоритм обработчика можно описать следующим образом:
Одновременно инициируются два запроса:
Как только один из источников возвращает валидный ответ:
Если один из источников завершается с ошибкой:
Таким образом достигается минимально возможное время ответа при наличии альтернативных источников данных.
| Стратегия | Приоритет | Скорость | Актуальность данных |
|---|---|---|---|
| cacheFirst | Кэш | Высокая | Может устаревать |
| networkFirst | Сеть | Средняя | Более актуальные |
| fastest | Нет | Максимальная | Баланс |
Обработчик fastest задается через параметр
handler в настройках маршрутов:
runtimeCaching: [
{
urlPattern: /\/api\/.*$/,
handler: 'fastest'
}
]
Ключевая особенность — конкурентное выполнение операций. В отличие от последовательных стратегий, здесь нет ожидания одного источника перед обращением к другому.
Используется концепция “гонки” между Promise:
Promise.race([
caches.match(request),
fetch(request)
])
Однако реальная реализация сложнее:
Даже если ответ был получен из кэша:
Это делает стратегию “самообновляемой”.
Обработчик fastest эффективен в следующих случаях:
runtimeCaching: [
{
urlPattern: /\/images\/.*\.(png|jpg|jpeg|svg)$/,
handler: 'fastest',
options: {
cache: {
maxEntries: 50,
name: 'image-cache'
}
}
}
]
Обработчик fastest используется внутри обработчика
события fetch:
self.addEventListener('fetch', event => {
event.respondWith(fastestStrategy(event.request));
});
Где fastestStrategy реализует логику параллельных
запросов.
Для повышения эффективности:
maxEntries)cacheName)urlPatternВажно учитывать, что постоянные сетевые запросы могут увеличить энергопотребление на мобильных устройствах.
fastest часто применяется в сочетании с:
networkFirst — для критичных данныхcacheFirst — для статических ресурсовПример:
runtimeCaching: [
{
urlPattern: /\/api\/.*$/,
handler: 'fastest'
},
{
urlPattern: /\/static\/.*$/,
handler: 'cacheFirst'
}
]
Но возможна ситуация, когда пользователь видит устаревшие данные, если кэш срабатывает быстрее сети.
fastest — это компромисс между скоростью и
актуальностью, реализованный через конкурентный доступ к данным.
Подходит для случаев, где важен отклик системы, а не строгая
синхронизация с сервером.