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

取消注册时如何清除服务工作者缓存?

夹谷衡
2023-03-14

常见问题:如何卸载Service Worker?对于使用JavaScript注销服务工作人员有一个很好的答案。如何让服务工作者在注销时清除任何命名缓存?

从MDN注销,服务工作人员将在注销之前完成任何正在进行的操作。因此,听起来应该可以监听卸载事件,但据我所知,不存在此类事件。对于傻笑,我尝试添加self。addEventListener('卸载',…)发送给服务工作者,但正如预期的那样,在注销时不会触发。我还尝试监听任何可能在注销时发送的消息。。。没有骰子。

我还考虑观察Service Worker状态,但是没有一个安装安装激活激活冗余出现相关。更不用说,看起来消息传递给服务工作者是不可能的,所以我不确定从服务工作者外部卸载状态会做什么。

伸手去抓稻草,虽然我看到了卸载标志的引用,但我还没有看到它暴露在任何地方。建议?

共有2个答案

袁华清
2023-03-14

这可以通过消息传递来实现。与Jeff Posnick的答案相比,我更喜欢这个答案的一个原因是缓存的名称不需要在服务人员之外知道。在service worker中,添加消息侦听器:

self.addEventListener('message', (event) => {
    messageHandler(event);
});

然后,可以对传递的各种消息执行操作。例如:

function messageHandler(event) {
    if (event.data === 'purge_cache') {
        caches.delete('mycache')
        .then((success) => {
            console.log("Cache removal status: " + success);
        })
        .catch((err) => {
            console.log("Cache removal error: ", err);
        });
    }
}

若要触发此操作,请将脚本中的消息发布到服务工作人员范围内的页面上。因此,对于如何删除缓存然后注销服务工作人员的原始问题,您可以这样做:

navigator.serviceWorker.getRegistration()
.then((registration) => {
    registration.active.postMessage('purge_cache');
    registration.unregister()
    .then((success) => {
        console.log('Service worker unregistration status: ' + success);
    })
    .catch((err) => {
        console.log('Service worker unregistration failed', err);
    });
})
.catch((err) => {
    console.log('Service worker registration not found.');
});

注意,我没有等待来自postMessage('purge_cache')的成功回复;从MDN注销,“服务工作者将在注销之前完成任何正在进行的操作。”

越霖
2023-03-14

以下代码应注销所有服务工作人员,并清除缓存存储API中的所有原始内容:

async function unregisterAndClearCaches() {
  const registrations = await navigator.serviceWorker.getRegistrations();
  const unregisterPromises = registrations.map(registration => registration.unregister());

  const allCaches = await caches.keys();
  const cacheDeletionPromises = allCaches.map(cache => caches.delete(cache));

  await Promise.all([...unregisterPromises, ...cacheDeletionPromises]);
}

使用Clear-Site-Data标头是另一个选项,用于强制清除所有内容(服务工作人员注册、缓存等)。)在一个操作中。

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

  • 因此,我有一个带有服务工作者的HTML页面,服务工作者缓存索引。html和我的JS文件。 问题是当我更改JS时,更改不会直接显示在客户端浏览器上。当然,在chrome开发工具中,我可以禁用缓存。但是在Chrome Mobile,我该怎么做呢? 我试图访问站点设置并点击CLEAR%RESET按钮。但它仍然从缓存加载旧页面/加载。我试图使用其他浏览器或铬隐姓埋名,它加载新的页面。 然后,我尝试清除我的

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

  • 我已经运行了这个脚本 但我看到,通过这样做,我们实际上是先注册服务人员,然后注销它。对我来说,这似乎不是正确的方法。 或者,我可以点击从开发工具应用程序到服务工作者附近的取消注册链接 但当我通过检查时chrome://serviceworker-internals/ 它在列表底部显示旧的和未注册的服务人员列表(见图) 那么为什么我会在这里看到冗余服务人员列表呢?什么时候更新?这是chrome浏览器

  • 我正在尝试在http(不安全)站点内的https iframe中注册服务工作者。直到最近,我的代码运行时没有任何问题。从上次chrome更新(44)开始,此代码在iframe中失败: 控制台中出现以下错误: 如果安全IFRAME运行在不安全的父级中,是否有任何更改阻止它们注册服务工作者?

  • 关于它也有类似的问题,但是不太清楚如何应用解决方案,并不断收到错误。 我解释。我想使用ServiceWorker技术创建一个简单的html/js应用程序。我有: 索引。html js/app。js js/sw。js app.js代码是(见 //*** 注释): 正如您在注释中所看到的,我仍然收到错误“提供的作用域(“/”)的路径不在允许的最大作用域(“/js/”)之下。请调整作用域,移动服务工作者