Для интеграции sw-precache в процесс сборки проекта с
Grunt используется специальный пакет grunt-sw-precache. Он
служит обёрткой над библиотекой sw-precache, позволяя
генерировать сервис-воркеры непосредственно в задачах Grunt.
Установка пакета через npm:
npm install grunt-sw-precache --save-dev
После установки необходимо подключить плагин в конфигурации Grunt:
module.exports = function(grunt) {
grunt.loadNpmTasks('grunt-sw-precache');
};
Задача swPrecache создаёт файл сервис-воркера, который
автоматически кэширует указанные ресурсы. Конфигурация состоит из
обязательных и опциональных параметров:
grunt.initConfig({
swPrecache: {
options: {
cacheId: 'my-project', // Уникальный идентификатор кэша
directoryIndex: 'index.html', // Файл по умолчанию для корневого URL
stripPrefix: 'dist/', // Убирает префикс из пути при генерации манифеста
runtimeCaching: [{
urlPattern: /\/api\//,
handler: 'networkFirst'
}],
verbose: true // Вывод подробной информации о процессе генерации
},
all: {
staticFileGlobs: [
'dist/**/*.html',
'dist/**/*.js',
'dist/**/*.css',
'dist/images/**/*.{png,jpg,gif,svg}'
],
swFilePath: 'dist/service-worker.js'
}
}
});
Разбор ключевых опций:
cacheId — используется для
идентификации кэша. Если кэш с таким идентификатором уже существует, он
будет перезаписан.
directoryIndex — указывает, какой
файл будет обслуживаться при обращении к корневой директории.
stripPrefix — позволяет удалить
лишний путь из URL при генерации манифеста кэша. Например, если ресурсы
лежат в dist/, этот префикс будет удалён, чтобы URL в
манифесте начинались с относительного пути.
runtimeCaching — массив правил для
динамического кэширования. Каждое правило содержит
urlPattern (регулярное выражение для совпадения с URL) и
handler (стратегия кэширования). Поддерживаются
стратегии:
networkFirst — сначала пытается получить ресурс из
сети, при недоступности берёт из кэша.cacheFirst — сначала обращается к кэшу, если ресурс
отсутствует, делает сетевой запрос.fastest — параллельно обращается к сети и кэшу,
использует первый доступный ответ.networkOnly / cacheOnly — полностью
исключают кэш или сеть соответственно.verbose — вывод подробного лога
позволяет отследить какие файлы попали в кэш и проверить работу
шаблонов.
staticFileGlobs — список шаблонов
для статических файлов, которые будут включены в кэш. Поддерживаются
glob-шаблоны для HTML, JS, CSS, изображений и других ресурсов.
swFilePath — путь, по которому
будет создан файл сервис-воркера.
Чаще всего генерация сервис-воркера выполняется после сборки проекта. Пример последовательности задач:
grunt.registerTask('build', [
'clean:dist',
'copy:dist',
'uglify',
'cssmin',
'swPrecache'
]);
Такой подход гарантирует, что в сервис-воркер попадут уже оптимизированные файлы, и кэш будет соответствовать актуальному состоянию проекта.
ignoreUrlParametersMatching или
dontCacheBustUrlsMatching. Например, для исключения файлов
с query-параметрами:ignoreUrlParametersMatching: [/utm_/],
dontCacheBustUrlsMatching: /vendors\.js$/
stripPrefixMulti для одновременного удаления нескольких
префиксов:stripPrefixMulti: {
'dist/': '',
'bower_components/': 'vendor/'
}
sw-precache
можно указывать базовый URL для генерации абсолютных путей, что удобно
при работе с поддоменами или обратными прокси:rootDir: 'dist',
handleFetch: true
После генерации сервис-воркера рекомендуется проверить его работу
локально. Запуск сервера через http-server или аналогичный
инструмент и проверка консоли браузера позволяет увидеть:
runtimeCaching,Для удобства можно включить параметр verbose: true,
чтобы Grunt выводил полные логи процесса кэширования.