Я работаю над СПА с Vue. Я хотел бы перейти на нового сервисного работника, когда пользователь переходит на определенную страницу c. Момент сохранения для refre sh, потому что представление пользователя уже меняется (шаблон, обсуждаемый в этом видео: https://youtu.be/cElAoxhQz6w)
У меня иногда (нечасто) возникает проблема сервис-воркер не активируется при вызове skipWaiting. Вызов выполнен правильно, и даже в Chrome я получаю ответ, что текущий сервис-воркер останавливается (см. Анимированный GIF), однако тот же сервис-воркер начинает работать снова вместо ожидающего.
self.skipWaiting () не работает в Service Worker
Я использую Vue. js, но я не зависим от плагина pwa для службы -рабочий. Я использую плагин webpack для workbox.
Я отредактировал приведенный ниже пример кода, минимальный код, вероятно, плохо отражал проблему
В основном. js:
let sw = await navigator.serviceWorker.register("/service-worker.js", {
updateViaCache: "none",
});
let firstSw = false;
navigator.serviceWorker.addEventListener("controllerchange", () => {
// no need to refresh when the first sw controls the page, we solve this with clientsClaim
// this makes sure when multiple-tabs are open all refresh
if (!firstSw) {
window.location.reload();
}
});
sw.onupdatefound = () => {
const installingWorker = sw.installing;
installingWorker.onstatechange = async () => {
console.log("installing worker state-change: " + installingWorker.state);
if (installingWorker.state === "installed") {
if (navigator.serviceWorker.controller) {
firstSw = false;
// set the waiting service-worker in the store
// so we can update it and refresh the page on navigation
await store.dispatch("setWaitingSW", sw.waiting);
} else {
console.log("First sw available");
firstSw = true;
}
}
};
};
В роутере. js:
// after navigation to specific routes we check for a waiting service-worker.
router.afterEach(async (to) => {
if (to.name == "specificpage") {
let waitingSw = store.getters["getWaitingSW"];
if (waitingSw) {
waitingSw.postMessage("SKIP_WAITING");
// clean the store, because we might have changed our data model
await store.dispatch("cleanLocalForage");
}
}
});
В сервис-воркере. js:
self.addEventListener("message", event => {
if (event.data === "SKIP_WAITING") {
console.log("sw received skip waiting");
self.skipWaiting();
}
});