sw-precache генерирует сервис-воркер, который
автоматически кэширует указанные ресурсы веб-приложения. Основная идея
заключается в том, что при первой загрузке страницы ресурсы помещаются в
кэш браузера, а при последующих обращениях сервис-воркер обслуживает их
из кэша, снижая время загрузки и уменьшая сетевой трафик.
При этом часто возникают ситуации, когда пользователи видят устаревшие версии ресурсов, даже если новые файлы уже доступны на сервере. Причины обычно связаны с механизмами работы кэша:
cacheId и
dontCacheBustUrlsMatching – некорректная настройка
этих опций может блокировать обновление кэша.cacheIdcacheId добавляется к имени кэша и помогает различать
версии приложения. Изменение cacheId приводит к созданию
нового кэша и удалению старого. Пример:
swPrecache.write('service-worker.js', {
staticFileGlobs: ['dist/**.js', 'dist/**.css'],
cacheId: 'my-app-v2',
stripPrefix: 'dist/'
});
В этом примере при смене cacheId с
my-app-v1 на my-app-v2 все предыдущие кэши
автоматически помечаются как устаревшие.
dontCacheBustUrlsMatchingПозволяет указать регулярное выражение для файлов, имена которых не должны подвергаться добавлению хэшей. Например:
dontCacheBustUrlsMatching: /\.\w{8}\./
Это важно для файлов с хешированными именами
(main.abcdef12.js), чтобы не создавать лишние версии кэша
при каждом обновлении.
stripPrefixОпция stripPrefix удаляет указанный префикс пути при
сохранении файла в кэш. Без правильного stripPrefix
сервис-воркер может искать файлы по неправильному пути, что ведёт к
устаревшему кэшу или ошибкам загрузки.
Sw-precache генерирует версионный кэш, и при обнаружении новых файлов сервис-воркер выполняет их предзагрузку. Для того чтобы изменения вступали в силу:
Иногда требуется форсированная очистка устаревшего кэша. В
сервис-воркере можно добавить обработчик activate:
self.addEventListener('activate', function(event) {
const expectedCaches = ['my-app-v2'];
event.waitUntil(
caches.keys().then(function(cacheNames) {
return Promise.all(
cacheNames.map(function(cacheName) {
if (expectedCaches.indexOf(cacheName) === -1) {
return caches.delete(cacheName);
}
})
);
})
);
});
Этот код удаляет все кэши, кроме актуальной версии, предотвращая загрузку устаревших файлов.
В Chrome DevTools:
Добавление логов помогает отследить поведение кэша:
self.addEventListener('install', function(event) {
console.log('Service Worker: installing...');
});
self.addEventListener('activate', function(event) {
console.log('Service Worker: activating...');
});
self.addEventListener('fetch', function(event) {
console.log('Fetching:', event.request.url);
});
Так можно увидеть, какие файлы берутся из кэша и какие запрашиваются с сети.
Использование caches.keys() позволяет увидеть, какие
кэши активны:
caches.keys().then(function(names) {
console.log('Current caches:', names);
});
Это помогает убедиться, что устаревшие кэши были удалены.
cacheId при крупных обновлениях, чтобы
гарантировать сброс старого кэша.dontCacheBustUrlsMatching для файлов с уже
встроенными хэшами, чтобы избежать лишнего повторного кэширования.fetch события и соответствие
кэшированных ресурсов реальному содержимому сервера.Эти подходы позволяют эффективно контролировать кэш и минимизировать вероятность появления устаревших ресурсов на клиенте.