摘要:站點(diǎn)在同一瀏覽器中被訪問至少兩次,兩次訪問間隔至少為分鐘。詢問授權(quán)發(fā)送給后端存儲服務(wù)端向發(fā)送消息,同時帶上根據(jù)再下發(fā)給對應(yīng)的瀏覽器觸發(fā)的事件后續(xù)處理參考使用發(fā)送推送
關(guān)鍵特性
Web App Manifest – 在主屏幕添加app圖標(biāo),定義手機(jī)標(biāo)題欄顏色之類
App Shell – 先顯示APP的主結(jié)構(gòu),再填充主數(shù)據(jù),更快顯示更好體驗(yàn)
Service Worker - 緩存,離線開發(fā),以及地理位置信息處理等
Push Notifion - 消息推送
Service Worker運(yùn)行在瀏覽器端的代理服務(wù)器基本特點(diǎn)
事件驅(qū)動型服務(wù)線程
只能基于https或者localhost
可以控制頁面所發(fā)送網(wǎng)絡(luò)請求的處理方式
運(yùn)行在瀏覽器后臺的腳本,無法直接操作dom
生命周期 支持事件 register在主線程代碼中注冊
可以指定scope,通常指定到網(wǎng)站根路徑,能夠攔截所有的fetch事件
service worker 已經(jīng)被注冊過,瀏覽器會自動忽略上面的代碼
if ("serviceWorker" in navigator) { window.addEventListener("load", function () { navigator.serviceWorker.register("/sw.js", { scope: "/" }).then(function (reg) { // 注冊成功 console.log("success and scope: ", reg.scope); }).catch(function (err) { // 注冊失敗 console.log("failed: ", err); }); }); }installing
緩存文件installed/waiting
此狀態(tài)下,worker有效但尚未激活,它尚未納入 document的控制,確切來說是在等待著從當(dāng)前 worker 接手
sw.js發(fā)生了更新,但是頁面一直掛載中,沒有關(guān)閉或強(qiáng)制刷新,此時上一個版本的sw還在工作中,新的sw處于等待中
// 安裝階段跳過等待,直接進(jìn)入 active self.addEventListener("install", function (event) { event.waitUntil(self.skipWaiting()); }); self.addEventListener("activate", function (event) { event.waitUntil( Promise.all([ // 更新客戶端 self.clients.claim() ]) ); });activating/activated
緩存更新fetch
代理請求message
sw與主線程間的雙向通信,建立MessageChannel作為紐帶
// index.html navigator.serviceWorker.register("/service-worker.js", { scope: "/" }).then(function (reg) { // 創(chuàng)建一個 const channel = new MessageChannel(); // port1供主線程使用 channel.port1.onmessage = messageEvent => { console.log("來自sw的message", messageEvent.data); } const serviceWorker = reg.active; // port2指向sw if (serviceWorker) { serviceWorker.postMessage("index->sw", [channel.port2]); } }); // sw.js self.addEventListener("message", function (event) { console.log("來自index的message", event.data); // 通過port找到發(fā)送消息的client event.ports[0].postMessage("sw->index"); });更多的應(yīng)用場景
后臺數(shù)據(jù)同步
預(yù)取用戶可能需要的資源,比如相冊中的后面數(shù)張圖片
在后臺集中接收計算成本高的數(shù)據(jù)更新,比如地理位置和陀螺儀信息,多個頁面就可以利用同一組數(shù)據(jù)
Cache API只能緩存 GET 請求;
可以緩存屬于自己域下的請求,同時也可以緩存跨域的請求,不過無法對跨域請求的Request和Response進(jìn)行修改
緩存的更新需要自行實(shí)現(xiàn)
緩存不會過期,除非將手動刪除,大小有限制,LRU刪除
caches.open創(chuàng)建一個cache
cache.add/addAll支持傳入Requesturl
緩存資源,支持單個和數(shù)組
在cache.add內(nèi)部會自動去調(diào)用fetch取回request的請求結(jié)果,然后才是把response存入cache
cache.put相當(dāng)于cache.add的第二步,即fetch到response后存入cache
無法直接緩存跨域的請求,response.status會返回0
如果跨域的資源支持CORS,那么可以把request的mod改成cors
caches.matchcatch.match(request, { }).then(function(response) { })cache.delete 一些使用點(diǎn)
分段緩存,提高安裝成功率
先安裝非重要資源,再安裝重要資源
漸進(jìn)式緩存
對于在install時沒有緩存的資源,可以在用戶交互之后再緩存
優(yōu)先原則
對于靜態(tài)頁面,緩存優(yōu)先,減少請求
對于天氣類型應(yīng)用,先去fetch,服務(wù)器故障或者網(wǎng)絡(luò)不良時,折回本地緩存
Manifest一個基本的manifest.json
{ "short_name": "短名稱", "name": "這是一個完整名稱", "icon": [ { "src": "icon.png", "type": "image/png", "sizes": "48x48" } ], "start_url": "index.html" }
可以實(shí)現(xiàn)的功能
基本功能
自定義名稱
自定義圖標(biāo)
設(shè)置啟動網(wǎng)址
設(shè)置作用域
添加啟動畫面
設(shè)置顯示類型
指定顯示方向
設(shè)置主題色
應(yīng)用安裝橫幅
站點(diǎn)部署 manifest.json,該文件需配置如下屬性:
short_name (用于主屏幕顯示)
name (用于安裝橫幅顯示)
icons (其中必須包含一個 mime 類型為 image/png 的圖標(biāo)聲明)
start_url (應(yīng)用啟動地址)
display (必須為 standalone 或 fullscreen)
站點(diǎn)注冊 Service Worker。
站點(diǎn)支持 HTTPS 訪問。
站點(diǎn)在同一瀏覽器中被訪問至少兩次,兩次訪問間隔至少為 5 分鐘。
Web Push Notification PushManager詢問授權(quán)
發(fā)送subscription給后端存儲
服務(wù)端向FCM/GCM發(fā)送消息,同時帶上subscription
FCM根據(jù)subscription再下發(fā)給對應(yīng)的瀏覽器
觸發(fā)Service Worker的push事件
后續(xù)處理
參考https://segmentfault.com/a/11...
https://x5.tencent.com/tbs/gu...
https://lavas.baidu.com/pwa/o...
http://www.zhangxinxu.com/wor...
https://zhuanlan.zhihu.com/p/...
https://github.com/delapuente...
https://github.com/SangKa/PWA...
使用Service Worker發(fā)送Push推送
https://fed.renren.com/2017/1...
https://pwa.rocks/
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/99108.html
摘要:是一個注冊在指定源和路徑下的事件驅(qū)動??梢蕴峁┯行в行У碾x線體驗(yàn),攔截網(wǎng)絡(luò)請求。出于安全原因,要求必須在下才能運(yùn)行。返回一個對象,的結(jié)果是對象值對象組成的數(shù)組。當(dāng)事件的處理程序執(zhí)行完畢后,可以認(rèn)為安裝完成了。 在前端越來越重的這個時代,頁面加載速度成為了一個重要的指標(biāo)。對于這個問題,業(yè)界也有一些解決方案。 瀏覽器緩存、協(xié)議緩存、強(qiáng)緩存 懶加載(首屏) CDN 多域名突破下載并發(fā)限制。...
摘要:是一個注冊在指定源和路徑下的事件驅(qū)動??梢蕴峁┯行в行У碾x線體驗(yàn),攔截網(wǎng)絡(luò)請求。出于安全原因,要求必須在下才能運(yùn)行。返回一個對象,的結(jié)果是對象值對象組成的數(shù)組。當(dāng)事件的處理程序執(zhí)行完畢后,可以認(rèn)為安裝完成了。 在前端越來越重的這個時代,頁面加載速度成為了一個重要的指標(biāo)。對于這個問題,業(yè)界也有一些解決方案。 瀏覽器緩存、協(xié)議緩存、強(qiáng)緩存 懶加載(首屏) CDN 多域名突破下載并發(fā)限制。...
背景 隨著前端技術(shù)日新月異地快速發(fā)展,web應(yīng)用功能和體驗(yàn)也逐漸發(fā)展到可以和原生應(yīng)用媲美的程度,前端緩存技術(shù)的應(yīng)用對這起到了不可磨滅的貢獻(xiàn),因此想一探前端的緩存技術(shù),這篇文章主要會介紹在日常開發(fā)中比較少接觸的IndexedDB IndexedDB 什么是IndexedDB IndexedDB簡單理解就是前端數(shù)據(jù)庫,提供了一種在用戶瀏覽器中持久存儲數(shù)據(jù)的方法,但是和前端關(guān)系型數(shù)據(jù)不同的是,Index...
摘要:現(xiàn)在表示公開支持。一旦安裝完成,如果注冊的沒有變化,則顯示為已激活的生命周期結(jié)束。一旦安裝這步完成,便會激活,并控制在其范圍內(nèi)的一切。目前還在草案狀態(tài),僅火狐和谷歌瀏覽器支持此特性。 PWA初探 什么是PWA PWA(Progressive Web Apps):漸進(jìn)式 Web app PWA 旨在增強(qiáng) Web 體驗(yàn),能讓用戶在訪問一個web的時候感覺在使用app一樣。 PWA可以看作是...
摘要:當(dāng)你將一系列的特性選擇完畢后最后回提示你是否將已選項(xiàng)保存成一個快速將來可復(fù)用的當(dāng)你選擇保存時,被保存的將會存在用戶的目錄下一個名為的文件里。 準(zhǔn)備工作 npm install -g @vue/cli or yarn global add @vue/cli 安裝需要Node.js8.9以上版本,安裝完成后可以通過vue --version來驗(yàn)證是否安裝成功 項(xiàng)目創(chuàng)建 vue create...
閱讀 3214·2021-11-25 09:43
閱讀 3421·2021-11-11 16:54
閱讀 847·2021-11-02 14:42
閱讀 3775·2021-09-30 09:58
閱讀 3682·2021-09-29 09:44
閱讀 1294·2019-08-30 15:56
閱讀 2111·2019-08-30 15:54
閱讀 2998·2019-08-30 15:43