Service Worker

作用:

可以使你的應(yīng)用先訪問本地緩存資源兄朋,所以在離線狀態(tài)時(shí)兴泥,在沒有通過網(wǎng)絡(luò)接收到更多的數(shù)據(jù)前楔敌,仍可以提供基本的功能博脑。

使用前的設(shè)置:

Chrome中需要開啟相關(guān)配置: 訪問 chrome://flags 并開啟 experimental-web-platform-features; 重啟瀏覽器 (注意:有些特性在Chrome中沒有默認(rèn)開放支持);另外屁倔,你需要通過 HTTPS 來訪問你的頁面 — 出于安全原因脑又,Service Workers 要求要在必須在 HTTPS 下才能運(yùn)行,localhost 也被瀏覽器認(rèn)為是安全源锐借。

簡單的例子

這是把express和sw-test簡單結(jié)合的一個(gè)小demo, 項(xiàng)目運(yùn)行起來訪問
http://localhost:3000/sw-test/index.html , 然后終止此服務(wù)依然能訪問相應(yīng)資源问麸。Github

相關(guān)代碼

  • /public/sw-test/app.js
  1. 首先判斷了瀏覽器是否支持
  2. 調(diào)用 register 方法注冊 service worker, 第一個(gè)參數(shù)是運(yùn)行 service worker 的
    js 文件, 第二個(gè) scope 參數(shù)是選填的,可以被用來指定你想讓 service worker 控制的內(nèi)容的子目錄钞翔。 在這個(gè)例子严卖,我們指定了 '/sw-test/',即 http://localhost:3000/sw-test/ 下的請(qǐng)求會(huì)被捕獲, 被指定的資源會(huì)被緩存布轿。
  3. register 方法返回一個(gè) Promise , 進(jìn)行正確錯(cuò)誤處理哮笆。
  if ('serviceWorker' in navigator) {
  navigator.serviceWorker.register('/sw-test/sw.js', { scope: '/sw-test/' }).then(function(reg) {
    // registration worked
    console.log('Registration succeeded. Scope is ' + reg.scope);
  }).catch(function(error) {
    // registration failed
    console.log('Registration failed with ' + error);
  });
}
  • /public/sw-test/sw.js
    核心文件,監(jiān)聽安裝事件, 打開緩存 v1 增加需要緩存資源 request url list, 截取被控文件下請(qǐng)求, 如果不存在該緩存則進(jìn)行緩存處理
  1. 監(jiān)聽了 install 事件, event.waitUntil 主要用在 Install, activate 事件中, 在服務(wù)工作線程中来颤,延長事件的壽命從而阻止瀏覽器在事件中的異步操作完成之前終止服務(wù)工作線程。
  2. Cache 接口提供緩存的 Request,
    Response 對(duì)象對(duì)的存儲(chǔ)機(jī)制稠肘,例如作為ServiceWorker生命周期的一部分福铅。 Cache 接口像 workers 一樣, 是暴露在 window 作用域下的。盡管它被定義在 service worker 的標(biāo)準(zhǔn)中, 但是它不必一定要配合 service worker 使用.Cache詳細(xì)API
  3. event.respondWith 方法旨在包裹代碼项阴,這些代碼為來自受控頁面的request生成自定義的response滑黔,查看更多。response.clone() 創(chuàng)建了一個(gè)響應(yīng)對(duì)象的克隆环揽,這個(gè)對(duì)象在所有方面都是相同的略荡,但是存儲(chǔ)在一個(gè)不同的變量中。防止多次使用篡改了對(duì)象歉胶。
self.addEventListener('install', function(event) {
  event.waitUntil(
    caches.open('v1').then(function(cache) {
      return cache.addAll([
        '/sw-test/',
        '/sw-test/index.html',
        '/sw-test/style.css',
        '/sw-test/app.js',
        '/sw-test/image-list.js',
        '/sw-test/star-wars-logo.jpg',
        '/sw-test/gallery/bountyHunters.jpg',
        '/sw-test/gallery/myLittleVader.jpg',
        '/sw-test/gallery/snowTroopers.jpg'
      ]);
    })
  );
});

self.addEventListener('fetch', function(event) {
  event.respondWith(caches.match(event.request).then(function(response) {
    // caches.match() always resolves
    // but in case of success response will have value
    if (response !== undefined) {
      return response;
    } else {
      return fetch(event.request).then(function (response) {
        // response may be used only once
        // we need to save clone to put one copy in cache
        // and serve second one
        let responseClone = response.clone();
        
        caches.open('v1').then(function (cache) {
          cache.put(event.request, responseClone);
        });
        return response;
      }).catch(function () {
        return caches.match('/sw-test/gallery/myLittleVader.jpg');
      });
    }
  }));
});

版本更新刪除舊緩存

  1. 監(jiān)聽 activate 事件, 如當(dāng)前版本 v2汛兜,刪除與當(dāng)前不匹配緩存數(shù)據(jù)。
this.addEventListener('activate', function(event) {
  var cacheWhitelist = ['v2'];

  event.waitUntil(
    caches.keys().then(function(keyList) {
      return Promise.all(keyList.map(function(key) {
        if (cacheWhitelist.indexOf(key) === -1) {
          return caches.delete(key);
        }
      }));
    })
  );
});

參照 MDN

Service Worker 詳細(xì)文檔

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末通今,一起剝皮案震驚了整個(gè)濱河市序无,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌衡创,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晶通,死亡現(xiàn)場離奇詭異璃氢,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)狮辽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門一也,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人喉脖,你說我怎么就攤上這事椰苟。” “怎么了树叽?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵舆蝴,是天一觀的道長。 經(jīng)常有香客問我题诵,道長洁仗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任性锭,我火速辦了婚禮赠潦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘草冈。我一直安慰自己她奥,他們只是感情好瓮增,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著哩俭,像睡著了一般绷跑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上携茂,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天你踩,我揣著相機(jī)與錄音,去河邊找鬼讳苦。 笑死带膜,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的鸳谜。 我是一名探鬼主播膝藕,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼咐扭!你這毒婦竟也來了芭挽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤蝗肪,失蹤者是張志新(化名)和其女友劉穎袜爪,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體薛闪,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡辛馆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了豁延。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片昙篙。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖诱咏,靈堂內(nèi)的尸體忽然破棺而出苔可,到底是詐尸還是另有隱情,我是刑警寧澤袋狞,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布焚辅,位于F島的核電站,受9級(jí)特大地震影響苟鸯,放射性物質(zhì)發(fā)生泄漏法焰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一倔毙、第九天 我趴在偏房一處隱蔽的房頂上張望埃仪。 院中可真熱鬧陕赃,春花似錦、人聲如沸傻丝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽亏掀。三九已至泛释,卻和暖如春滤愕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背怜校。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來泰國打工间影, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留魂贬,地道東北人付燥。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓甘萧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親怪得。 傳聞我的和親對(duì)象是個(gè)殘疾皇子徒恋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

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

  • 特別簡的介 去年開始火遍南北的 PWA 技術(shù)落地情況有負(fù)重望,主要源于 safrai 對(duì)于這一技術(shù)支持不甚理想径筏,不...
    溪離欣洛閱讀 8,538評(píng)論 0 4
  • 簡書放不了demo聊训,demo可以看原文 Service Worker 是什么? service worker 是獨(dú)...
    分析閱讀 21,062評(píng)論 1 21
  • 這次體驗(yàn)一種新的博客風(fēng)格,我們長話短說指黎,針針見“血”醋安。 備馬 在深入 Service Worker 之前亲怠,我們需要...
    hylerrix閱讀 26,011評(píng)論 5 36
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器图毕,智...
    卡卡羅2017閱讀 134,657評(píng)論 18 139
  • Progressive web application是谷歌推出的一種漸進(jìn)式應(yīng)用冬阳,我覺得其實(shí)PWA是一種非常具有發(fā)...
    瑟荻閱讀 1,181評(píng)論 0 0