Precaching — это стратегия кэширования ресурсов, при которой набор статических файлов заранее добавляется в кэш браузера во время установки сервис-воркера. Основная цель — обеспечить мгновенную доступность ресурсов для приложения, даже когда пользователь находится оффлайн, и уменьшить задержки при загрузке страниц.
В библиотеке Sw-precache precaching реализуется
через генерацию сервис-воркера, который автоматически регистрирует
выбранные файлы в кэш при событии install. Это отличается
от runtime caching, где ресурсы кэшируются по мере запроса.
Для работы с Sw-precache необходимо установить пакет через npm:
npm install sw-precache --save-dev
После установки создается конфигурационный файл или используется скрипт для генерации сервис-воркера. Минимальный пример генерации:
const swPrecache = require('sw-precache');
swPrecache.write('service-worker.js', {
staticFileGlobs: [
'index.html',
'css/**/*.css',
'js/**/*.js',
'images/**/*.{png,jpg,gif}'
],
stripPrefix: ''
});
Install При событии install
сервис-воркер вызывает процесс precaching. Sw-precache автоматически
формирует список ресурсов и помещает их в кэш.
Activate После установки происходит активация воркера. На этом этапе можно удалить старые версии кэшей, что предотвращает захламление хранилища.
Fetch Для уже закэшированных ресурсов Sw-precache перехватывает запросы и возвращает их из кэша. Это снижает время загрузки и обеспечивает оффлайн-доступ.
true. Если
установлено в false, precaching не будет автоматически
обрабатывать запросы.Пример расширенной конфигурации:
swPrecache.write('service-worker.js', {
staticFileGlobs: ['dist/**.html', 'dist/css/**.css', 'dist/js/**.js'],
stripPrefix: 'dist/',
cacheId: 'my-app-v1',
handleFetch: true,
navigateFallback: '/index.html'
});
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/**/*.{js,css,html,png,jpg,gif}'],
stripPrefix: 'dist/'
}, callback);
});
Для корректного обновления ресурсов используется комбинация
cacheId и хеширования файлов. Sw-precache автоматически
добавляет хэш к URL в кэше, что позволяет при изменении файла создать
новую версию кэша и избежать конфликтов с устаревшими ресурсами.
install можно отслеживать через
self.addEventListener('install', ...).skipWaiting() внутри обработчика install.stripPrefix для упрощения структуры
кэша.cacheId или хеши,
чтобы пользователи автоматически получали обновленные ресурсы.Precaching с Sw-precache обеспечивает высокую производительность, оффлайн-доступ и надежную доставку статических ресурсов, делая веб-приложения быстрее и устойчивее к сетевым сбоям.