提问者:小点点

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


随着服务人员的出现,带来了极大的灵活性和力量,但也带来了很大的责任感......在控制缓存方面,不允许它不必要地增长。

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

我在这里思考以下几点:

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个答案

匿名用户

Workbox人员似乎正在从响应的标头中解析“日期”。如果日期不可用,他们还假设响应是新鲜的。在这里检查他们的源代码是否有cacheExsisionplugin。我想人们还可以在第一次从网络获取资产时将缓存时间保存到IndexedDB或缓存(例如,资产url作为键)。

虽然手工实现这样的东西并深入研究细节是一个很好的练习,但我的直觉认为人们通常应该更好地使用库来处理软件。Workbox可能是最好的选择。

更新:

我自己也没有试过,但我不认为这在实践中不起作用。

  • 使用类似 idb-keyval 的东西,使使用 IndexedDB 作为 keyval 存储变得非常简单
  • 使用 importScript(指向 idb-keyval.min.js)将其放在 SW 中
  • 缓存某些内容时,请使用其 URL(字符串)作为 IDB 键,将 Unix 时间用作值
  • 稍后,循环访问缓存项,并将其与 IDB 中找到的时间戳进行比较;如果太旧,请从缓存中 delte