当前位置: 首页 > 知识库问答 >
问题:

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

郭琨
2023-03-14

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

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

我在这里思考以下几点:

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

国俊艾
2023-03-14

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

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

更新:

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

  • 使用类似 idb-keyval 的东西,使使用 IndexedDB 作为 keyval 存储变得非常简单
  • 使用 importScript(指向 idb-keyval.min.js)将其放在 SW 中
  • 缓存某些内容时,请使用其 URL(字符串)作为 IDB 键,将 Unix 时间用作值
  • 稍后,循环访问缓存项,并将其与 IDB 中找到的时间戳进行比较;如果太旧,请从缓存中 delte
 类似资料:
  • 因此,我有一个带有服务工作者的HTML页面,服务工作者缓存索引。html和我的JS文件。 问题是当我更改JS时,更改不会直接显示在客户端浏览器上。当然,在chrome开发工具中,我可以禁用缓存。但是在Chrome Mobile,我该怎么做呢? 我试图访问站点设置并点击CLEAR%RESET按钮。但它仍然从缓存加载旧页面/加载。我试图使用其他浏览器或铬隐姓埋名,它加载新的页面。 然后,我尝试清除我的

  • 我正在使用Service Worker创建一个渐进式Web应用程序,我正在使用Service Worker工具箱来缓存我的内容。Service Worker代码来缓存我的内容: 代码运行正常,因为我在控制台上没有看到任何错误。但是我如何检查是否从云前或上面配置的网址的图像正在缓存和从缓存本身渲染。

  • 我建立了一个进步的网络应用,https://www.tavest.com.我不明白为什么我的服务人员也被缓存在Chrome中?https://www.tavest.com/service-worker-tavest.js因此,当我更改服务人员时,chrome没有检测到更改,因此服务人员没有更新。 尽管我刷新了很多次页面,它仍然是一样的。然而,在Mozilla中,它工作得很好。这是我安装服务人员的代

  • 我们在reactjs应用程序中安装了离线插件,该应用程序使用service worker缓存构建文件,未检查新构建的任何更新,因此,具有旧构建的用户仍在使用service worker中的缓存数据访问旧站点。这些文件没有过期设置,所以我想知道是否有任何解决方案可以强制用户刷新页面或将更新推给用户? 我在新版本中进行了更新,没有缓存头,离线插件自动更新,但我仍然无法找到将此更新推送到旧用户文件的方法

  • 我有一个糟糕的服务人员,不再更新。我首先注意到了Chrome中的问题。然后,我将以下代码放入索引中。html文件和软件中的。js(服务工作者)文件。在大多数情况下,它似乎运行良好。Firefox似乎是唯一一个没有删除服务工作者的浏览器。我使用下面的文章创建了注销脚本。 如何卸载Service Worker? 我也用过这篇文章和代码,得到了同样的结果。 我如何删除一个有缺陷的服务人员,或者实现一个“

  • 我有一个使用服务人员和缓存API的应用程序。Service Worker中使用的缓存名称包含GIT修订版(哈希),因此每次发布时,都会使用新缓存,删除旧缓存。这是为了百分之百地确保用户总是能够获得最新的源代码(这种情况对于预期的发布计划来说很好)。 我使用的是每天运行几次的Selenium Java(WebDriver)测试(比如GIT repo发生变化时),我希望确保每个新的GIT版本都能正确地