Мой сайт регистрирует ServiceWorker, который распространяется только на URL, начинающиеся с /sw/...
/**
* Register the Service Worker.
*/
if ('serviceWorker' in navigator) {
navigator.serviceWorker
.register('{{ URL::asset('sw/serviceworker.js') }}', {scope: './sw/'})
.then(registration => {
console.log("SW registered. Scope: ", registration.scope);
}).catch(err => { console.error("SW Register failed: ", err); });
}
Одна из страниц в пути /sw/...
выполняет выборку на сервер, чтобы узнать, доступно ли соединение с сервером. Получаемый адрес - это /ping
, простая страница, которая возвращает JSON. Обратите внимание, что адрес /ping/
не находится в пути /sw/...
).
// Sample of the bit inside my promise that checks for the server
// this is the request that is being cached
fetch('/ping')
.then(function(response) {
if (response.status == 200) {
console.log('%c Server available! ', 'background: #20c997; color: #000');
}
})
.catch(function(err) {
console.log('fetch failed! ', err);
});
Тем не менее, браузер четко показывает serviceWorker, перехватывающий запрос к /ping
.
Из консоли Google Chrome Dev:
Fetching http://127.0.0.1:8000/ping Request {method: "GET", url: "http://127.0.0.1:8000/ping", headers: Headers, referrer: "http://127.0.0.1:8000/sw/create", referrerPolicy: "no-referrer-when-downgrade", …} serviceworker.js:105
Fetched over network http://127.0.0.1:8000/ping: Response {type: "basic", url: "http://127.0.0.1:8000/ping", redirected: false, status: 200, ok: true, …}
Это не то, что я ожидаю, потому что я хочу, чтобы ServiceWorker только перехватывал запросы по адресам, начинающимся с /sw/...
Есть ли где-то в спецификации или предполагаемом поведении ServiceWorkers, что он может кэшировать ответы для извлечения событий, сделанных страницами в области видимости, даже если адрес, на который он попадает, находится вне области видимости?
Отвечая на мой собственный вопрос...
Да, это предназначено поведение. Область действия определяется не адресом, по которому производится выборка, а адресом страницы, отправляющей запрос.
Ключевое слово "from" в этой цитате из Руководства Google:
... он будет обрабатывать события извлечения и сообщения, возникающие при отправке сетевого запроса или сообщения с вашей страницы.
Так что если JavaScript в /sw/page1.html
делает запрос fetch()
для /ping
то ServiceWorker считает это "в области действия", поскольку страница, отправляющая запрос, начинается с /sw/...
Scope также включает исходный запрос браузера на получение страницы. Поэтому, если браузер пытается перейти на страницы, начинающиеся с /sw/...
и если зарегистрирован ServiceWorker, то он обработает этот запрос.