Библиотека Sw-precache предназначена для автоматического создания сервис-воркеров, обеспечивающих кэширование ресурсов веб-приложения. Одним из ключевых аспектов эффективного кэширования является корректное инвалидирование устаревших ресурсов при их изменении. Sw-precache предоставляет инструменты для реализации этой задачи без ручного вмешательства.
Sw-precache использует контентные хэши для отслеживания изменений файлов. При генерации манифеста сервис-воркера библиотека:
Если содержимое файла меняется, его хэш меняется, и сервис-воркер понимает, что кэшированный ресурс устарел, и заменяет его на новую версию.
const swPrecache = require('sw-precache');
swPrecache.write('service-worker.js', {
staticFileGlobs: [
'build/**/*.{js,css,html,png,jpg,gif,svg}'
],
stripPrefix: 'build/'
}, () => {
console.log('Service worker generated.');
});
В этом примере все файлы в директории build будут
кэшироваться, а их хэши автоматически включаются в сервис-воркер.
Sw-precache поддерживает ряд параметров, влияющих на автоматическое инвалидирование:
staticFileGlobs — массив путей к
файлам, которые должны быть кэшированы. Использование глобов позволяет
отслеживать большие наборы файлов без перечисления каждого вручную.stripPrefix — удаляет указанную часть
пути при формировании ключей кэша, что позволяет избежать дублирования и
конфликтов при изменении структуры директорий.dontCacheBustUrlsMatching — регулярное
выражение, определяющее файлы, для которых не нужно автоматически
добавлять query-параметр с хэшем. Используется для внешних библиотек или
ресурсов с постоянным URL.mergeStaticsConfig — возможность
объединять текущую конфигурацию с уже существующей для плавного
обновления кэшей без удаления всего содержимого.Эти параметры позволяют гибко управлять механизмом кэширования и контролировать, какие файлы требуют автоматического обновления, а какие остаются статичными.
Для корректного обновления ресурсов Sw-precache использует стратегию “cache-first with update”. Основные этапы:
Встроенная система контроля версий обеспечивает гарантированное обновление только изменённых файлов, минимизируя лишние сетевые запросы.
Sw-precache легко интегрируется с Gulp, Webpack и другими сборщиками. Например, использование с Gulp позволяет автоматически регенерировать сервис-воркер при изменении исходных файлов:
const gulp = require('gulp');
const swPrecache = require('sw-precache');
gulp.task('generate-service-worker', function(callback) {
swPrecache.write('build/service-worker.js', {
staticFileGlobs: ['build/**/*.{js,css,html,png}'],
stripPrefix: 'build/'
}, callback);
});
gulp.task('watch', function() {
gulp.watch('build/**/*', gulp.series('generate-service-worker'));
});
В этом сценарии каждый раз при изменении файлов в build
автоматически создаётся новый сервис-воркер с обновлёнными хэшами,
обеспечивая мгновенное инвалидирование устаревших кэшей.
Для сложных проектов можно использовать:
runtimeCaching — позволяет указать
правила кэширования для динамических запросов, например, API или внешних
ресурсов.handleFetch — включает или отключает
обработку запросов сервис-воркером, что полезно для тестирования и
постепенного внедрения кэширования.stripPrefixMulti — поддержка
нескольких префиксов, что удобно при разнородной структуре
каталогов.Эти методы позволяют строить гибкую систему инвалидирования и обновления ресурсов с минимальной ручной поддержкой.
staticFileGlobs,
чтобы исключить возможность пропуска обновлённых файлов.dontCacheBustUrlsMatching.Автоматическое инвалидирование на основе хэшей является ядром эффективного кэширования Sw-precache и позволяет поддерживать актуальность ресурсов без потери производительности и контроля над версионированием.