У меня есть PWA, созданный с помощью Aurelia и скомпилированный с Webpack, с помощью плагина Workbox, который генерирует рабочий файл sw.js
.Я пытаюсь сделать уведомление пользователя "Новая версия доступным", чтобы пользователь мог активировать новую версию при нажатии на ссылку в приложении.
Я успешно загружаю и устанавливаю новую версию в фоновом режиме.и даже обнаружив, что новая версия готова.Тем не менее, когда я пытаюсь вызвать метод skipWaiting()
для принудительного обновления страницы с новой версией, происходит сбой, потому что, очевидно, у меня нет нужной области или объекта.
Основная проблема, вероятно,что я не могу редактировать фактический sw.js, потому что он генерируется автоматически.Все примеры предлагают использовать self.skipWaiting();
, но я не знаю, как получить доступ к этому объекту.
webpack.config.js
new WorkboxPlugin({
globDirectory: './dist',
globPatterns: ['**/*.{html,js,css,woff,woff2,ttf,svg,eot,jpg}'],
swDest: './dist/sw.js',
clientsClaim: true,
skipWaiting: false, // because I want to notify the user and wait for response
}),
index.ejs
<script>
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/sw.js')
.then(reg => {
// make the registration available globally, for access within app
window.myServiceWorkerReg = reg;
// Check for update on loading the app (is this necessary?)
return reg.update();
})
.catch(console.error);
}
</script>
app.js
activate() {
// listener for service worker update
this.swReg = window.myServiceWorkerReg;
console.warn('[app.js] ACTIVATE.', this.swReg);
this.swReg.addEventListener('updatefound', () => {
// updated service worker found in reg.installing!
console.warn('[app.js] UPDATE FOUND.', this.swReg);
const newWorker = this.swReg.installing;
newWorker.addEventListener('statechange', () => {
// has the service worker state changed?
console.warn('[app.js] STATE HAS CHANGED.', newWorker, newWorker.state);
if (newWorker.state === 'installed') {
// New service worker ready.
// Notify user; callback for user request to load new app
myUserMessage({ clickToActivate: () => {
// reload fresh copy (do not cache)
console.warn('[app.js] Post Action: skipWaiting.');
// this.swReg.postMessage({ action: 'skipWaiting' });
// THIS IS THE LINE THAT FAILS
this.swReg.skipWaiting();
}});
}
});
});
}
Все отлично работает, кроме последней строки (this.swReg.skipWaiting();
).Кто-нибудь еще использовал плагин webpack + workbox и получил пропуск skipWaiting в результате взаимодействия с пользователем?