PWA

什么是PWA

PWA全稱Progressive Web App霜医,即漸進(jìn)式WEB應(yīng)用。

1驳规、可以添加至主屏幕肴敛,點(diǎn)擊主屏幕圖標(biāo)可以實(shí)現(xiàn)啟動(dòng)動(dòng)畫以及隱藏地址欄
2、實(shí)現(xiàn)離線緩存功能吗购,即使用戶手機(jī)沒有網(wǎng)絡(luò)医男,依然可以使用一些離線功能
3、實(shí)現(xiàn)了消息推送

Manifest實(shí)現(xiàn)添加至主屏幕

<head>
  <title>Minimal PWA</title>
  <meta name="viewport" content="width=device-width, user-scalable=no" />
  <link rel="manifest" href="manifest.json" />
  <link rel="stylesheet" type="text/css" href="main.css">
  <link rel="icon" href="/e.png" type="image/png" />
</head>
{
  "name": "一個(gè)PWA示例", // 必填 顯示的插件名稱
  "short_name": "PWA Demo", // 可選  在APP launcher和新的tab頁(yè)顯示捻勉,如果沒有設(shè)置镀梭,則使用name
  "description": "The app that helps you understand PWA", //用于描述應(yīng)用
  "display": "standalone", // 定義開發(fā)人員對(duì)Web應(yīng)用程序的首選顯示模式。standalone模式會(huì)有單獨(dú)的
  "start_url": "/", // 應(yīng)用啟動(dòng)時(shí)的url
  "theme_color": "#313131", // 桌面圖標(biāo)的背景色
  "background_color": "#313131", // 為web應(yīng)用程序預(yù)定義的背景顏色踱启。在啟動(dòng)web應(yīng)用程序和加載應(yīng)用程序的內(nèi)容之間創(chuàng)建了一個(gè)平滑的過渡报账。
  "icons": [ // 桌面圖標(biāo),是一個(gè)數(shù)組
    {
      "src": "/public/img/logo.png",
      "sizes": "144x144",
      "type": "image/png"
    }]
}

Manifest參考文檔:https://developer.mozilla.org/zh-CN/docs/Web/Manifest

service worker實(shí)現(xiàn)離線緩存

image.png

特點(diǎn):

:運(yùn)行于瀏覽器后臺(tái)埠偿,不受頁(yè)面刷新的影響笙什,可以監(jiān)聽和截?cái)r作用域范圍內(nèi)所有頁(yè)面的 HTTP 請(qǐng)求。
:網(wǎng)站必須使用 HTTPS胚想。除了使用本地開發(fā)環(huán)境調(diào)試時(shí)(如域名使用 localhost)
:?jiǎn)为?dú)的作用域范圍,單獨(dú)的運(yùn)行環(huán)境和執(zhí)行線程
:不能操作頁(yè)面 DOM芽隆。但可以通過事件機(jī)制來處理
:事件驅(qū)動(dòng)型服務(wù)線程

瀏覽器支持情況

image.png

生命周期

image.png

消息推送

image.png

步驟一浊服、提示用戶并獲得他們的訂閱詳細(xì)信息
步驟二、將這些詳細(xì)信息保存在服務(wù)器上
步驟三胚吁、在需要時(shí)發(fā)送任何消息

不同瀏覽器需要用不同的推送消息服務(wù)器牙躺。以 Chrome 上使用 Google Cloud Messaging<GCM> 作為推送服務(wù)為例,第一步是注冊(cè) applicationServerKey(通過 GCM 注冊(cè)獲取)腕扶,并在頁(yè)面上進(jìn)行訂閱或發(fā)起訂閱孽拷。每一個(gè)會(huì)話會(huì)有一個(gè)獨(dú)立的端點(diǎn)(endpoint),訂閱對(duì)象的屬性(PushSubscription.endpoint) 即為端點(diǎn)值半抱。將端點(diǎn)發(fā)送給服務(wù)器后脓恕,服務(wù)器用這一值來發(fā)送消息給會(huì)話的激活的 Service Worker (通過 GCM 與瀏覽器客戶端溝通)膜宋。

捕獲用戶的點(diǎn)擊

 self.addEventListener('notificationclick', function (event) {
    console.log(event);
    event.notification.close(); //關(guān)閉通知
    event.waitUntil(
        // 獲取所有clients
        self.clients.matchAll().then(function (clients) {
            if (!clients || clients.length === 0) {
                return;
            }
            clients.forEach(function (client) {
                // 使用postMessage進(jìn)行通信
                client.postMessage(action);
                console.log("post a message");
            });
        })
    );
});

Service Worker與client通信

到目前為止,我們已經(jīng)可以順利得給用戶展示提醒炼幔,并且在用戶操作提醒后準(zhǔn)確捕獲到用戶的操作秋茫。然而,還缺最重要的一步——針對(duì)不同的操作乃秀,觸發(fā)不同的交互

 self.addEventListener('notificationclick', function (event) {
    event.waitUntil(
        // 獲取所有clients
        self.clients.matchAll().then(function (clients) {
            if (!clients || clients.length === 0) {
                return;
            }
            clients.forEach(function (client) {
                // 使用postMessage進(jìn)行通信
                client.postMessage(action);
                console.log("post a message");
            });
        })
    );
});

App Shell 模型

App Shell 架構(gòu)是構(gòu)建 PWA 應(yīng)用的一種方式肛著,它通常提供了一個(gè)最基本的 Web App 框架,包括應(yīng)用的頭部跺讯、底部枢贿、菜單欄等結(jié)構(gòu)。顧名思義刀脏,我們可以把它理解成應(yīng)用的一個(gè)「空殼」局荚,這個(gè)「空殼」僅包含頁(yè)面框架所需的最基本的 HTML 片段,CSS 和 javaScript火本,這樣一來危队,用戶重復(fù)打開應(yīng)用時(shí)就能迅速地看到 Web App 的基本界面,只需要從網(wǎng)絡(luò)中請(qǐng)求钙畔、加載必要的內(nèi)容茫陆。我們使用 Service Worker 對(duì) App Shell 做離線緩存,以便它可以在離線時(shí)正常展現(xiàn)擎析,達(dá)到類似 Native App 的體驗(yàn)簿盅。


image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市揍魂,隨后出現(xiàn)的幾起案子桨醋,更是在濱河造成了極大的恐慌,老刑警劉巖现斋,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件喜最,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡庄蹋,警方通過查閱死者的電腦和手機(jī)瞬内,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來限书,“玉大人虫蝶,你說我怎么就攤上這事【胛鳎” “怎么了能真?”我有些...
    開封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我粉铐,道長(zhǎng)疼约,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任秦躯,我火速辦了婚禮忆谓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘踱承。我一直安慰自己倡缠,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開白布茎活。 她就那樣靜靜地躺著昙沦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪载荔。 梳的紋絲不亂的頭發(fā)上盾饮,一...
    開封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音懒熙,去河邊找鬼丘损。 笑死,一個(gè)胖子當(dāng)著我的面吹牛工扎,可吹牛的內(nèi)容都是我干的徘钥。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼肢娘,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼呈础!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起橱健,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤而钞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后拘荡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體臼节,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年珊皿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了网缝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡亮隙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出垢夹,到底是詐尸還是另有隱情溢吻,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站促王,受9級(jí)特大地震影響犀盟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蝇狼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一阅畴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧迅耘,春花似錦贱枣、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至栖秕,卻和暖如春春塌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背簇捍。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工只壳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人暑塑。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓吼句,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親梯投。 傳聞我的和親對(duì)象是個(gè)殘疾皇子命辖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容