客戶端存儲CacheStorage

緩存數(shù)據(jù)的大小

  • 每個瀏覽器都硬性限制了一個域下緩存數(shù)據(jù)的大小明吩。

  • 瀏覽器盡其所能去管理磁盤空間,但它有可能刪除一個域下的緩存數(shù)據(jù)。

  • 瀏覽器要么自動刪除特定域的全部緩存兴喂,要么全部保留。

StorageEstimate

  • 提供對你的域名或Web app的數(shù)據(jù)存儲空間總量和已用量的估計值焚志。

  • StorageEstimate.quota: 用戶設(shè)備為你的域名或Web app預(yù)留的存儲空間總大小,且該大小為估計值.雖然實際上可能有比這更多的存儲空間,但這時你不應(yīng)使用那多余的部分衣迷。原始的單位是byte.

  • StorageEstimate.usage: 你的域名或Web app已經(jīng)使用的存儲空間大小,且該大小為估計值.剩余可用空間請綜合quota屬性計算。原始的單位是byte酱酬。

if(navigator.storage && navigator.storage.estimate) {
  navigator.storage.estimate().then(estimate => {
    // 原始的單位是byte. 轉(zhuǎn)成MB
    const ut = 1024 * 1024;
    return ({
      total: estimate.quota / ut,
      usage: estimate.usage / ut
    });
  });
};

一個域可以有多個命名 Cache 對象

  • 除非明確地更新緩存壶谒,否則緩存將不會被更新。

  • 除非刪除膳沽,否則緩存數(shù)據(jù)不會過期汗菜。

CacheStorage Api

1. CacheStorage.open(cacheName)

  • params [String] cacheName
  • 接口的 open() 方法返回一個resolve為匹配 cacheName 的Cache 對象的 Promise让禀。
  • 如果指定的 Cache 不存在,則使用該 cacheName 創(chuàng)建一個新的cache陨界,并返回一個resolve為該新 Cache 對象的Promise
  // 示例
  const cacheName = 'test-cache-name'
  caches.open(cacheName).then(cache => {
    // cache 對象
    console.log('cache.....', cache);
  })

2. CacheStorage.match(request, options)

  • 檢查給定的Request 對象或url字符串是否是一個已存儲的 Response 對象的key. 這個方法針對 Response 返回一個 Promise 巡揍,如果沒有匹配則返回 undefined 。

  • 提示: caches.match() 是一個便捷方法菌瘪。其作用等同于在每個緩存上調(diào)用 cache.match() 方法 (按照caches.keys()返回的順序) 直到返回Response 對象腮敌。

  • Request: 想要匹配的 Request。這個參數(shù)可以是 Request 對象或 URL 字符串俏扩。

  // 示例 url
  const notExistUrl = '/api'
  caches.match(notExistUrl).then(res => {
    console.log(res) // undefined
  })
  const existUrl = '/index.js'
  caches.match(existUrl).then(res => {
    console.log(res) // Response
  })
  // Request 對象
  const req = new Request('http://localhost:8008/api/ws', {
    method: 'get',
  })
  caches.match(req).then(res => {
    return res.json()
  }).then(r => {
    console.log(r); // {a: 1, b: 2}
  })
  • options: [可選] 這個對象中的屬性控制在匹配操作中如何進行匹配選擇糜工。可選擇參數(shù)如下:

ignoreSearch: [Boolean] 指定匹配過程是否應(yīng)該忽略url中查詢參數(shù)录淡。舉個例子捌木,如果該參數(shù)設(shè)置為true, 那么 ?value=bar 作為 http://foo.com/?value=bar 中的查詢參數(shù)將會在匹配過程中被忽略。該參數(shù)默認 false赁咙。

  const existUrlAndQuery = '/index.js?a=1'
  caches.match(existUrlAndQuery).then(res=>
  {
    console.log(res) // undefined
  })
  caches.match(existUrlAndQuery, {
    ignoreSearch: true
  }).then(res => {
    console.log(res) // Response
  })

ignoreMethod: [Boolean] 當(dāng)被設(shè)置為 true 時钮莲,將會阻止在匹配操作中對 Request請求的 http 方式的驗證 (通常只允許 GET 和 HEAD 兩種請求方式)。該參數(shù)默認為 false彼水。

// POST請求不允許緩存崔拥。

// 報錯 cache.js:13 Uncaught (in promise) TypeError: Failed to execute 'add' on 'Cache': Add/AddAll only supports the GET request method.

  const req = new Request(
    'http://localhost:8008/api/ws', {
      method: 'head', // post, get, head都一樣被忽略
      mode: 'cors',
    })
  caches.match(req, {
    cacheName: 'test-cache-name',
    ignoreMethod: true
  }).then(res => {
    return res.json()
  }).then(r => {
    console.log(r); // {a: 1, b: 2}
  })

ignoreVary: [Boolean] 當(dāng)該字段被設(shè)置為 true, 告知在匹配操作中忽略對VARY頭信息的匹配。換句話說凤覆,當(dāng)請求 URL 匹配上链瓦,你將獲取匹配的 Response 對象,無論請求的 VARY 頭存在或者沒有盯桦。該參數(shù)默認為 false慈俯。

  // 沒理解
  const req = new Request('http://localhost:8008/api/ws', {
    method: 'get',
    mode: 'cors',
    vary: 'User-Agent'
  })
  caches.match(req, {
    cacheName: 'test-cache-name',
    ignoreVary: false
  }).then(res => {
    return res.json()
  }).then(r => {
    console.log(r); // {a: 1, b: 2}
  })

cacheName: [DOMString] 表示所要搜索的緩存名稱.

[圖片上傳失敗...(image-d67305-1601447981344)]
[圖片上傳失敗...(image-28bf4e-1601447981345)]

// 指定cacheName
const cacheName = 'test-cache-name';
caches.match('/cache.js', {
  cacheName
}).then(res => {
  return res.text()
}).then(r => {
  console.log(r);
})

3. CacheStorage.has(cacheName)

  • 對象的 has()方法返回一個Promise對象,當(dāng)Cache對象有cacheName時被處理為true 拥峦。
  // 存在 cacheName
  caches.has('test-cache-name').then((res) => {
    console.log(res) // true
  });
  // 不存在 cacheName
  caches.has('test-cache-name-not').then((res) => {
    console.log(res) // false
  });

4. CacheStorage.delete(cacheName)

  • delete() 方法查找匹配 cacheName的Cache對象贴膘,如果找到,則刪除Cache對象并返回一個resolve為true的Promise.如果未找到Cache對象略号,則返回false.
  const testDeleteCacheName = 'test-delete-cache-name'
  caches.open(testDeleteCacheName).then(r => {
    // 刪除test-delete-cache-name
    caches.delete(testDeleteCacheName).then((res) => {
      console.log(res); // true
    });
    // 刪除不存在的test-cache-name-not
    caches.delete('test-cache-name-not').then((res) => {
      console.log(res); // false
    });
  })

5. CacheStorage.keys()

  • keys() 方法返回一個 Promise對象刑峡,它使用一個數(shù)組resolve,該數(shù)組包含 CacheStorage 對象按創(chuàng)建順序跟蹤的所有命名Cache對象對應(yīng)的字符串玄柠。使用此方法迭代所有Cache對象突梦。
  // 按創(chuàng)建順序
  caches.keys().then(res => {
    console.log(res);
    //我本地的["my-test-cache-v1", "workbox-runtime-http://127.0.0.1:5500/", "test-cache-name"]
  })

Cache Api

  • Cache是CacheStorage某一個命名的caheName的對象,如下代碼:
  // 示例
  const cacheName = 'test-cache-name'
  caches.open(cacheName).then(cache => {
    // cache對象就是cacheName為'test-cache-name'的cache對象
    console.log('cache.....', cache);
  })

1. cache.match(request, options)

  • match() 方法, 返回一個 Promise 解析為(resolve to)與 Cache 對象中的第一個匹配請求相關(guān)聯(lián)的Response 羽利。如果沒有找到匹配宫患,Promise 解析為 undefined。
  • 其他參數(shù)同CacheStorage.match()
  // 存在
  const req1 = new Request('http://localhost:8008/api/ws', {
    method: 'get',
    mode: 'cors',
  })
  const notExistUrl = 'not-exist-url'
  caches.open('test-cache-name').then(cache => {
    cache.match(req1,).then(r => {
      console.log(r); // Response
    })
    cache.match(notExistUrl,).then(r => {
      console.log(r); // undefined
    })
  })

2. cache.matchAll(request, options)

  • matchAll() 方法返回一個 Promise 这弧,其 resolve 為 Cache 對象中所有匹配請求的數(shù)組娃闲。
  • Cache 中你嘗試查找的The Request . 如果忽略這一參數(shù)虚汛,你將獲取到cache中所有 response 的副本。
  cache.matchAll().then(res => {
    console.log(res) // [Response, Response, Response]
  })

3. cache.add(request)

  • add()方法接受一個URL作為參數(shù)皇帮,請求參數(shù)指定的URL泽疆,并將返回的response對象添加到給定的cache中.
  • 返回一個promise,但是res為undefined
  // cache.add方法等同于下面玲献,默認發(fā)起一個fetch請求
  fetch(url).then(function (response) {
    if (!response.ok) {
      throw new TypeError('bad response status');
    }
    return cache.put(url, response);
  })
  const req = new Request('http://localhost:8008/v3/test-6', {
    method: 'get'
  })
  caches.open('test-cache-name').then(cache => {
    cache.add('style.css').then(res => {
      console.log('style.css....', res);
    })
    // 無需發(fā)起fetch請求,默認發(fā)起梯浪,將請求結(jié)果緩存捌年。
    cache.add(req).then(res => {
      console.log('add....req....', res);
    })
  })

4. cache.addAll(requests)

  • addAll() 方法接受一個URL數(shù)組,檢索它們挂洛,并將生成的response對象添加到給定的緩存中礼预。 在檢索期間創(chuàng)建的request對象成為存儲的response操作的key。
  const req1 = new Request('http://localhost:8008/v3/test-1', {
    method: 'get'
  })
  const req2 = new Request('http://localhost:8008/v3/test-2', {
    method: 'get'
  })
  const req3 = new Request('http://localhost:8008/v3/test-3', {
    method: 'get'
  })
  caches.open('test-cache-name').then(cache => {
    cache.addAll([
      req1,
      req2,
      req3,
      'style.css'
    ]).then(res => {
      console.log('add....req....', res);
    })
  })

5. cache.delete(request,{options})

  • delete() 方法查詢request為key的 Cache 條目虏劲,如果找到托酸,則刪除該 Cache 條目并返回resolve為true的 Promise 。 如果沒有找到柒巫,則返回resolve為false的 Promise 励堡。

  • options參數(shù)同match參數(shù)用法一致

ignoreSearch: 一個 Boolean 值,指定匹配進程中是否忽略url中的查詢字符串堡掏。如果設(shè)置為true应结,http://foo.com/?value=bar 中的 ?value=bar 部分在執(zhí)行匹配時會被忽略。默認為false泉唁。
ignoreMethod: 一個 Boolean 值鹅龄,當(dāng)設(shè)置為true時,將阻止匹配操作驗證{domxref("Request")}} HTTP方法(通常只允許GET和HEAD)亭畜。默認為false扮休。
ignoreVary: [Boolean] 當(dāng)該字段被設(shè)置為 true, 告知在匹配操作中忽略對VARY頭信息的匹配。換句話說拴鸵,當(dāng)請求 URL 匹配上玷坠,你將獲取匹配的 Response 對象,無論請求的 VARY 頭存在或者沒有宝踪。該參數(shù)默認為 false侨糟。
cacheName: [DOMString] 表示所要搜索的緩存名稱.

  const req1 = new Request('http://localhost:8008/v3/test-1', {
    method: 'get'
  })
  caches.open('test-cache-name').then(cache => {
    cache.delete(req1).then(res => {
      console.log(res); // true
    })
  })

6. cache.keys(request,{options})

  • keys() 方法返回一個 Promise ,這個 Promise 將解析為一個Cache 鍵的數(shù)組瘩燥。請求將以它們被插入的順序返回秕重。

  • request如果一個相關(guān)鍵被指定,則返對應(yīng)的 Request 厉膀。

  • options參數(shù)同macth用法

  const req3 = new Request('http://localhost:8008/v3/test-3', {
    method: 'get'
  })
  caches.open('test-cache-name').then(cache => {
    cache.keys().then(res => {
      console.log(res); // [Request, Request, Request]
    })
    cache.keys().then(res => {
      console.log(res); // [Request, Request, Request]
    })
    cache.keys(req3).then(res => {
      console.log('req3.....', res); // 返回對應(yīng)的key req3的[Request]
    })
  })

7. cache.put(request, response)

  • put() 方法 允許將鍵/值對添加到當(dāng)前的 Cache 對象中.
  • 注意: put() 將覆蓋先前存儲在匹配請求的cache中的任何鍵/值對溶耘。
  • 注意: Cache.add/Cache.addAll 不會緩存 Response.status 值不在200范圍內(nèi)的響應(yīng)二拐,而 Cache.put 允許你存儲任何請求/響應(yīng)對。因此凳兵,Cache.add/Cache.addAll 不能用于不透明的響應(yīng)百新,而 Cache.put 可以。
  • 注意: 當(dāng)響應(yīng)主體完全寫入磁盤時庐扫,初始Cache執(zhí)行 (在 Blink 和 Gecko中) resolve Cache.add饭望、Cache.addAll 和 Cache.put promise. 更新的規(guī)范版本中聲明:即使響應(yīng)主體仍在流式傳輸,一旦條目被記錄到數(shù)據(jù)庫中形庭,瀏覽器就可以 resolve promise.
// url
const url = 'style.css';
fetch(url).then(function(response) {
  if (!response.ok) {
    throw new TypeError('Bad response status');
  }
  return cache.put(url, response);
})
// Request
const req1 = new Request('http://localhost:8008/v3/test-1', {
  method: 'get'
})
fetch(req1).then(res => {
  cache.put(req1, res)
})
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末铅辞,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子萨醒,更是在濱河造成了極大的恐慌斟珊,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件富纸,死亡現(xiàn)場離奇詭異囤踩,居然都是意外死亡,警方通過查閱死者的電腦和手機晓褪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門堵漱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人涣仿,你說我怎么就攤上這事怔锌。” “怎么了变过?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵埃元,是天一觀的道長。 經(jīng)常有香客問我媚狰,道長岛杀,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任崭孤,我火速辦了婚禮类嗤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘辨宠。我一直安慰自己遗锣,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布嗤形。 她就那樣靜靜地躺著精偿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上笔咽,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天搔预,我揣著相機與錄音,去河邊找鬼叶组。 笑死拯田,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的甩十。 我是一名探鬼主播船庇,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼侣监!你這毒婦竟也來了溢十?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤达吞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后荒典,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體酪劫,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年寺董,在試婚紗的時候發(fā)現(xiàn)自己被綠了覆糟。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡遮咖,死狀恐怖滩字,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情御吞,我是刑警寧澤麦箍,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站陶珠,受9級特大地震影響挟裂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜揍诽,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一诀蓉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧暑脆,春花似錦渠啤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春架专,著一層夾襖步出監(jiān)牢的瞬間同窘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工部脚, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留想邦,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓委刘,卻偏偏與公主長得像丧没,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子锡移,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,901評論 2 345