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

在angular 6网站中删除PWA后,如何从客户端浏览器中删除PWA service worker及其缓存

郭璞
2023-03-14

我已经在我的网站上添加了PWA功能和服务人员。在发布到live server之后,许多用户开始遇到问题,例如:“无法访问此站点”,但当用户单击CTRL F5时,它就可以正常工作。

为了立即解决问题,我已将PWA和服务人员从我的释放中移除。然而,许多用户都面临着同样的问题,或者服务人员出现了“未找到索引页”错误。

如何从最终用户的浏览器中删除或注销旧的服务工作人员?

我尝试使用以下代码删除service worker缓存:

if ('caches' in window) {
    caches.keys()
      .then(function(keyList) {
          return Promise.all(keyList.map(function(key) {
              return caches.delete(key);
          }));
      })
}

要删除服务人员,我添加了以下内容:

if(window.navigator && navigator.serviceWorker) {
  navigator.serviceWorker.getRegistrations()
  .then(function(registrations) {
    for(let registration of registrations) {
      registration.unregister();
    }
  });
}

共有2个答案

甄成弘
2023-03-14

浏览器将在服务辅助进程的生存期后禁用该服务辅助进程。

我曾经面对过这个问题,真的很痛苦。

黑客:在你的应用程序中。组成部分ts在ngAfterViewInit()内使用以下行;

ngAfterViewInit() {
   window.location.reload(); 
}

这是一个肮脏的黑客,不是一个糟糕的做法,让这段代码持续几天,直到你知道你的用户拥有你的角应用的最新版本。

之后,如果您希望对PWA使用Service-Worker,请使用以下代码自动更新您的客户端

在构造函数中注入private swUpdate:swUpdate,private snackbar:matsnakbar,并在其中编写以下代码。

this.swUpdate.available.subscribe(evt => {
        let snack = this.snackbar.open('Update Available', 'Reload Please.');

        snack.onAction().subscribe(() => {
            window.location.reload();
        });

        setTimeout(() => {
            snack.dismiss();
        }, 10000);
    });

如果你仍然面临任何问题,让我知道这可能是一个有趣的问题来解决。

宇文峰
2023-03-14

您使用的代码正确,可以注销service worker并从客户端删除其缓存。

您的软件是否正在处理任何长期任务?因为如果是这样,它将在被删除之前等待完成该任务。

在最坏的情况下,您的服务人员将在24小时内检查是否有更新的版本可用。此功能称为故障保护,将由浏览器触发。

您的代码已经很好了,但是如果您想了解更多关于服务工作者和缓存策略的信息,我写了一篇关于它们的文章。

 类似资料:
  • 问题内容: 范围:两个表。创建新的顾客时,他们会将有关他们的一些信息存储到第二张表中(这也使用触发器完成,它可以按预期工作)。这是我的表结构和关系的示例。 表1-> 顾客 表2-> patron_info 管理员可以管理顾客。当他们选择移走顾客时,将顾客从 桌子1 移开。此时, 表2 没有任何反应。 我只是想创建一个触发器,以便在表1的项目已删除时从表2中删除。这是我尝试过的… 最初,我尝试删除触

  • 用于从不存在的VM中删除磁盘的所有在线说明都与旧的Azure UI有关,该UI不包含与新门户相同的菜单命令。因此,我需要使用新的Azure管理门户删除孤立磁盘的说明。旧门户的说明对此操作毫无价值。

  • 问题内容: 有谁知道我该如何从Android浏览器中删除地址栏,以更好地查看我的Web应用程序并使它看起来更像本机应用程序? 问题答案: 您可以使用下一个代码 希望对您有帮助!

  • 使用.NET rabbitmq客户端(https://www.rabbitmq.com/dotnet.html)。创建了一个库,其他项目可以引用该库在总线上订阅/取消订阅/发布消息。 根据这里和这里提供的信息,为了让每个订户接收所有消息,每个客户端需要为每个订户定义一个不同的队列,绑定到交换机。我遇到的问题是如何在“客户端”应用程序使用队列完成后删除队列(因为这将以指数级增长,而且永远不会被清理掉

  • 问题内容: 我正在使用WebDriver运行Selenium测试。我将以某种循环重复测试,因此现在我想在JAVA中开始新测试之前清除缓存。 在这个while循环中,我要做的第一件事是清除CACHE(即MOZILLA和CHROME) 知道我该如何实现吗? 谢谢 问题答案: 当前,无法通过Web驱动程序API清除缓存。但是,如果每次都可以启动浏览器的新实例,则应在FF和Chrome中清除缓存,因为每次

  • 谢谢你的反馈。BrowserCap是一个遗留特性,我们不再继续更新它,除非我们发现ASP.NET特性因此而中断。如果您真的希望您的应用程序将Edge识别为Edge(而不是chrome),那么您可以添加自己的浏览器文件,以匹配app_browsers文件夹下的Edge的UA字符串。反馈 更新:*以下是来自三个浏览器的UA字符串,可能表明最后一条信息可能是指示器,但不是Chrome的。正如你所看到的,