Я заметил, что событие извлечения работника сервиса больше не запускается, когда сам скрипт работника сервиса загружается в браузер. Например, когда у нас есть новая версия сервисного работника, событие извлечения старых сервисных работников не запускается. Как следствие, старый сервисный работник больше не может проверять содержимое нового сервисного работника.
Я уверен, что это было возможно раньше, и я хотел бы знать, если это ошибка или были внесены какие-либо изменения относительно этого. Я не нашел ничего в официальном репозитории или черновике W3 C относительно этого изменения.
Чтобы убедиться, что событие fetch не запущено, я запрограммировал небольшой пример работника сервиса с номером версии (см. Код) , Я проверил это следующим образом:
- Установите первую версию работника службы
- Увеличьте номер версии до двух.
- Перезагрузите страницу -> Так, чтобы в браузере установлен новый файл sw. js.
- Проверьте журналы chrome -> ChromeLogs
Пример 'sw. js':
const version = 1;
console.log(`SW with v${version} executed`);
async function onFetch(event) {
// Not triggered for sw.js
console.log(`fetching: ${event.request.url} with v${version}`);
return await fetch(event.request);
}
async function onInstall() {
console.log(`sw v${version} install`);
await self.skipWaiting();
}
async function onActivate() {
console.log(`sw v${version} activate`);
await self.clients.claim();
}
self.addEventListener('fetch', event => event.respondWith(onFetch(event)));
self.addEventListener('install', event => event.waitUntil(onInstall()));
self.addEventListener('activate', event => event.waitUntil(onActivate()));
Как мы видим из журналов, файл sw. js не был выбран, но другой файл (test. js) был выбран до установки нового работника сервиса. Я включил тестовый файл. js javascript, чтобы проверить, что сервисный работник что-то выбирает. Таким образом, из этого теста мы видим, что событие fetch не запускается для самого сценария работника сервиса.
Я хотел бы знать, есть ли способ получить новый файл javascript работника сервиса перед ним? загружается внутри старого сервисного работника? Есть ли другие события, которые делают это возможным? Мне не нужно перехватывать сценарий от выполнения или замены старого работника сервиса. Я просто хочу проверить содержимое нового работника сервиса перед его загрузкой.
РЕДАКТИРОВАТЬ :
<html>
<body>
<h1>hello</h1>
<script src="test.js"></script>
<button onclick="runFetch()">fetch</button>
<h2 id="swVersion"></h2>
<script>
navigator.serviceWorker.register('/sw.js'); // First Installation
fetch('/sw.js'); // Triggers fetch event, but is independent from update routine.
async function runFetch() {
console.log(await fetch('/sw.js'));
}
</script>
</body>
</html>