ServiceWorker是Chrome中的新API。它允許你做的很多事情之一是攔截網絡請求並用緩存版本進行響應。我正在實現一個「脫機離線」按鈕,它可以動態地將內容添加到緩存中。我想向用戶報告我使用了多少空間,以及我將多少條目放入緩存。如何獲取ServiceWorker緩存中元素的大小和/或數量?
是否可以查詢緩存以獲取其中的項目數量?我可以報告緩存在其中的事物的總大小嗎?
ServiceWorker是Chrome中的新API。它允許你做的很多事情之一是攔截網絡請求並用緩存版本進行響應。我正在實現一個「脫機離線」按鈕,它可以動態地將內容添加到緩存中。我想向用戶報告我使用了多少空間,以及我將多少條目放入緩存。如何獲取ServiceWorker緩存中元素的大小和/或數量?
是否可以查詢緩存以獲取其中的項目數量?我可以報告緩存在其中的事物的總大小嗎?
顯然您可以使用cacheName.keys().length
(如trained to thrill所示),您還可以循環使用單個條目並計算總重量。
感謝您的github源鏈接。我可以看到這將適用於我的目的,但似乎循環緩存中的所有項目以增加大小可能會很昂貴。取決於緩存實現,這可能是大量的讀取。理想情況下,緩存對象將保持它包含的項目大小的計數,並在項目添加和刪除時更新它。 – Rob
你可以不喜歡下面找到緩存的近似大小:
// returns approximate size of a single cache (in bytes)
function cacheSize(c) {
return c.keys().then(a => {
return Promise.all(
a.map(req => c.match(req).then(res => res.clone().blob().then(b => b.size)))
).then(a => a.reduce((acc, n) => acc + n, 0));
});
}
// returns approximate size of all caches (in bytes)
function cachesSize() {
return caches.keys().then(a => {
return Promise.all(
a.map(n => caches.open(n).then(c => cacheSize(c)))
).then(a => a.reduce((acc, n) => acc + n, 0));
});
}
有幾點需要注意:
正如在下面的答案中提到的,你可以使用'cacheName.keys()。then(function(keys){keys.length})'。目前無法計算磁盤上的大小,但您可以查看每個響應的「content-size」標題,但它不會與磁盤上存儲的內容完全匹配。 (也有一些http服務器沒有正確設置內容大小。)有關配額-api和ServiceWorkers的詳細說明,請訪問:https://github.com/slightlyoff/ServiceWorker/issues/587 –
謝謝@ BenKelly鏈接到關於github問題的討論。我會用我的2美分。 – Rob