2015-02-05 33 views
4

ServiceWorker是Chrome中的新API。它允許你做的很多事情之一是攔截網絡請求並用緩存版本進行響應。我正在實現一個「脫機離線」按鈕,它可以動態地將內容添加到緩存中。我想向用戶報告我使用了多少空間,以及我將多少條目放入緩存。如何獲取ServiceWorker緩存中元素的大小和/或數量?

是否可以查詢緩存以獲取其中的項目數量?我可以報告緩存在其中的事物的總大小嗎?

+0

正如在下面的答案中提到的,你可以使用'cacheName.keys()。then(function(keys){keys.length})'。目前無法計算磁盤上的大小,但您可以查看每個響應的「content-size」標題,但它不會與磁盤上存儲的內容完全匹配。 (也有一些http服務器沒有正確設置內容大小。)有關配額-api和ServiceWorkers的詳細說明,請訪問:https://github.com/slightlyoff/ServiceWorker/issues/587 –

+1

謝謝@ BenKelly鏈接到關於github問題的討論。我會用我的2美分。 – Rob

回答

2

顯然您可以使用cacheName.keys().length(如trained to thrill所示),您還可以循環使用單個條目並計算總重量。

+0

感謝您的github源鏈接。我可以看到這將適用於我的目的,但似乎循環緩存中的所有項目以增加大小可能會很昂貴。取決於緩存實現,這可能是大量的讀取。理想情況下,緩存對象將保持它包含的項目大小的計數,並在項目添加和刪除時更新它。 – Rob

0

你可以不喜歡下面找到緩存的近似大小:

// 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)); 
 
    }); 
 
}

有幾點需要注意:

  • 計數響應的大小隻有身體。 (這可能會部分修復。)
  • 計算不透明的響應。 (這是不能修復的。)
相關問題