Как обрабатывать skipWaiting и ленивые ресурсы - PullRequest
0 голосов
/ 07 октября 2019

Итак, это то, о чем я немного ломаю голову, рассмотрим следующий сценарий:

Я работаю над своим проектом, я его строю, и в моем комплекте находится модуль lazyloaded:module-a-[oldhash].js, в какой-то момент он будет загружен.

Все хорошо и здорово.

Я продолжаю работать над своим проектом, создаю новый пакет, развертываю, и теперь мой хэш контента изменился: module-a-[newhash].js. Я развертываюсь, захожу на мою страницу, мой сервисный работник вызывает skipWaiting, но моя страница все еще пытается запросить module-a-[oldhash].js, который сейчас больше не существует.

Как мне поступить? Единственный способ справиться с этим - показать сообщение «доступно обновление», которое отправляет сообщение skipWaiting работнику службы и перезагружает страницу при событии controllerchange. Но мне любопытно, если нет способа достичь того же самого, не включая такой шаблон уведомлений / тостов и перезагрузку.

Кроме того, я понимаю, что это может создать проблему только с загруженными ресурсами

Правильно ли я понимаю эти проблемы? Каковы некоторые распространенные способы борьбы с этим?

1 Ответ

0 голосов
/ 07 октября 2019

Практически все, что вы описываете, верно. Я просто укажу, что это проблема, которая выходит за рамки использования сервисного работника. Это может легко случиться с долгоживущими одностраничными приложениями, которые пытаются лениво загрузить URL, который был заменен на стороне сервера новым развертыванием.

Существует некоторая общая информация о проблеме и потенциальных решениях, собранная по адресу * * * * *

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

Использование сервисного работника, работающего в первую очередь в кэш-памяти, может помочь защитить от сбоев при отложенной загрузке за счет задержкиобновляется до тех пор, пока вновь установленный работник службы не переместится с waiting на active. Как вы упомянули, лучшая практика заключается в том, чтобы показывать что-то в вашем пользовательском интерфейсе, чтобы пользователь знал, что обновления доступны, и как только он согласился принять эти обновления, postMessage() работнику службы поддержки, который сказал бы ему позвонить skipWaiting(),И, наконец, прослушивание события controllerchange и вызов window.location.reload() при его запуске.

...