Добавьте приглашение "Обновление доступно, пожалуйста, обновите" в PWABuilder Cache-first сервисный работник
Сначала я делаю свой сайт в автономном режиме с работником службы. Я хочу предложить пользователю обновить страницу, когда будет доступно обновленное содержимое. Я хочу, чтобы пользователи знали, что они просматривают устаревшие материалы, чтобы они могли получать новейшее содержимое, обновляя страницу.
Эти реализации являются хорошим примером:
Подход № 3 в этой статье.
Я использую кеш-сервисный работник, предоставленный PWABuilder. Работает хорошо, но не предлагает пользователю доступных обновлений.
Я пытался скопировать код из статей выше, но не смог заставить его работать.
Вот репо сервисного работника, которого я сейчас использую.
Код, который я пытаюсь добавить в сценарий рабочего сервиса:
addEventListener('message', messageEvent => {
if (messageEvent.data === 'skipWaiting') return skipWaiting();
});
Скрипт, который я пытаюсь добавить на веб-страницу:
/ reload once when the new Service Worker starts activating
var refreshing;
navigator.serviceWorker.addEventListener('controllerchange',
function() {
if (refreshing) return;
refreshing = true;
window.location.reload();
}
);
function promptUserToRefresh(reg) {
// this is just an example
// don't use window.confirm in real life; it's terrible
if (window.confirm("New version available! OK to refresh?")) {
reg.waiting.postMessage('skipWaiting');
}
}
listenForWaitingServiceWorker(reg, promptUserToRefresh);
Если я просто добавлю этот код к работнику сервиса и веб-странице с уважением, работник сервиса будет работать нормально. Но подсказка обновления не работает.
Я получаю эту ошибку в консоли:
Uncaught ReferenceError: reg is not defined
at (index):231
1 ответ
Что ж, ваша проблема не обязательно связана с работниками сервиса:). Если вы внимательно посмотрите на сообщение об ошибке (показано в консоли), вы увидите, что оно ясно говорит о том, что переменная с именем reg не определена. Другими словами, где-то в вашем коде вы пытаетесь сослаться на переменную с именем "reg", но "reg" там не существует.
Кажется, что код, вставленный в ваш вопрос, это еще не все, но я подозреваю, что проблема заключается здесь:
listenForWaitingServiceWorker(reg, promptUserToRefresh);
В любом случае, сообщение об ошибке говорит вам, что проблема возникает в строке 231 в вашем HTML-файле, так что проверьте это.