Библиотека Sw-precache предоставляет возможность автоматической генерации Service Worker для кэширования ресурсов веб-приложений, что улучшает производительность и оффлайн-доступ. В крупных проектах возникает необходимость разделять кэширование по различным разделам сайта, чтобы уменьшить размер одного Service Worker и изолировать кэш отдельных частей приложения.
Изоляция кэша по разделам Каждый раздел сайта может иметь собственный Service Worker с индивидуальными правилами кэширования. Это позволяет:
Уникальные имена кэша Для каждого Service Worker
необходимо задавать отдельное имя кэша (cacheId). Это
предотвращает пересечение кэшей разных разделов. Например:
var swPrecacheMain = require('sw-precache');
swPrecache.write('service-worker-main.js', {
staticFileGlobs: [
'main/**/*.js',
'main/**/*.css',
'main/**/*.html'
],
stripPrefix: 'main/',
cacheId: 'main-section-cache'
});
swPrecache.write('service-worker-admin.js', {
staticFileGlobs: [
'admin/**/*.js',
'admin/**/*.css',
'admin/**/*.html'
],
stripPrefix: 'admin/',
cacheId: 'admin-section-cache'
});Отдельные точки регистрации Service Worker
должен регистрироваться на уровне корня раздела. Это достигается путем
указания пути при вызове
navigator.serviceWorker.register():
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/main/service-worker-main.js');
navigator.serviceWorker.register('/admin/service-worker-admin.js');
}
Важно помнить, что Service Worker контролирует только те ресурсы, которые находятся в его области действия (scope), определяемой URL регистрации.
1. Указание путей к ресурсам
(staticFileGlobs) Каждый Service Worker должен
иметь список файлов для кэширования. Для разных разделов это могут быть
отдельные каталоги или наборы файлов.
2. Исключение ненужных файлов
(ignoreUrlParametersMatching) Позволяет исключать
query-параметры, чтобы не создавать дублирующий кэш:
ignoreUrlParametersMatching: [/^utm_/, /^fbclid$/]
3. Настройка стратегии кэширования
(runtimeCaching) Для динамических запросов можно
задать стратегию кэширования для конкретного раздела:
runtimeCaching: [{
urlPattern: /\/api\/main\//,
handler: 'networkFirst'
}]
Для другого раздела можно использовать собственные URL-шаблоны и стратегии:
runtimeCaching: [{
urlPattern: /\/api\/admin\//,
handler: 'networkFirst'
}]
Версионирование кэша Уникальные имена кэшей помогают безопасно обновлять ресурсы без удаления других разделов:
cacheId: 'main-section-cache-v2'Обновление Service Worker После изменения
ресурсов Service Worker автоматически обновляет кэш при следующем
посещении раздела. Можно использовать событие onupdatefound
для уведомления о новых версиях:
navigator.serviceWorker.register('/main/service-worker-main.js')
.then(reg => {
reg.onupdatefo und = () => {
const newWorker = reg.installing;
newWorker.onstatecha nge = () => {
if (newWorker.state === 'installed') {
console.log('Новая версия Main Section доступна');
}
};
};
});cacheFirst,
динамические — networkFirst./main/
index.html
app.js
style.css
service-worker-main.js
/admin/
dashboard.html
admin.js
admin.css
service-worker-admin.js
Для каждого раздела создается свой Service Worker с индивидуальным списком файлов и настройками, что позволяет гибко управлять кэшированием и обновлениями.
Такой подход гарантирует эффективное управление ресурсами, уменьшает размер кэшей и повышает стабильность работы сайта в оффлайн-режиме.