Sw-precache предоставляет мощный механизм для управления кэшированием ресурсов на стороне клиента через сервис-воркеры. Помимо статического кэширования файлов на этапе установки сервис-воркера, библиотека поддерживает runtime-кэш, который позволяет динамически кэшировать ресурсы при их запросе в браузере. Одним из ключевых аспектов работы runtime-кэша является контроль размера кэша и времени жизни объектов, что предотвращает переполнение хранилища и устаревание данных.
В runtime-кэше каждый ресурс может иметь ограничение
по времени хранения через параметр maxAgeSeconds. Этот
параметр задается в секундах и определяет, как долго объект считается
актуальным:
runtimeCaching: [{
urlPattern: /\/api\/.*\/*.json/,
handler: 'cacheFirst',
options: {
cache: {
name: 'api-cache',
maxAgeSeconds: 24 * 60 * 60 // 1 день
}
}
}]
Особенности работы maxAgeSeconds:
handler: 'cacheFirst' устаревшие ресурсы
сначала используются из кэша, но при этом сервис-воркер проверяет их
актуальность по истечении времени жизни.Для предотвращения неограниченного роста кэша,
используется параметр maxEntries, который задает
максимальное количество объектов в кэше:
runtimeCaching: [{
urlPattern: /\/images\/.*\.(png|jpg|svg)/,
handler: 'cacheFirst',
options: {
cache: {
name: 'images-cache',
maxEntries: 50, // максимум 50 изображений
maxAgeSeconds: 7 * 24 * 60 * 60 // 7 дней
}
}
}]
Механизм работы maxEntries:
maxEntries удобно комбинировать с
maxAgeSeconds для комплексного управления кэшем.Часто на практике используется совместное ограничение по времени жизни и количеству объектов, чтобы обеспечить оптимальное управление динамическими ресурсами:
runtimeCaching: [{
urlPattern: /\/api\/v1\/posts/,
handler: 'networkFirst',
options: {
cache: {
name: 'posts-cache',
maxEntries: 100,
maxAgeSeconds: 12 * 60 * 60 // 12 часов
}
}
}]
Пояснения к стратегии:
networkFirst сначала пытается получить свежие данные с
сервера, но если сеть недоступна, используется кэш.Выделять отдельные кэши для разных типов
ресурсов Разделение кэшей (например, images-cache,
api-cache, fonts-cache) позволяет применять
индивидуальные ограничения maxEntries и
maxAgeSeconds под специфику ресурсов.
Использовать LRU-подход для больших динамических данных При кэшировании больших массивов данных важно ограничивать количество записей, чтобы не перегружать браузер.
Настраивать время жизни в зависимости от частоты
обновления Для редко изменяемых файлов (CSS,
JS) можно задавать длительный maxAgeSeconds, а
для часто обновляемых API — короткий.
Комбинировать стратегии кеширования Стратегии
cacheFirst и networkFirst в сочетании с
maxEntries и maxAgeSeconds дают гибкий
контроль над динамическим контентом и обеспечивают высокую
производительность приложения.
maxAgeSeconds) и количество объектов превышает
maxEntries, он удаляется при следующем обращении к
кэшу.Эти возможности позволяют точно контролировать runtime-кэш, обеспечивая баланс между производительностью, актуальностью данных и ограничением потребления памяти в браузере.