Для интеграции sw-precache с Gulp необходимо сначала установить пакет через npm:
npm install sw-precache --save-dev
Также понадобится пакет gulp, если он ещё не используется в проекте:
npm install gulp --save-dev
После установки создаётся файл Gulp-заданий, например
gulpfile.js. В нём подключается модуль:
const gulp = require('gulp');
const swPrecache = require('sw-precache');
Sw-precache позволяет автоматически создавать сервис-воркер, который
кэширует статические ресурсы сайта. Основной метод —
swPrecache.write, который принимает путь к файлу
сервис-воркера и объект конфигурации:
gulp.task('generate-service-worker', function(callback) {
swPrecache.write('service-worker.js', {
staticFileGlobs: [
'dist/**/*.html',
'dist/**/*.js',
'dist/**/*.css',
'dist/images/**/*.{png,jpg,gif,svg}'
],
stripPrefix: 'dist/',
navigateFallback: '/index.html',
runtimeCaching: [{
urlPattern: /\/api\/.*\/*.json/,
handler: 'networkFirst'
}]
}, callback);
});
Ключевые параметры:
staticFileGlobs — массив путей к файлам, которые
будут кэшированы. Можно использовать маски с подстановочными
символами (**, *), что удобно для
кэширования целых папок.
stripPrefix — удаляет указанную часть пути при
записи в кэш, чтобы пути в сервис-воркере соответствовали структуре
сайта.
navigateFallback — путь к файлу, который будет
возвращаться при навигации на несуществующие URL. Обычно используется
для SPA.
runtimeCaching — массив правил динамического
кэширования. Каждое правило содержит:
urlPattern — регулярное выражение для URL.handler — стратегия кэширования:
networkFirst, cacheFirst,
fastest, networkOnly,
cacheOnly.Чтобы автоматизировать процесс, задачу генерации сервис-воркера
удобно привязать к другим задачам сборки, например после копирования
файлов в папку dist:
gulp.task('build', gulp.series('copy-files', 'generate-service-worker'));
Таким образом, при запуске gulp build сначала создаются
все файлы сайта, а затем автоматически создаётся сервис-воркер, готовый
к кэшированию.
Sw-precache поддерживает множество опций для тонкой настройки:
cacheId — уникальный идентификатор кэша, используется
при обновлении.maximumFileSizeToCacheInBytes — максимальный размер
файлов для кэширования.ignoreUrlParametersMatching — массив регулярных
выражений, параметры URL которых будут игнорироваться при
кэшировании.handleFetch — флаг, указывающий, обрабатывать ли
запросы через сервис-воркер (true по умолчанию).Пример расширенной конфигурации:
swPrecache.write('service-worker.js', {
staticFileGlobs: ['dist/**/*.{html,js,css}'],
stripPrefix: 'dist/',
cacheId: 'my-app-cache-v1',
maximumFileSizeToCacheInBytes: 5 * 1024 * 1024, // 5MB
ignoreUrlParametersMatching: [/utm_source/, /ref/],
navigateFallback: '/index.html'
}, callback);
Для корректного обновления кэша при изменении файлов необходимо
изменять cacheId или добавлять хеши в имена файлов.
Sw-precache генерирует манифест файлов с контрольными суммами, поэтому
при любом изменении содержимого файла сервис-воркер обновляет кэш
автоматически.
При разработке полезно включать вывод информации о сгенерированных файлах и размерах кэша. Для этого можно использовать функцию обратного вызова:
gulp.task('generate-service-worker', function(callback) {
swPrecache.write('service-worker.js', {
staticFileGlobs: ['dist/**/*.{html,js,css}'],
stripPrefix: 'dist/'
}, function() {
console.log('Service worker создан и кэш готов.');
callback();
});
});
Это позволяет убедиться, что все файлы корректно попадают в кэш, и облегчает отладку при настройке Gulp-сборки.