workbox緩存常用范例(譯)

此文主要描述Workbox的示例緩存策略

緩存字體(以google服務(wù)為例)

Google字體服務(wù)由兩部分組成:

  • 包含@font-face的樣式文件
  • 內(nèi)部靜態(tài)的,修訂的字體庫埠胖。

我們知道捷绑,樣式文件更新比較頻繁,優(yōu)先用“StaleWhileRevalidate”的緩存策略谆奥; 而字體庫本身不會改變,所以用“cache first”緩存策略逗宜。

在這里雄右,我們將緩存的”字體庫“的時間限制為一年(匹配HTTP Cache-Control標(biāo)頭)空骚,將最大條目限制為30(以確保我們不會在用戶的設(shè)備上占用過多的存儲空間)

 // Cache the Google Fonts stylesheets with a stale-while-revalidate strategy.
workbox.routing.registerRoute(
  /^https:\/\/fonts\.googleapis\.com/,
  new workbox.strategies.StaleWhileRevalidate({
    cacheName: 'google-fonts-stylesheets',
  })
);

// Cache the underlying font files with a cache-first strategy for 1 year.
workbox.routing.registerRoute(
  /^https:\/\/fonts\.gstatic\.com/,
  new workbox.strategies.CacheFirst({
    cacheName: 'google-fonts-webfonts',
    plugins: [
      new workbox.cacheableResponse.Plugin({
        statuses: [0, 200],
      }),
      new workbox.expiration.Plugin({
        maxAgeSeconds: 60 * 60 * 24 * 365,
        maxEntries: 30,
      }),
    ],
  })
);

緩存圖片

你可能希望通過匹配文件“后綴名”,采用“cache-first”策略來緩存圖片

 workbox.routing.registerRoute(
  /\.(?:png|gif|jpg|jpeg|webp|svg)$/,
  new workbox.strategies.CacheFirst({
    cacheName: 'images',
    plugins: [
      new workbox.expiration.Plugin({
        maxEntries: 60,
        maxAgeSeconds: 30 * 24 * 60 * 60, // 30 Days
      }),
    ],
  })
);

緩存css和JS文件

您可能希望對未預(yù)先緩存的CSS和JavaScript文件擂仍,使用stale-while-revalidate策略囤屹。

workbox.routing.registerRoute(
  /\.(?:js|css)$/,
  new workbox.strategies.StaleWhileRevalidate({
    cacheName: 'static-resources',
  })
);

從多個來源緩存內(nèi)容

您可以創(chuàng)建正則表達式來緩存來自單個路徑中的多個源的類似請求。例如下面逢渔,緩存來自googleapis.com和gstatic.com來源的資源

workbox.routing.registerRoute(
  /.*(?:googleapis|gstatic)\.com/,
  new workbox.strategies.StaleWhileRevalidate(),
);

其實就是下面的替代方案

workbox.routing.registerRoute(
  /.*(?:googleapis)\.com/,
  new workbox.strategies.StaleWhileRevalidate({
    cacheName: 'googleapis',
  })
);

workbox.routing.registerRoute(
  /.*(?:gstatic)\.com/,
  new workbox.strategies.StaleWhileRevalidate({
    cacheName: 'gstatic',
  })
);

針對來源設(shè)置緩存規(guī)則

例如肋坚,下面的示例緩存最多50個請求,最多5分鐘肃廓。

workbox.routing.registerRoute(
  'https://hacker-news.firebaseio.com/v0/api',
  new workbox.strategies.CacheFirst({
      cacheName: 'stories',
      plugins: [
        new workbox.expiration.Plugin({
          maxEntries: 50, // 50個
          maxAgeSeconds: 5 * 60, // 5 分鐘
        }),
        new workbox.cacheableResponse.Plugin({
          statuses: [0, 200],
        }),
      ],
  })
);

強制網(wǎng)絡(luò)請求超時

可能存在一些網(wǎng)絡(luò)請求智厌,他們花費的時間很長,那么通過一些配置盲赊,讓任何在超時內(nèi)無法響應(yīng)的網(wǎng)絡(luò)請求都強制回退到緩存獲取铣鹏。 為此,您可以使用NetworkFirst策略并配置networkTimeoutSeconds選項哀蘑。

 workbox.routing.registerRoute(
  'https://hacker-news.firebaseio.com/v0/api',
  new workbox.strategies.NetworkFirst({
      networkTimeoutSeconds: 3,
      cacheName: 'stories',
      plugins: [
        new workbox.expiration.Plugin({
          maxEntries: 50,
          maxAgeSeconds: 5 * 60, // 5 minutes
        }),
      ],
  })
);

從特定子目錄緩存資源

您可以使用正則表達式輕松地將請求路由匹配到特定目錄中的文件诚卸。如果我們想將請求路由匹配到/static/中的文件,我們可以使用正則表達式new RegExp('/ static /')绘迁,如下所示:

workbox.routing.registerRoute(
  new RegExp('/static/'),
  new workbox.strategies.StaleWhileRevalidate()
);

基于資源類型的緩存資源

你可以使用RequestDestination確定策略的請求目標(biāo)類型合溺。比如,當(dāng)目標(biāo)是<audio>數(shù)據(jù)

 workbox.routing.registerRoute(
  // Custom `matchCallback` function
  ({event}) => event.request.destination === 'audio',
  new workbox.strategies.CacheFirst({
    cacheName: 'audio',
    plugins: [
      new workbox.expiration.Plugin({
        maxEntries: 60,
        maxAgeSeconds: 30 * 24 * 60 * 60, // 30 Days
      }),
    ],
  })
);

從Web應(yīng)用程序代碼訪問緩存

Cache Storage API可用于service worker和客戶端(window)的上下文中缀台。如果要更改緩存 - 添加或刪除條目棠赛,或從Web應(yīng)用程序的上下文獲取緩存URL列表,您可以直接執(zhí)行此操作膛腐,而無需通過postMessage()與service worker通信睛约。

例如,如果要將URL添加到給定緩存依疼,以響應(yīng)Web應(yīng)用程序中的用戶操作痰腮,則可以使用如下代碼:

// Inside app.js:

async function addToCache(urls) {
  const myCache = await window.caches.open('my-cache');
  await myCache.addAll(urls);
}

//隨時調(diào)用addToCache。例如律罢,在DOM加載后膀值,添加某些路徑到緩存:
window.addEventListener('load', () => {
  // ...determine the list of related URLs for the current page...
  addToCache(['/static/relatedUrl1', '/static/relatedUrl2']);
});

在service worker設(shè)置緩存規(guī)則時,可以引用緩存名稱

// Inside service-worker.js:

workbox.routing.registerRoute(
  new RegExp('/static/'),
  new workbox.strategies.StaleWhileRevalidate({
  //'my-cache是之前已經(jīng)配置緩存名稱误辑,這里可以直接指定使用
  cacheName: 'my-cache',  
      })
);

以上為workbox 官網(wǎng)common-recipes章節(jié)的搬運沧踏,如理解有誤,請指正巾钉,感謝翘狱;

原文: common-recipes

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市砰苍,隨后出現(xiàn)的幾起案子潦匈,更是在濱河造成了極大的恐慌阱高,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件茬缩,死亡現(xiàn)場離奇詭異赤惊,居然都是意外死亡,警方通過查閱死者的電腦和手機凰锡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進店門未舟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人掂为,你說我怎么就攤上這事裕膀。” “怎么了勇哗?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵昼扛,是天一觀的道長。 經(jīng)常有香客問我智绸,道長野揪,這世上最難降的妖魔是什么访忿? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任瞧栗,我火速辦了婚禮,結(jié)果婚禮上海铆,老公的妹妹穿的比我還像新娘迹恐。我一直安慰自己,他們只是感情好卧斟,可當(dāng)我...
    茶點故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布殴边。 她就那樣靜靜地躺著,像睡著了一般珍语。 火紅的嫁衣襯著肌膚如雪锤岸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天板乙,我揣著相機與錄音是偷,去河邊找鬼。 笑死募逞,一個胖子當(dāng)著我的面吹牛蛋铆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播放接,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼刺啦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了纠脾?” 一聲冷哼從身側(cè)響起玛瘸,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤蜕青,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后糊渊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體市咆,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年再来,在試婚紗的時候發(fā)現(xiàn)自己被綠了蒙兰。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡芒篷,死狀恐怖搜变,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情针炉,我是刑警寧澤挠他,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站篡帕,受9級特大地震影響殖侵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜镰烧,卻給世界環(huán)境...
    茶點故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一拢军、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧怔鳖,春花似錦茉唉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至献幔,卻和暖如春懂傀,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蜡感。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工蹬蚁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人铸敏。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓缚忧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親杈笔。 傳聞我的和親對象是個殘疾皇子闪水,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,554評論 2 349

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

  • 參考《深入理解瀏覽器的緩存機制》進行整理 前言 緩存可以說是性能優(yōu)化中簡單高效的一種優(yōu)化方式了。一個優(yōu)秀的緩存策略...
    琢磨先生lf閱讀 740評論 1 1
  • 一、前言 緩存可以說是性能優(yōu)化中簡單高效的一種優(yōu)化方式了球榆。一個優(yōu)秀的緩存策略可以縮短網(wǎng)頁請求資源的距離朽肥,減少延遲,...
    沉落的星星閱讀 383評論 0 0
  • 一持钉、前言 緩存可以說是性能優(yōu)化中簡單高效的一種優(yōu)化方式了衡招。一個優(yōu)秀的緩存策略可以縮短網(wǎng)頁請求資源的距離,減少延遲每强,...
    浪里行舟閱讀 205,364評論 46 521
  • ORA-00001: 違反唯一約束條件 (.) 錯誤說明:當(dāng)在唯一索引所對應(yīng)的列上鍵入重復(fù)值時始腾,會觸發(fā)此異常。 O...
    我想起個好名字閱讀 5,256評論 0 9
  • {"box-model": false,"adjoining-classes": false,"box-sizin...
    愿你如夏日清涼的風(fēng)閱讀 643評論 0 0