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