sw-precache — это библиотека для автоматического
создания сервис-воркеров в проектах на JavaScript, которые позволяют
кешировать статические ресурсы и обеспечивать офлайн-доступ к
веб-приложению. Основная идея заключается в предварительном
кешировании всех критических файлов приложения во время
установки сервис-воркера, что обеспечивает мгновенную доступность этих
ресурсов без необходимости сетевых запросов.
При интеграции sw-precache создается файл
сервис-воркера, содержащий:
Список файлов для кеширования
(precache manifest) Это массив объектов с URL
ресурсов и хешами версий файлов. Каждый объект имеет структуру:
{
"url": "/static/js/app.js",
"revision": "a1b2c3d4e5"
}
revision используется для контроля актуальности кеша:
при изменении файла библиотека автоматически обновляет соответствующую
запись.
Методы установки и активации Сервис-воркер
проходит через события install и activate. На
этапе установки происходит добавление файлов в кеш:
self.addEventListener('install', event => {
event.waitUntil(
caches.open('my-cache-v1').then(cache => cache.addAll([
'/index.html',
'/static/css/style.css',
'/static/js/app.js'
]))
);
});
В момент активации старые версии кешей могут быть удалены, чтобы избежать переполнения диска и конфликтов с актуальными ресурсами.
sw-precache использует статическую стратегию
precaching, при которой ресурсы всегда загружаются из кеша,
если они присутствуют. Дополнительно возможны следующие подходы:
Каждое обновление статического файла сопровождается изменением
revision. Сервис-воркер проверяет
precache manifest и:
caches.keys().then(cacheNames => {
return Promise.all(
cacheNames.map(cacheName => {
if (cacheName !== 'my-cache-v2') {
return caches.delete(cacheName);
}
})
);
});
Сервис-воркер перехватывает все сетевые запросы через событие
fetch:
self.addEventListener('fetch', event => {
event.respondWith(
caches.match(event.request).then(response => {
return response || fetch(event.request);
})
);
});
Если ресурс есть в кеши, он возвращается мгновенно. Если нет — выполняется сетевой запрос. Это обеспечивает гибридный офлайн/онлайн режим, где приложение остается функциональным даже без подключения к сети.
sw-precache легко интегрируется с Webpack, Gulp,
Grunt, позволяя:
Пример конфигурации Gulp:
const swPrecache = require('sw-precache');
gulp.task('generate-service-worker', () => {
return swPrecache.write('service-worker.js', {
staticFileGlobs: [
'dist/**/*.html',
'dist/**/*.js',
'dist/**/*.css'
],
stripPrefix: 'dist/',
navigateFallback: '/index.html'
});
});
Для SPA часто используется navigateFallback, который
позволяет направлять все неизвестные URL на главный HTML-файл:
navigateFallback: '/index.html'
Это гарантирует корректную работу офлайн-навигации и предотвращает ошибки 404 при прямом вводе адресов страниц.
Такое построение позволяет создавать быстрые, устойчивые к разрыву сети веб-приложения с минимальными усилиями по поддержке.