? PWA 系列(一)——Cache API

JS菌發表於2019-03-23

20190324011919.png

? PWA 系列(一)——Cache API

PWA(Progressive web apps,漸進式 Web 應用)運用現代的 Web API 以及傳統的漸進式增強策略來建立跨平臺 Web 應用程式。

PWA 主要用到了瀏覽器儲存技術、Service Workers 技術、App Shell、Web Push API、以及一系列其他基礎技術。本系列文章將逐一介紹所使用到的這些技術 ☀️

在 PWA 應用中,Cache 快取 API 是關鍵技術之一,主要作用就是快取相應和請求。只有在線上的情況下做好快取,才能夠在離線的情況下直接呼叫快取而不必重新聯網獲取資料。雖然 Cache 是被定義在 SW 標準中的,但並非一定要與 SW 配合使用。 ?

使用 Cache 快取的第一個步驟就是使用 CacheStorage.open(cacheName) 方法開啟一個 Cache 物件,然後再是對具體的快取內容執行 match, add, put, delete, keys 等操作。

API 概述

操作 Cache 又如下幾個方法(見 MDN):

  • cache.match(request, options) 跟 Cache 物件匹配的第一個已經快取的請求。
  • cache.matchall(request, options) 跟Cache物件匹配的所有請求組成的陣列。
  • cache.add(request) 抓取這個URL, 檢索並把返回的response物件新增到給定的Cache物件.這在功能上等同於呼叫 fetch(), 然後使用 cache.put() 將response新增到cache中.
  • cache.addall(requests) 抓取一個URL陣列,檢索並把返回的response物件新增到給定的Cache物件。
  • cache.put(request, response) 同時抓取一個請求及其響應,並將其新增到給定的cache。
  • cache.delete(request, options) 搜尋key值為request的Cache 條目。如果找到,則刪除該Cache 條目,並且返回一個resolve為true的Promise物件;如果未找到,則返回一個resolve為false的Promise物件。
  • cache.keys(request, options) 返回一個Promise物件,resolve的結果是Cache物件key值組成的陣列。

如何使用

看個例子 ?

⚠️ 下面的例子全部在 chrome 除錯工具的 console 皮膚書寫,chrome 自帶 async 因此可直接書寫 await 非同步程式碼

我們先拋開 SW 不談,單單看下 Cache 的幾個 API:

先定義 cacheName,相當於名稱空間,你的快取儲存的地方 ?

const CACHE_VERSION = 1
const CACHE_NAME = 'DEMO' + CACHE_VERSION
複製程式碼

然後呼叫 open 方法開啟一個 Cache 物件:

    const CACHE_VERSION = 1
    const CACHE_NAME = 'DEMO' + CACHE_VERSION
+   cache = await caches.open(CACHE_NAME)
複製程式碼

然後我們通過 Request 建構函式建立一個請求物件:

    const CACHE_VERSION = 1
    const CACHE_NAME = 'DEMO' + CACHE_VERSION
    cache = await caches.open(CACHE_NAME)
+   let r = new Request('https://httpbin.org/image/png')
複製程式碼

首先呼叫 match 方法,因為並沒有快取過這個請求因此返回 undefined:

    const CACHE_VERSION = 1
    const CACHE_NAME = 'DEMO' + CACHE_VERSION
    cache = await caches.open(CACHE_NAME)
    let r = new Request('https://httpbin.org/image/png')
+   await cache.match(r) // undefined
複製程式碼

20190324004907.png

但一旦我們呼叫 fetch 方法和 put 方法或 add 方法,那麼這個請求和響應資料都會被快取了:

    const CACHE_VERSION = 1
    const CACHE_NAME = 'DEMO' + CACHE_VERSION
    cache = await caches.open(CACHE_NAME)
    let r = new Request('https://httpbin.org/image/png')
-   await cache.match(r)
+   await cache.add(r)
複製程式碼

那麼我們嘗試再次 match,就可以獲得對應的 Response 物件了:

    const CACHE_VERSION = 1
    const CACHE_NAME = 'DEMO' + CACHE_VERSION
    cache = await caches.open(CACHE_NAME)
    let r = new Request('https://httpbin.org/image/png')
    await cache.add(r)
+   const c = await cache.match(r)
+   console.log(c)
複製程式碼

20190324005301.png

最後我們再看看 Application 中的 Cache Storage,中間就有這麼一條快取資料了:

20190324005751.png

嘗試呼叫 keys 方法,輸出我們 openCaches 物件:

    const CACHE_VERSION = 1
    const CACHE_NAME = 'DEMO' + CACHE_VERSION
-   cache = await caches.open(CACHE_NAME)
-   let r = new Request('https://httpbin.org/image/png')
-   await cache.add(r)
-   const c = await cache.match(r)
-   console.log(c)
+   await caches.keys()
複製程式碼

20190324010036.png

如果我們想要刪掉這個 caches 物件,只需呼叫 delete 方法,並傳入 cacheName 即可,返回 true 即表示刪除成功:

-   await caches.keys()
+   await caches.delete(CACHE_NAME)
複製程式碼

20190324010536.png

Cache API 的主要操作基本是這樣,下篇文章將繼續介紹 PWA 的系列技術——Fetch

參考:

? PWA 系列(一)——Cache API

相關文章