如何获取ServiceWorker缓存中的元素大小和/或数量?

时间:2015-02-05 05:49:09

标签: caching quota service-worker

ServiceWorker是Chrome中的新API。它允许您执行的许多操作之一是拦截网络请求并使用缓存版本进行响应。我正在实施一个"让它离线"按钮,可以动态地将内容添加到缓存中。我想向用户报告我使用了多少空间,以及我在缓存中放了多少条目。

是否可以查询缓存以获取其中的项目数?我可以报告缓存在其中的东西的总大小吗?

2 个答案:

答案 0 :(得分:2)

显然您可以使用trained to thrill中显示的cacheName.keys().length,您也可以循环使用单个条目并计算总重量。

答案 1 :(得分:2)

您可以执行以下操作来查找缓存的大致大小:

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

有一些警告:

  • 仅计算响应正文的大小。 (这可以部分修复。)
  • 计算非透明反应。 (这不能修复。)