Workbox: опасность self.skipWaiting()

Я использую Workbox для предварительного кэширования ресурсов, необходимых для визуализации оболочки приложения, включая базовую версию index.html, Workbox предполагает, что index.html доступен в кеше, в противном случае навигация по страницам завершается неудачно, потому что я зарегистрировал это в моем Service Worker

workbox.routing.registerNavigationRoute('/index.html');

У меня также есть self.skipWaiting() Инструкция в слушателе установки:

self.addEventListener('install', e => {
  self.skipWaiting();
});

Как я понял, есть 2 install слушатели сейчас:

  • Тот, который зарегистрирован в Workbox для предварительного кэширования ресурсов (включая index.html)
  • Тот, который я зарегистрировал вручную в моем Service Worker

Это возможно для self.skipWaiting() добиться успеха, пока не удается установить прослушиватель Workbox? Это может привести к проблемному состоянию, когда активы не будут предварительно кэшироваться, но Service Worker активирован. Возможен ли такой сценарий и стоит ли защищаться от него?

1 ответ

Решение

Я настоятельно рекомендую " Жизненный цикл сервисного работника " в качестве авторитетного источника информации о различных этапах установки и обновления сервисного работника.

Чтобы суммировать некоторую информацию из этой статьи, как это относится к вашему вопросу:

  • Сервисный работник сначала входит в installing фаза, и сколько бы install слушатели, которых вы зарегистрировали, все получат шанс выполнить. Как вы предлагаете, Workbox создает свой собственный install слушатель, чтобы справиться с проповедью.

  • Только если каждый install слушатель завершит работу без ошибок, и работник службы перейдет к следующему этапу, который может быть waiting (если уже есть открытый клиент, использующий предыдущую версию сервисного работника) или activating (если нет клиентов, использующих предыдущую версию сервисного работника).

  • skipWaiting(), если вы решите использовать его, обойдет waiting этап независимо от того, есть ли какие-либо открытые клиенты, использующие предыдущую версию работника службы.

  • призвание skipWaiting() ничего не добьется, если какой-либо из install Слушатели не смогли, потому что работник службы никогда не покинет installing фаза. Это в основном неоперация.

Одна вещь, с которой вы должны быть осторожны, это использовать skipWaiting() когда вы также используете отложенную загрузку версионных, предварительно кэшированных ресурсов. Как говорится в статье:

Внимание: skipWaiting() означает, что ваш новый работник сервиса, вероятно, контролирует страницы, которые были загружены с более старой версией. Это означает, что некоторые извлечения вашей страницы будут обрабатываться вашим старым служащим, но ваш новый служащий будет обрабатывать последующие извлечения. Если это может сломать вещи, не используйте skipWaiting(),

Поскольку в 2018 году передовые ресурсы с предварительно загруженной кэш-памятью являются гораздо более распространенным явлением, Workbox не вызывает skipWaiting() для вас по умолчанию. Это зависит от вас, чтобы отказаться от его использования.

Другие вопросы по тегам