Service Worker — это скрипт, который браузер запускает в фоновом режиме, отдельно от веб-страницы. Его ключевая особенность заключается в возможности перехватывать сетевые запросы, управлять кэшированием ресурсов и обеспечивать работу веб-приложений в офлайн-режиме. Service Worker не имеет доступа к DOM напрямую, что повышает его безопасность и изоляцию от основной страницы.
Основные функции Service Worker:
Жизненный цикл Service Worker отличается от жизненного цикла обычной веб-страницы и состоит из нескольких этапов:
Sw-precache — это инструмент для автоматического создания Service Worker, который кэширует статические ресурсы веб-приложения. Основная цель библиотеки — минимизация ручного кода для кэширования и управление офлайн-доступом.
npm install sw-precache --save-dev
Для генерации Service Worker используется Node.js скрипт, в котором указываются пути ресурсов, которые нужно кэшировать, и параметры кэширования:
const swPrecache = require('sw-precache');
swPrecache.write('service-worker.js', {
staticFileGlobs: [
'index.html',
'css/**/*.css',
'js/**/*.js',
'images/**/*.{png,jpg,gif,svg}'
],
stripPrefix: 'dist/',
runtimeCaching: [{
urlPattern: /\/api\//,
handler: 'networkFirst'
}]
});
Ключевые параметры:
handler задает стратегию кэширования:
networkFirst, cacheFirst, fastest
и другие.Sw-precache поддерживает несколько стратегий управления кэшем:
Sw-precache удобно интегрировать с Gulp, Webpack или другими сборщиками:
Пример с 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/**/*.{html,js,css,png,jpg,gif,svg}'],
stripPrefix: 'dist/'
}, callback);
});
Такой подход позволяет автоматически обновлять кэш при сборке проекта и минимизирует ручное вмешательство.
Service Worker обновляется при изменении его файла. Sw-precache генерирует уникальные хэши для ресурсов, что позволяет браузеру корректно определять, какие файлы нужно обновить. Рекомендуется использовать стратегию «cache busting» для всех часто меняющихся файлов, чтобы избежать загрузки устаревших данных.