根据年龄删除服务工作缓存中的条目

时间:2017-11-03 19:47:02

标签: javascript caching service-worker

服务工作者具有很大的灵活性和强大功能,但也有很大的责任......在控制缓存方面不会让它不必要地增长。

有没有办法确定缓存项目的年龄,即它在缓存中的时间,并根据年龄定期清除缓存的项目?

我在这里想到的事情如下:

const RUNTIME = 'runtime-cache';

var getAgeOf = function (request) {
    return (*time since request was cached*);  // <-- but HOW?
};

var purgeRuntimeCache = function (threshold) {      
    caches.open(RUNTIME).then(function (cache) {
        cache.keys().then(function (keys) {
            keys.forEach(function (request, index, array) {
                cache.match(request).then(function (response) {
                    if (getAgeOf(request) > threshold) {
                        console.log('delete old resource from runtime cache: ' + request.url);
                        cache.delete(request);
                    }
                });
            });
        });
    });
};

1 个答案:

答案 0 :(得分:2)

工作箱人似乎正在分析“约会”日期&#39;来自回复的标题。如果日期不可用,他们还会认为答案是新鲜的。在here上查看cacheExpiration插件的来源。我想也可以在第一次从网络中获取资产时将缓存时间保存到IndexedDB或Caches(例如,资产URL作为密钥)。

虽然通过手工实现这样的事情并深入细节是一个很好的练习,但我的直觉说人们应该通过使用库来处理SW一般更好。 Workbox可能是最好的选择。

更新

我自己没有尝试过,但我没有看到任何理由在实践中不起作用。

  • 使用idb-keyval之类的东西,使IndexedDB作为keyval商店使用变得非常简单
  • 使用importScript(指向idb-keyval.min.js )将其置于SW中
  • 当您缓存某些内容时,请使用其URL(字符串)作为IDB密钥,将Unix时间用作值
  • 稍后,遍历缓存项并将它们与IDB中的时间戳进行比较;如果太旧,从缓存中删除