久久国产精品一区二区三区四区,久色婷婷小香蕉久久,国产日韩欧美在线播放不卡,另类av一区二区

[科普] Service Worker 入門指南
來源:Tecvan    時間:2022-04-26 10:04:03
Service Worker 簡介

Service Workers 本質上是一種能在瀏覽器后臺運行的獨立線程,它能夠在網頁關閉后持續運行,能夠攔截網絡請求并根據網絡是否可用來采取適當的動作、更新來自服務器的的資源,從而實現攔截和加工網絡請求、消息推送、靜默更新、事件同步等一系列功能,是 PWA 應用的核心技術之一。

與普通 JS 運行環境相比,Service Workers 有如下特點:

無法直接訪問 DOM , 可通過 postMessage 發送消息與頁面通信。能夠控制頁面發送網絡請求。必須在 HTTPS 協議下運行。開發過程中可以通過 locakhost 使用 service worker。

本文將從應用角度,簡單匯總下 Service Workers 幾個核心概念,包括:API、生命周期、waitUntil 機制、調試等。

生命周期

Service Worker 的生命周期完全獨立于網頁。生命周期 (install -> waiting -> activate -> fetch):

其中, install 事件是 Service Worker 獲取的第一個事件,并且只發生一次。

主要邏輯 & APIregisterinstallactivatefetchskipWaiting

// register if ("serviceWorker" in navigator) { // 由于 127.0.0.1:8000 是所有測試 Demo 的 host // 為了防止作用域污染,將安裝前注銷所有已生效的 Service Worker navigator.serviceWorker.getRegistrations() .then(regs => { for (let reg of regs) { reg.unregister() } navigator.serviceWorker.register("./sw.js") }) }

// sw.jsconsole.log("service worker 注冊成功")self.addEventListener("install", () => { // 安裝回調的邏輯處理 console.log("service worker 安裝成功")})self.addEventListener("activate", () => { // 激活回調的邏輯處理 console.log("service worker 激活成功")})self.addEventListener("fetch", event => { console.log("service worker 抓取請求成功: " + event.request.url)})「waitUntil 機制」

參考:https://developer.mozilla.org/zh-CN/docs/Web/API/ExtendableEvent/waitUntil。

ExtendableEvent.waitUntil() 方法告訴事件分發器該事件仍在進行。這個方法也可以用于檢測進行的任務是否成功。在服務工作線程中,這個方法告訴瀏覽器事件一直進行,直至 promise resolve,瀏覽器不應該在事件中的異步操作完成之前終止服務工作線程。

「skipWaiting」

Service Worker 一旦更新,需要等所有的終端都關閉之后,再重新打開頁面才能激活新的 Service Worker,這個過程太復雜了。通常情況下,開發者希望當 Service Worker 一檢測到更新就直接激活新的 Service Worker。如果不想等所有的終端都關閉再打開的話,只能通過 skipWaiting 的方法了。

Service Worker 在全局提供了一個 skipWaiting() 方法,skipWaiting() 在 waiting 期間調用還是在之前調用并沒有什么不同。一般情況下是在 install 事件中調用它。

「clients.claim() 方法」

如果使用了 skipWaiting 的方式跳過 waiting 狀態,直接激活了 Service Worker,可能會出現其他終端還沒有受當前終端激活的 Service Worker 控制的情況,切回其他終端之后,Service Worker 控制頁面的效果可能不符合預期,尤其是如果 Service Worker 需要動態攔截第三方請求的時候。

為了保證 Service Worker 激活之后能夠馬上作用于所有的終端,通常在激活 Service Worker 后,通過在其中調用 self.clients.claim() 方法控制未受控制的客戶端。self.clients.claim() 方法返回一個 Promise,可以直接在 waitUntil() 方法中調用,如下代碼所示:

self.addEventListener("activate", event => { event.waitUntil( self.clients.claim() .then(() => { // 返回處理緩存更新的相關事情的 Promise }) )})如何處理 Service Worker 的更新如果目前尚未有活躍的 SW ,那就直接安裝并激活。如果已有 SW 安裝著,向新的 swUrl 發起請求,獲取內容和和已有的 SW 比較。如沒有差別,則結束安裝。如有差別,則安裝新版本的 SW(執行 install 階段),之后令其等待(進入 waiting 階段)。如果老的 SW 控制的所有頁面 「全部關閉」,則老的 SW 結束運行,轉而激活新的 SW(執行 activated 階段),使之接管頁面。方法一:skipWaiting

問題:同一個頁面,前半部分的請求是由 sw.v1.js 控制,而后半部分是由 sw.v2.js 控制。這兩者的不一致性很容易導致問題,甚至網頁報錯崩潰。

方法二:skipWaiting + 刷新

let refreshing = falsenavigator.serviceWorker.addEventListener("controllerchange", () => { if (refreshing) { return } refreshing = true; window.location.reload();});

問題:毫無征兆的刷新頁面的確不可接受,影響用戶體驗。

方法三:給用戶一個提示

大致的流程是:

瀏覽器檢測到存在新的(不同的)SW 時,安裝并讓它等待,同時觸發 updatefound 事件。我們監聽事件,彈出一個提示條,詢問用戶是不是要更新 SW。如果用戶確認,則向處在等待的 SW 發送消息,要求其執行 skipWaiting 并取得控制權。因為 SW 的變化觸發 controllerchange 事件,我們在這個事件的回調中刷新頁面即可。

問題:

弊端一:過于復雜。弊端二:刷新邏輯的實現必須通過 JS 完成更新。如何調試

為了更熟練的運用 Chrome Devtools 調試 Service Worker,首先需要熟悉以下這些選項:

「Offline」:復選框可以將 DevTools 切換至離線模式。它等同于 Network 窗格中的離線模式。「Update on reload」:復選框可以強制 Service Worker 線程在每次頁面加載時更新。「Bypass for network」:復選框可以繞過 Service Worker 線程并強制瀏覽器轉至網絡尋找請求的資源。「Update」:按鈕可以對指定的 Service Worker 線程執行一次性更新。「Push」:按鈕可以在沒有負載的情況下模擬推送通知。「Sync」:按鈕可以模擬后臺同步事件。「Unregister」:按鈕可以注銷指定的 Service Worker 線程。「Source」:告訴當前正在運行的 Service Worker 線程的安裝時間,鏈接是 Service Worker 線程源文件的名稱。點擊鏈接會將定向并跳轉至 Service Worker 線程來源。「Status」:告訴 Service Worker 線程的狀態。此行上的數字指示 Service Worker 線程已被更新的次數。如果啟用 update on reload 復選框,接下來會注意到每次頁面加載時此數字都會增大。在狀態旁邊會看到 start 按鈕(如果 Service Worker 線程已停止)或 stop 按鈕(如果 Service Worker 線程正在運行)。Service Worker 線程設計為可由瀏覽器隨時停止和啟動。使用 stop 按鈕明確停止 Service Worker 線程可以模擬這一點。停止 Service Worker 線程是測試 Service Worker 線程再次重新啟動時的代碼行為方式的絕佳方法。它通??梢越沂居捎趯Τ掷m全局狀態的不完善假設而引發的錯誤。「Clients」:告訴 Service Worker 線程作用域的原點。如果已啟用 show all 復選框,focus 按鈕將非常實用。在此復選框啟用時,系統會列出所有注冊的 Service Worker 線程。如果這時候點擊正在不同標簽中運行的 Service Worker 線程旁的 focus 按鈕,Chrome 會聚焦到該標簽。總結完整流程應用場景

基于service worker 可以實現攔截和處理網絡請求、消息推送、靜默更新、事件同步等服務。

離線緩存:配合 CacheStorage 可以將應用中不變化的資源或者很少變化的資源長久的存儲在用戶端,提升加載速度、降低流量消耗、降低服務器壓力,提高請求速度,讓用戶體驗更加絲滑。消息推送:激活沉睡的用戶,推送即時消息、公告通知,激發更新等。如web資訊客戶端、web即時通訊工具、h5游戲等運營產品。事件同步:確保web端產生的任務即使在用戶關閉了web頁面也可以順利完成。如web郵件客戶端、web即時通訊工具等。定時同步:周期性的觸發Service Worker腳本中的定時同步事件,可借助它提前刷新緩存內容。結合CacheStorage、 Push API 和 Notification API。

參考鏈接:

https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API。https://juejin.cn/post/6844903792522035208。https://www.simicart.com/blog/pwa-service-worker/。

關鍵詞: 生命周期 發送消息 用戶體驗 刷新頁面

上一篇:

下一篇:

久久国产精品一区二区三区四区,久色婷婷小香蕉久久,国产日韩欧美在线播放不卡,另类av一区二区
一区二区三区国产| 黄色成人av在线| 亚洲视频在线观看| 欧美美女bbbb| 亚洲精品在线观看视频| 销魂美女一区二区三区视频在线| 亚洲欧洲偷拍精品| 久久久久久久久蜜桃| 夜夜嗨av一区二区三区四区| 久久久精品午夜少妇| 欧美亚洲免费| 国产日韩一区二区三区在线播放| 国产精品va在线播放我和闺蜜| 国产精品高潮视频| 亚洲图片你懂的| 国产欧美日韩在线| 亚洲国产日韩欧美一区二区三区| 亚洲精品日韩精品| 国产精品三上| 国产午夜精品一区理论片飘花| 日韩视频在线观看免费| 激情久久一区| 蜜桃久久精品乱码一区二区| 美女999久久久精品视频| 久久蜜臀精品av| 国产一区二区三区自拍| 国产在线视频欧美一区二区三区| 久久久久久久久久久久久久一区| 亚洲私人黄色宅男| 99精品免费视频| 国产精品久久国产精品99gif| 久久天堂av综合合色| 一区二区三区偷拍| 国产女主播一区二区三区| 欧美一区成人| 国产精品视频99| 国产精品系列在线| 久久精品国产亚洲一区二区| 欧美午夜精品久久久久久超碰| 欧美一区二区在线视频| 亚洲精品孕妇| 久久综合一区二区三区| 国产精品日韩在线| 国产精品v欧美精品v日韩精品| 亚洲欧洲视频| 欧美一级在线亚洲天堂| 亚洲国产黄色| 欧美肥婆bbw| 在线观看中文字幕亚洲| 久久精品国产亚洲一区二区| 亚洲男女自偷自拍图片另类| 国外成人在线视频网站| 国产欧美一区二区三区在线老狼| 欧美另类亚洲| 欧美精品二区三区四区免费看视频| 国产精品久久久久久久午夜片| 国产日韩精品一区二区三区在线| 亚洲第一黄色网| 1000精品久久久久久久久| 欧美亚洲免费电影| 一区二区高清在线| 国产亚洲激情| 狠狠狠色丁香婷婷综合激情| 亚洲精品在线免费观看视频| 国产婷婷成人久久av免费高清| 欧美精品三级| 国产片一区二区| 国产综合久久久久久鬼色| 欧美激情a∨在线视频播放| 亚洲精品欧美日韩| 国产精品99久久久久久白浆小说| 久久夜色精品国产| 国产麻豆成人精品| 欧美高清hd18日本| 日韩网站在线观看| 中文欧美字幕免费| 欧美一级二级三级蜜桃| 亚洲黄色大片| 亚洲欧美日韩在线播放| 一区二区三区国产精华| 一区二区三区回区在观看免费视频| 极品裸体白嫩激情啪啪国产精品| 亚洲一区二区视频在线| 中日韩男男gay无套| 国产主播一区二区三区四区| 亚洲欧美一区二区在线观看| 久久久久女教师免费一区| 国产嫩草一区二区三区在线观看| 国产一区二区三区成人欧美日韩在线观看| 欧美日韩美女| 亚洲一区在线直播| 在线欧美视频| 国产精品久久婷婷六月丁香| 亚洲激情另类| 亚洲婷婷综合久久一本伊一区| 国产欧美日本| 中国亚洲黄色| 亚洲精品日日夜夜| 欧美中文字幕在线观看| 91久久精品美女高潮| 欧美日韩综合网| 国产精品jvid在线观看蜜臀| 午夜精品在线观看| 欧美一区二区精品久久911| 激情成人在线视频| 在线不卡欧美| 国产三级欧美三级| 99在线热播精品免费99热| 欧美成人精品激情在线观看| 国产精品一区免费观看| 国产精品视频在线观看| 久久不见久久见免费视频1| 欧美主播一区二区三区美女 久久精品人| 亚洲日本一区二区| 欧美精品免费播放| 欧美 日韩 国产一区二区在线视频| 国产视频一区在线观看| 亚洲国产欧美在线人成| 国产精品午夜视频| 国产亚洲欧美另类中文| 国产一区香蕉久久| 久久精品亚洲热| 国产精品国色综合久久| 国产精品久久久久毛片软件| 欧美激情亚洲视频| 欧美一区二区三区成人| 国产精品欧美日韩一区二区| 欧美xxx在线观看| 99国产精品视频免费观看一公开| 欧美日韩国产欧| 日韩午夜中文字幕| 欧美日韩国产电影| 亚洲精品美女| 欧美一区二区在线| 狠狠色丁香久久综合频道| 亚洲欧美春色| 亚洲精品国产精品国自产观看浪潮| 欧美与黑人午夜性猛交久久久| 国产精品久久久久久久久久三级| 国产精品久久久久久久久免费樱桃| 亚洲——在线| 亚洲第一色中文字幕| 韩国成人精品a∨在线观看| 91久久国产综合久久91精品网站| 欧美性大战久久久久久久蜜臀| 国产一区二区在线免费观看| 久久久国产视频91| 久久久亚洲精品一区二区三区| 国产精品任我爽爆在线播放| 国产一区二区三区四区三区四| 欧美日韩中文字幕在线视频| 亚洲国产日韩美| 韩国视频理论视频久久| 国产精品家庭影院| 欧美国产日本高清在线| 欧美日韩亚洲一区二区三区在线| 久久久久久久成人| 久久久久91| 久久精品人人| 日韩一级网站| 国产欧美一区二区三区在线老狼| 狠狠入ady亚洲精品| 亚洲欧美一区二区三区极速播放| 久久综合网络一区二区| 99视频在线精品国自产拍免费观看| 男人插女人欧美| 欧美体内谢she精2性欧美| 国产日韩欧美日韩大片| 美女啪啪无遮挡免费久久网站| 欧美一区二区私人影院日本| 在线播放中文一区| 亚洲欧美三级伦理| 模特精品在线| 欧美一区二区高清| 欧美怡红院视频| 一二三四社区欧美黄| 欧美成人免费观看| 国产区欧美区日韩区| 欧美人妖在线观看| 午夜精品剧场| 激情偷拍久久| 欧美国产国产综合| 国产精品99一区| 欧美区国产区| 亚洲精品免费在线观看| 久久精品123| 日韩亚洲综合在线| 国产色产综合色产在线视频| 欧美精品色网| 国产精品久久久久aaaa| 欧美日韩精品综合在线| 欧美一二三区精品| 亚洲国产精品va在线看黑人动漫| 亚洲午夜精品| 欧美四级在线| 欧美日韩三区四区| 久久影视精品| 在线 亚洲欧美在线综合一区| 精品51国产黑色丝袜高跟鞋| 一区二区冒白浆视频|