Progressive Web Apps(PWA)核心技術(shù)-Service Worker

丑話(huà)都是說(shuō)在前面:

1.瀏覽器支持查看瀏覽器支持情況

2.在開(kāi)發(fā)過(guò)程中谊囚,可以通過(guò) localhost 使用服務(wù)工作線(xiàn)程丧鸯,但如果要在網(wǎng)站上部署服務(wù)工作線(xiàn)程坦胶,需要在服務(wù)器上設(shè)置 HTTPS叔扼。

Service Worker(服務(wù)工作線(xiàn)程)是瀏覽器在后臺(tái)獨(dú)立于網(wǎng)頁(yè)運(yùn)行的腳本街氢,它打開(kāi)了通向不需要網(wǎng)頁(yè)或用戶(hù)交互的功能的大門(mén)。

基本流程:


QQ圖片20180205125052.png

服務(wù)工作線(xiàn)程相關(guān)注意事項(xiàng):

  • 它是一種 JavaScript 工作線(xiàn)程苫拍,無(wú)法直接訪(fǎng)問(wèn) DOM芜繁。 服務(wù)工作線(xiàn)程通過(guò)響應(yīng) postMessage 接口發(fā)送的消息來(lái)與其控制的頁(yè)面通信,頁(yè)面可在必要時(shí)對(duì) DOM 執(zhí)行操作绒极。
  • 服務(wù)工作線(xiàn)程是一種可編程網(wǎng)絡(luò)代理骏令,讓您能夠控制頁(yè)面所發(fā)送網(wǎng)絡(luò)請(qǐng)求的處理方式。
  • 它在不用時(shí)會(huì)被中止垄提,并在下次有需要時(shí)重啟榔袋,因此周拐,您不能依賴(lài)于服務(wù)工作線(xiàn)程的 onfetch 和 onmessage 處理程序中的全局狀態(tài)。如果存在您需要持續(xù)保存并在重啟后加以重用的信息摘昌,服務(wù)工作線(xiàn)程可以訪(fǎng)問(wèn) IndexedDB API速妖。
  • 服務(wù)工作線(xiàn)程廣泛地利用了 promise,因此如果您不熟悉 promise聪黎,則應(yīng)停下閱讀此內(nèi)容,看一看 Promise 簡(jiǎn)介备恤。

Service Worker生命周期
service worker的生命周期完全獨(dú)立于網(wǎng)頁(yè)稿饰。

要為網(wǎng)站安裝service worker阔拳,您需要先在頁(yè)面的 JavaScript 中注冊(cè)沧踏。 注冊(cè)service worker之后瀏覽器將會(huì)在后臺(tái)啟動(dòng)service worker。

在安裝過(guò)程中宣赔,您通常需要緩存某些靜態(tài)資源惭笑。如果所有文件均已成功緩存侣姆,那么service worker就安裝完畢。如果任何文件下載失敗或緩存失敗沉噩,那么安裝將會(huì)失敗捺宗,service worker就無(wú)法激活(也就是說(shuō),不會(huì)安裝)川蒙。 如果發(fā)生這種情況蚜厉,不必?fù)?dān)心,它下次會(huì)再試一次畜眨。 但這意味著昼牛,如果安裝完成,您可以知道您已在緩存中獲得那些靜態(tài)資源康聂。

安裝之后贰健,接下來(lái)就是激活步驟,這是管理舊緩存的絕佳機(jī)會(huì)恬汁,我們將在service worker的更新部分對(duì)此詳加介紹伶椿。

激活之后,service worker將會(huì)對(duì)其作用域內(nèi)的所有頁(yè)面實(shí)施控制蕊连,不過(guò)悬垃,首次注冊(cè)service worker的頁(yè)面需要再次加載才會(huì)受其控制。service worker實(shí)施控制后甘苍,它將處于以下兩種狀態(tài)之一:service worker終止以節(jié)省內(nèi)存尝蠕,或處理獲取和消息事件,從頁(yè)面發(fā)出網(wǎng)絡(luò)請(qǐng)求或消息后將會(huì)出現(xiàn)后一種狀態(tài)载庭。
生命周期流程:


QQ圖片20180205132437.png

一個(gè)離線(xiàn)頁(yè)面示例代碼:

//先判斷瀏覽器是否支持
if ('serviceWorker' in navigator) {
  window.addEventListener('load', function() {
  //判斷是否已經(jīng)注冊(cè)了service worker
     if (navigator.serviceWorker.controller) {
       //已注冊(cè)
} else {
  //未注冊(cè)看彼,執(zhí)行注冊(cè)方法
  navigator.serviceWorker.register('sw.js', {
    scope: './'
  }).then(function(reg) {
   //注冊(cè)完成
  });
}
  });
}

----sw.js-----

//Install stage sets up the offline page in the cahche and opens a new cache
self.addEventListener('install', function(event) {
  var offlinePage = new Request('offline.html');
  event.waitUntil(
  fetch(offlinePage).then(function(response) {
    return caches.open('pwabuilder-offline').then(function(cache) {
      //緩存頁(yè)面
      return cache.put(offlinePage, response);
    });
  }));
});

self.addEventListener('fetch', function(event) {
  event.respondWith(
    fetch(event.request).catch(function(error) {
         //網(wǎng)絡(luò)請(qǐng)求失敗廊佩,打開(kāi)緩存頁(yè)面
        return caches.open('pwabuilder-offline').then(function(cache) {
          return cache.match('offline.html');
      });
    }));
});

//刷新緩存頁(yè)面
self.addEventListener('refreshOffline', function(response) {
  return caches.open('pwabuilder-offline').then(function(cache) {
    return cache.put(offlinePage, response);
  });
});
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市靖榕,隨后出現(xiàn)的幾起案子标锄,更是在濱河造成了極大的恐慌,老刑警劉巖茁计,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件料皇,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡星压,警方通過(guò)查閱死者的電腦和手機(jī)践剂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)娜膘,“玉大人逊脯,你說(shuō)我怎么就攤上這事】⑻埃” “怎么了军洼?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)演怎。 經(jīng)常有香客問(wèn)我匕争,道長(zhǎng),這世上最難降的妖魔是什么颤枪? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任汗捡,我火速辦了婚禮,結(jié)果婚禮上畏纲,老公的妹妹穿的比我還像新娘扇住。我一直安慰自己,他們只是感情好盗胀,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布艘蹋。 她就那樣靜靜地躺著,像睡著了一般票灰。 火紅的嫁衣襯著肌膚如雪女阀。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天屑迂,我揣著相機(jī)與錄音浸策,去河邊找鬼。 笑死惹盼,一個(gè)胖子當(dāng)著我的面吹牛庸汗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播手报,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼蚯舱,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼改化!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起枉昏,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤陈肛,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后兄裂,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體句旱,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年晰奖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了前翎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡畅涂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出道川,到底是詐尸還是另有隱情午衰,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布冒萄,位于F島的核電站臊岸,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏尊流。R本人自食惡果不足惜帅戒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望崖技。 院中可真熱鬧逻住,春花似錦、人聲如沸迎献。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)吁恍。三九已至扒秸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間冀瓦,已是汗流浹背伴奥。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留翼闽,地道東北人拾徙。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像肄程,于是被迫代替她去往敵國(guó)和親锣吼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子选浑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)玄叠,斷路器古徒,智...
    卡卡羅2017閱讀 134,651評(píng)論 18 139
  • 這次體驗(yàn)一種新的博客風(fēng)格,我們長(zhǎng)話(huà)短說(shuō)读恃,針針見(jiàn)“血”隧膘。 備馬 在深入 Service Worker 之前,我們需要...
    hylerrix閱讀 26,007評(píng)論 5 36
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,070評(píng)論 25 707
  • 1.介紹 PWA結(jié)合了最好的web體驗(yàn)和最好的app體驗(yàn)寺惫,它對(duì)第一次使用某個(gè)app的用戶(hù)來(lái)說(shuō)是非常有用的疹吃,因?yàn)椴恍?..
    短衣匹馬閱讀 5,019評(píng)論 0 13
  • 佟仿閱讀 106評(píng)論 0 0