Событие извлечения Service Worker не запущено для самого Service Worker - PullRequest
0 голосов
/ 19 апреля 2020

Я заметил, что событие извлечения работника сервиса больше не запускается, когда сам скрипт работника сервиса загружается в браузер. Например, когда у нас есть новая версия сервисного работника, событие извлечения старых сервисных работников не запускается. Как следствие, старый сервисный работник больше не может проверять содержимое нового сервисного работника.

Я уверен, что это было возможно раньше, и я хотел бы знать, если это ошибка или были внесены какие-либо изменения относительно этого. Я не нашел ничего в официальном репозитории или черновике W3 C относительно этого изменения.

Чтобы убедиться, что событие fetch не запущено, я запрограммировал небольшой пример работника сервиса с номером версии (см. Код) , Я проверил это следующим образом:

  1. Установите первую версию работника службы
  2. Увеличьте номер версии до двух.
  3. Перезагрузите страницу -> Так, чтобы в браузере установлен новый файл sw. js.
  4. Проверьте журналы chrome -> ChromeLogs 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>

1 Ответ

0 голосов
/ 20 апреля 2020

Проверка обновления работника службы , которая инициируется браузером всегда , обходит все обработчики обслуживания fetch. Это может в конечном итоге быть выполнено кешем HTTP, хотя все современные браузеры по умолчанию также обходят кеш HTTP и идут прямо в сеть.

Я вполне уверен, что ни один браузер не имеет когда-либо вызывал обработчик событий fetch предыдущего работника службы при выполнении проверки обновления работника службы, поскольку это явно запрещено спецификацией работника службы (режим работники службы запроса на обновление необходимо установить на 'none'). Это помогает разработчикам избежать сценария ios, в котором старый сервисный работник мог «застрять», если он что-то сделал неправильно при обработке события fetch для нового сервисного работника.

Я не уверен, почему вы возможно, думал иначе - возможно, вы думаете о взаимодействии HTTP-кэша. Или, возможно, вы думаете о сценарии, в котором веб-приложение явно вызывает fetch('service-worker.js'), чтобы проверить, существует ли работник службы по заданному URL-адресу, что будет вызывать обработчик fetch службы работник, контролирующий данную страницу. Но вызов fetch('service-worker.js') сильно отличается от проверки обновлений работника службы.

...