兩小時(shí)讓你的網(wǎng)站升級(jí)為Progress Web App

PWA,Progressive Web Apps 是結(jié)合了 web 和 原生應(yīng)用中最好功能的一種體驗(yàn)。它能夠快速地加載,即使在比較糟糕的網(wǎng)絡(luò)環(huán)境下瞪浸,能夠推送相關(guān)消息, 也可以像原生應(yīng)用那樣添加至主屏齐蔽,能夠有全屏瀏覽的體驗(yàn)赡茸。

為什么你的網(wǎng)站應(yīng)該升級(jí)為PWA

  • 漸進(jìn)增強(qiáng)- 能夠讓每一位用戶使用,無論用戶使用什么瀏覽器蓖谢,因?yàn)樗鞘冀K以漸進(jìn)增強(qiáng)為原則捂蕴。

  • 響應(yīng)式用戶界面- 適應(yīng)任何環(huán)境:桌面電腦譬涡,智能手機(jī),筆記本電腦启绰,或者其他設(shè)備昂儒。

  • 不依賴網(wǎng)絡(luò)連接- 通過 service workers 可以在離線或者網(wǎng)速極差的環(huán)境下工作。

  • 類原生應(yīng)用- 有像原生應(yīng)用般的交互和導(dǎo)航給用戶原生應(yīng)用般的體驗(yàn)委可,因?yàn)樗墙⒃?app shell model 上的。

  • 持續(xù)更新- 受益于 service worker 的更新進(jìn)程腊嗡,應(yīng)用能夠始終保持更新着倾。

  • 安全- 通過 HTTPS 來提供服務(wù)來防止網(wǎng)絡(luò)窺探,保證內(nèi)容不被篡改燕少。

  • 可發(fā)現(xiàn)- 得益于 W3C manifests 元數(shù)據(jù)和 service worker 的登記卡者,讓搜索引擎能夠找到 web 應(yīng)用。

  • 再次訪問- 通過消息推送等特性讓用戶再次訪問變得容易客们。

  • 可安裝- 允許用戶保留對(duì)他們有用的應(yīng)用在主屏幕上崇决,不需要通過應(yīng)用商店。

  • 可連接性- 通過 URL 可以輕松分享應(yīng)用底挫,不用復(fù)雜的安裝即可運(yùn)行恒傻。

基于應(yīng)用外殼的架構(gòu)

什么是應(yīng)用外殼(App Shell)

App Shell是應(yīng)用的用戶界面所需的最基本的 HTML、CSS 和 JavaScript建邓,也是一個(gè)用來確保應(yīng)用有好多性能的組件盈厘。它的首次加載將會(huì)非常快官边,加載后立刻被緩存下來沸手。這意味著應(yīng)用的外殼不需要每次使用時(shí)都被下載,而是只加載需要的數(shù)據(jù)注簿。

應(yīng)用外殼的結(jié)構(gòu)分為應(yīng)用的核心基礎(chǔ)組件和承載數(shù)據(jù)的 UI契吉。所有的 UI 和基礎(chǔ)組件都使用一個(gè) service worker 緩存在本地,因此在后續(xù)的加載中 Progressive Web App 僅需要加載需要的數(shù)據(jù)诡渴,而不是加載所有的內(nèi)容捐晶。

外殼設(shè)計(jì)核心組件?

  • 需要立刻顯示什么在屏幕上?
  • 我們的應(yīng)用需要那些關(guān)鍵的 UI 組件玩徊?
  • 應(yīng)用外殼需要那些資源租悄?比如圖片,JavaScript恩袱,樣式表等等泣棋。

兩小時(shí)讓你的網(wǎng)站成為 PWA

需要解決的問題:

1.可以在離線或弱網(wǎng)速情況下加載應(yīng)用
2.提示用戶添加快捷方式到主屏
3.安裝過的app啟動(dòng)時(shí)使用自定義動(dòng)畫
4.地址欄匹配品牌顏色

第一步:?jiǎn)?dòng)serviceWork

1.把下面的代碼添加在頁面尾部script標(biāo)簽里

if('serviceWorker' in navigator){

navigator.serviceWorker
.register('/service-worker.js')
.then(function(){console.log('Service Worker Registered');})
.catch(function(err){
  console.log('ServiceWorker registration failed:',err);
});

}

2.緩存站點(diǎn)的資源,創(chuàng)建service-worker.js文件畔塔,放在網(wǎng)站根目錄潭辈。該文件可以使用sw-precache.js生成鸯屿。

當(dāng) service worker 被注冊(cè)以后,當(dāng)用戶首次訪問頁面的時(shí)候一個(gè) install 事件會(huì)被觸發(fā)把敢。在這個(gè)事件的回調(diào)函數(shù)中寄摆,我們能夠緩存所有的應(yīng)用需要再次用到的資源。

var cacheName = 'site-cache';
var filesToCache = [
'/',
'/style.css',
'/js/production.min.js'
];

self.addEventListener('install', function(e) {
  console.log('[ServiceWorker] Install');
  e.waitUntil(
    caches.open(cacheName).then(function(cache) {
      console.log('[ServiceWorker] Caching app shell');
      return cache.addAll(filesToCache);
    })
  );
});

從緩存中加載 app shell

self.addEventListener('fetch', function(e) {  
  console.log('[ServiceWorker] Fetch', e.request.url);  
  e.respondWith(  
    caches.match(e.request).then(function(response) {  
      //return response || fetch(e.request);  
      if(response){
        return response
      }
      var fetchRequest = event.request.clone();
      return fetch(fetchRequest).then(
        function(response){
            if(!response || response.status !==200 || response.type !=='basic' ){
                  return response;
            }
            var responseToCache = response.clone();
            caches.open(cacheName)
                .then(function(cache){
                    cache.put(event.request, responseToCache);
                  });
            return response;
        }
      )
    }) 
  );  
});

第二步:添加 Web App Manifest

manifest.json 文件來聲明一個(gè)應(yīng)用程序清單
web 應(yīng)用程序清單是一個(gè)簡(jiǎn)單的 JSON 文件修赞,它給你了控制你的應(yīng)用如何出現(xiàn)在用戶期待出現(xiàn)的地方(比如用戶手機(jī)主屏幕)婶恼,這直接影響到用戶能啟動(dòng)什么,以及更重要的柏副,用戶如何啟動(dòng)它勾邦。

使用 web 應(yīng)用程序清單,你的應(yīng)用可以:

  • 能夠真實(shí)存在于用戶主屏幕上
    -在 Android 上能夠全屏啟動(dòng)割择,不顯示地址欄
  • 控制屏幕方向已獲得最佳效果
  • 定義啟動(dòng)畫面眷篇,為你的站點(diǎn)定義主題
  • 追蹤你的應(yīng)用是從主屏幕還是 URL 啟動(dòng)的

把manifest.json文件添加到域名根目錄,JSON文件像下面的樣子:

{
  "name": "chebada",//app名稱
  "short_name": "買車票荔泳,就用XXX", 
  "icons": [ //添加屏幕上的icon
    {
      "src": "img/jg-launcher-icon-1x.jpg",
      "type": "image/png",
      "sizes": "48x48"
    },
    {
      "src": "img/jg-launcher-icon-2x.jpg",
      "type": "image/png",
      "sizes": "96x96"
    },
    {
      "src": "img/jg-launcher-icon-4x.jpg",
      "type": "image/png",
      "sizes": "192x192"
    }
  ],
  "start_url": "/?utm_source=homescreen", //啟動(dòng)訪問路徑
  "background_color": "#23507a",//設(shè)備背景顏色
  "display": "standalone",
  "theme_color": "#23507a" // 瀏覽器theme顏色
}

Manifest詳細(xì)文檔

告訴瀏覽器你的程序清單文件

將這段代碼添加至你的 index.html 的 <head> 部分:

<link rel="manifest" href="/manifest.json">

至此一個(gè)PWA應(yīng)用就完成了蕉饼,可以安裝瀏覽器插件 Lighthouse測(cè)試一下性能。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末玛歌,一起剝皮案震驚了整個(gè)濱河市昧港,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌沾鳄,老刑警劉巖慨飘,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異译荞,居然都是意外死亡瓤的,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門吞歼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來圈膏,“玉大人,你說我怎么就攤上這事篙骡』ぃ” “怎么了?”我有些...
    開封第一講書人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵糯俗,是天一觀的道長尿褪。 經(jīng)常有香客問我,道長得湘,這世上最難降的妖魔是什么杖玲? 我笑而不...
    開封第一講書人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮淘正,結(jié)果婚禮上摆马,老公的妹妹穿的比我還像新娘臼闻。我一直安慰自己,他們只是感情好囤采,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開白布述呐。 她就那樣靜靜地躺著,像睡著了一般蕉毯。 火紅的嫁衣襯著肌膚如雪乓搬。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,698評(píng)論 1 305
  • 那天恕刘,我揣著相機(jī)與錄音缤谎,去河邊找鬼。 笑死褐着,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的托呕。 我是一名探鬼主播含蓉,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼项郊!你這毒婦竟也來了馅扣?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤着降,失蹤者是張志新(化名)和其女友劉穎差油,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體任洞,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蓄喇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了交掏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妆偏。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖盅弛,靈堂內(nèi)的尸體忽然破棺而出钱骂,到底是詐尸還是另有隱情,我是刑警寧澤挪鹏,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布见秽,位于F島的核電站,受9級(jí)特大地震影響讨盒,放射性物質(zhì)發(fā)生泄漏解取。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一催植、第九天 我趴在偏房一處隱蔽的房頂上張望肮蛹。 院中可真熱鬧勺择,春花似錦、人聲如沸伦忠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽昆码。三九已至气忠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間赋咽,已是汗流浹背旧噪。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留脓匿,地道東北人淘钟。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像陪毡,于是被迫代替她去往敵國和親米母。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355

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