Работники параллельного сервиса в одном домене получают друг друга, несмотря на то, что находятся в разных областях? - PullRequest
0 голосов
/ 28 января 2019

Несколько месяцев назад я настроил сервисных работников в параллельных областях на тестовой странице.Недавно я видел, что если один из сервисных работников получает событие извлечения, другие работники тоже.Похоже, это происходит только в Chrome (64-разрядная версия 71.0.3578.98, а также в 64-разрядной версии Chrome Canary 74.0.3686.0), а не в Firefox.

Я пытался выполнить толькополучать запросы, которые соответствуют области регистрации работника службы, но это не работает.Я также посмотрел, правильно ли я смотрю на SW, но, похоже, это не так.Консоль выводит то, что кажется правильной областью, и, глядя в инструментах разработчика под Application-> Service Workers, рабочие активны, а их клиенты настроены на правильные URL.

Структура страниц таковаследует:

/web/test1/index.html
/web/test1/sw.js
/web/test2/index.html
/web/test2/sw.js

index.html, регистрация работника службы.

if ('serviceWorker' in navigator) {
        navigator.serviceWorker.register('sw.js',{scope: './'}).then(function(registration) {
            console.log('SW registration successful: ', registration);
            if(registration.installing) {
              console.log('SW installing...', registration.scope);
            } else if(registration.waiting) {
              console.log('SW installed', registration.scope);
            } else if(registration.active) {
              console.log('SW active!', registration.scope);
            }
          }).catch(function(error) {
            console.log('SW registration failed: ', error);
          });
        });
      }

Файл console.log выводит файл index.html в каталоге test1 (заменяет фактический URL)

SW registration successfull:  ServiceWorkerRegistration {scope: "[URL]/web/test1/", updateViaCache: "imports", active: null, installing: ServiceWorker, navigationPreload: NavigationPreloadManager, …}active: ServiceWorker {scriptURL: "[URL]/web/test1/sw.js", state: "activated", onerror: null, onstatechange: null}installing: nullnavigationPreload: NavigationPreloadManager {}onupdatefound: nullpaymentManager: PaymentManager {instruments: PaymentInstruments, userHint: ""}pushManager: PushManager {}scope: "[URL]/web/test1/"sync: SyncManager {}updateViaCache: "imports"waiting: null__proto__: ServiceWorkerRegistration

SW installing... [URL]/web/test1/

sw.js

var cacheName = 'foo';
var filesToCache = [
 './file.txt'
];

...

self.addEventListener('fetch', function(event) {
  console.log("reg", registration.scope);
  console.log("eventurl", event.request.url);
  if(event.request.url.includes(registration.scope)) {
  event.respondWith(

    caches.open(cacheName).then(function(cache) {
      return cache.match(event.request).then(function(response) {
        var fetchPromise = fetch(event.request).then(function(networkResponse) {
          cache.put(event.request, networkResponse.clone()).catch(function(err) {           //Store file in cache
            console.log('SW Could not add to cache!', err)
          });

          return networkResponse;
        }).catch(function(err) { 
          console.log('SW Fetch error: ', err)
        })
        return response || fetchPromise;
      })
    }).catch(function(err) {
      console.log('SW Cache error: ', err)
    })
  );
  }
});

Вывод console.log файла sw.js в каталоге test1, запрашивающий событие выборки через test2 index.html (заменил фактический URL)

sw.js:46 reg [URL]/web/test1/
sw.js:47 eventurl [URL]/web/test1/file.txt

sw.js:46 reg [URL]/web/test2/
sw.js:47 eventurl [URL]/test2/file.txt

Сервисные работники в обеих областях идентичны, запрошенные файлы разные, хотя и называются одинаковыми.

В Firefox я вижу только журнал вывода событий от сервисного работника, который находится в пределахобъем.То же самое касается Chrome, до нескольких месяцев назад, я думаю?Что я могу сделать, чтобы изменить поведение в Chrome, чтобы оно действовало так же, как в Firefox, или это не ожидаемое поведение?

...