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()
для вас по умолчанию. Это зависит от вас, чтобы отказаться от его использования.