В JavaScript при работе с Service Worker ключевым аспектом является
область видимости (scope). Она определяет,
какие сетевые запросы веб-приложения будут перехватываться конкретным
Service Worker. Понимание и корректная настройка scope
критически важны для эффективного кэширования ресурсов и управления
стратегиями обновления.
scopescope задаётся при регистрации Service Worker через
метод navigator.serviceWorker.register():
navigator.serviceWorker.register('/sw.js', { scope: '/app/' });
Ключевые моменты:
/app/
означает, что Service Worker будет контролировать все запросы, URL
которых начинаются с /app/.scope не указан,
Service Worker получает область видимости равную каталогу, где находится
файл скрипта Service Worker. Например, '/sw.js' → область
видимости '/' будет / только если файл лежит в
корне, иначе — каталог, где размещён sw.js./).scope
на перехват запросовService Worker перехватывает только запросы внутри своей
области видимости. Запросы вне scope будут
игнорироваться:
// Service Worker с scope '/app/'
fetch('/app/data.json'); // перехватывается
fetch('/other/data.json'); // не перехватывается
Это важно при проектировании архитектуры веб-приложения:
/.scope ограниченным нужным
каталогом.scope и
sw-precacheБиблиотека sw-precache автоматически генерирует файл
Service Worker с кэшированием указанных ресурсов. При использовании
scope важно учитывать следующие моменты:
// sw-precache сгенерировал sw.js
navigator.serviceWorker.register('/app/sw.js', { scope: '/app/' });
staticFileGlobs)
должны быть внутри scope. Если ресурсы находятся вне
области видимости, Service Worker не сможет их контролировать и
обновлять.module.exports = {
staticFileGlobs: [
'app/**/*.html',
'app/**/*.css',
'app/**/*.js'
],
stripPrefix: 'app/',
navigateFallback: '/app/index.html'
};
scope
после регистрацииОбласть видимости определяется только при регистрации. Изменить её на лету невозможно без повторной регистрации Service Worker:
navigator.serviceWorker.register('/sw.js', { scope: '/new-scope/' })
.then(() => console.log('SW с новым scope зарегистрирован'));
Важно учитывать, что браузеры хранят старую версию Service Worker и могут не обновить область видимости сразу, пока старый Service Worker активен.
/app/sw.js →
scope не может быть /.var swPrecache = require('sw-precache');
swPrecache.write('app/sw.js', {
staticFileGlobs: [
'app/**/*.html',
'app/**/*.css',
'app/**/*.js',
'app/images/**/*'
],
stripPrefix: 'app/',
navigateFallback: '/index.html',
runtimeCaching: [{
urlPattern: /\/api\/.*$/,
handler: 'networkFirst'
}]
});
// Регистрация с правильным scope
navigator.serviceWorker.register('/app/sw.js', { scope: '/app/' })
.then(function(reg) {
console.log('Service Worker зарегистрирован с scope:', reg.scope);
});
В этом примере:
/app/.scope могут
кэшироваться.Область видимости — это фундаментальная концепция, которая определяет
границы действия Service Worker и корректность работы кэширования через
sw-precache. Правильная настройка scope позволяет
эффективно управлять ресурсами, снижать нагрузку на сеть и обеспечивать
стабильную работу приложения.