亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Service Worker 更新事件觸發器

Service Worker 更新事件觸發器

慕村225694 2021-12-12 10:08:06
按照此鏈接https://github.com/deanhume/pwa-update-available,我正在嘗試實施服務工作者更新,但我面臨諸如事件更新未觸發之類的問題,我認為這與我的應用程序設計,基本上是一個 SPA,意味著我總是在 index.html 上,它的行為類似于 app-shell,我正在推送內容區域中的內容,具體取決于單擊的按鈕。只有其他頁面是 login/index.htmlapp.js 安裝/更新 service worker 的內容是這樣的:let newWorker;          function showUpdateBar() {            let snackbar = document.getElementById('snackbar');            snackbar.className = 'show';          }          // The click event on the pop up notification          document.getElementById('reload').addEventListener('click', function(){            newWorker.postMessage({ action: 'skipWaiting' });          });          if ('serviceWorker' in navigator) {            navigator.serviceWorker.register('/pwa/sw.js').then(reg => {              console.log( 'ServiceWorker registration successful with scope: ', registration.scope );              reg.addEventListener('updatefound', () => {                // A wild service worker has appeared in reg.installing!                newWorker = reg.installing;                newWorker.addEventListener('statechange', () => {                  // Has network.state changed?                  switch (newWorker.state) {                    case 'installed':                      if (navigator.serviceWorker.controller) {                        // new update available                        showUpdateBar();                      }                      // No update available                      break;                  }                });              });            });            let refreshing;            navigator.serviceWorker.addEventListener('controllerchange', function () {              if (refreshing) return;              window.location.reload();              refreshing = true;            });          }  所以基本上我面臨的問題是觸發更新,當我將 v28 等版本號更改為 v29 并重新加載頁面時,我收到提示,但即使我注銷、登錄或退出也沒有收到提示并重新打開應用程序。我該如何解決這個問題?
查看完整描述

1 回答

?
白豬掌柜的

TA貢獻1893條經驗 獲得超10個贊

您只有在瀏覽器中加載 index.html 時才會觸發服務工作者注冊例程。這是唯一一次執行代碼。

除非你定期輪詢你的服務器或者可能打開一個 websocket(為此有點昂貴)你不會知道是否有新的 service worker 可用。您可以讓用戶注冊推送通知....為此太頭疼了。

因此,每隔幾小時或幾天就匯集一次服務器以進行更新。

如果有更新,您可以觸發更新例程。

我會將輪詢邏輯放在實際的 Service Worker 代碼中,以使其遠離 UI,如果您是 SPA,那么您已經鎖定了 UI 線程,哈哈。

有很多方法可以給這只貓剝皮,setTimeout(..., {lots of seconds}),當服務工作者從休眠中醒來時,等等。

如果您可以發出 HEAD 請求,將網絡流量保持在最低水平。

如果有更新,您可以向 UI 發布消息以更新 Service Worker。

這不是我所說的瑣碎代碼。我做了類似的事情來保持我緩存的資產是最新的,所以我一直在那里:)


查看完整回答
反對 回復 2021-12-12
  • 1 回答
  • 0 關注
  • 230 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號