Для начала работы с библиотекой sw-precache необходимо
добавить её в проект через npm:
npm install sw-precache --save-dev
После установки создается файл конфигурации, либо можно передавать
параметры напрямую в скрипт. Важнейший параметр —
staticFileGlobs, который определяет файлы для кэширования.
Пример базовой конфигурации:
const swPrecache = require('sw-precache');
swPrecache.write('service-worker.js', {
staticFileGlobs: [
'index.html',
'styles/**/*.css',
'scripts/**/*.js',
'images/**/*.{png,jpg,gif,svg}'
],
stripPrefix: 'dist/',
runtimeCaching: [{
urlPattern: /\/api\/.*$/,
handler: 'networkFirst'
}]
});
Ключевые моменты:
staticFileGlobs — массив файлов и шаблонов, которые
нужно кэшировать.stripPrefix — удаляет указанную часть пути при
добавлении файлов в кэш.runtimeCaching — динамическое кэширование, где
указывается стратегия для определённых URL.Для проектов с системами сборки, такими как Webpack
или Gulp, sw-precache можно использовать
как часть pipeline:
Gulp-пример:
const gulp = require('gulp');
const swPrecache = require('sw-precache');
gulp.task('generate-service-worker', function(callback) {
swPrecache.write('dist/service-worker.js', {
staticFileGlobs: ['dist/**/*.{js,html,css,png,jpg,gif,svg}'],
stripPrefix: 'dist/',
runtimeCaching: [{
urlPattern: /\/api\/.*$/,
handler: 'networkFirst'
}]
}, callback);
});
Особенности интеграции:
service-worker.js после сборки
проекта.staticFileGlobs рекомендуется включать только
необходимые для оффлайн работы файлы, чтобы не раздувать кэш.sw-precache поддерживает несколько стратегий
кэширования:
Пример использования:
runtimeCaching: [
{
urlPattern: /\/images\/.*/,
handler: 'cacheFirst'
},
{
urlPattern: /\/api\/.*$/,
handler: 'networkFirst'
}
]
Такой подход позволяет:
Для корректной работы обновлений следует контролировать версию файлов
и service worker. sw-precache автоматически добавляет хэш к
каждому кэшируемому ресурсу. После изменений в проекте достаточно
перегенерировать service-worker.js.
swPrecache.write('service-worker.js', {
staticFileGlobs: [
'dist/**/*.{js,css,html,png,jpg,gif,svg}'
],
stripPrefix: 'dist/',
runtimeCaching: [{
urlPattern: /\/api\/.*$/,
handler: 'networkFirst'
}],
verbose: true
});
Параметр verbose: true позволяет видеть процесс
генерации кэша и предупреждает о потенциальных проблемах.
В файле входа приложения (например, index.js)
добавляется регистрация service worker:
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/service-worker.js')
.then(function(registration) {
console.log('Service Worker зарегистрирован с областью:', registration.scope);
})
.catch(function(error) {
console.error('Регистрация Service Worker не удалась:', error);
});
}
Важные моменты:
service-worker.js вызывают событие
updatefound, что позволяет контролировать обновления
кэша.Для сайтов с динамическим контентом важно настроить runtime caching:
runtimeCaching: [
{
urlPattern: /\/api\/posts\/.*/,
handler: 'networkFirst',
options: {
cache: {
maxEntries: 50,
name: 'api-cache'
}
}
}
]
Здесь:
maxEntries ограничивает количество записей в кэше.name задаёт имя кэша для удобного управления.networkFirst обеспечивает актуальность данных при
доступности сети, но позволяет работать оффлайн при отсутствии
соединения.stripPrefix и точные шаблоны в
staticFileGlobs для минимизации размера кэша.verbose для отладки и
контроля процесса генерации.