ServiceWorker обрабатывает события извлечения URL-адресов вне области видимости

1

Мой сайт регистрирует 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, что он может кэшировать ответы для извлечения событий, сделанных страницами в области видимости, даже если адрес, на который он попадает, находится вне области видимости?

Теги:
offline
service-worker
offline-browsing

1 ответ

0

Отвечая на мой собственный вопрос...

Да, это предназначено поведение. Область действия определяется не адресом, по которому производится выборка, а адресом страницы, отправляющей запрос.

Ключевое слово "from" в этой цитате из Руководства Google:

... он будет обрабатывать события извлечения и сообщения, возникающие при отправке сетевого запроса или сообщения с вашей страницы.

Так что если JavaScript в /sw/page1.html делает запрос fetch() для /ping то ServiceWorker считает это "в области действия", поскольку страница, отправляющая запрос, начинается с /sw/...

Scope также включает исходный запрос браузера на получение страницы. Поэтому, если браузер пытается перейти на страницы, начинающиеся с /sw/... и если зарегистрирован ServiceWorker, то он обработает этот запрос.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню