【问题标题】:How to remove PWA service worker and its cache from client browser after remove PWA in angular 6 website在 Angular 6 网站中删除 PWA 后如何从客户端浏览器中删除 PWA 服务工作者及其缓存
【发布时间】:2020-01-07 00:09:15
【问题描述】:

我已将 PWA 功能和服务工作者添加到我的 Angular 网站。发布到实时服务器后,许多用户开始遇到问题,例如:“无法访问此站点”,但是当用户单击 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();
    }
  });
}

【问题讨论】:

    标签: angular service-worker progressive-web-apps


    【解决方案1】:

    您使用的代码是正确的,可以取消注册 Service Worker 并从客户端删除其缓存。

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

    在最坏的情况下,您的 Service Worker 将在 24 小时内检查是否有更新的版本可用。此功能称为故障安全,将由浏览器触发。

    你的代码已经不错了,但是如果你想了解更多关于Service Workers and caching strategies的信息,我写了一篇关于它们的文章。

    【讨论】:

      【解决方案2】:

      浏览器将在其生命周期后禁用服务工作者。

      我曾经遇到过这个问题,真的很痛苦。

      Hack:在您的 app.component.ts 中使用以下行 ngAfterViewInit();

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

      这是一个肮脏的 hack,不是一个坏习惯,让这段代码保持几天,直到你知道你的用户拥有你的 angular-app 的最新版本。

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

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

      this.swUpdate.available.subscribe(evt => {
              let snack = this.snackbar.open('Update Available', 'Reload Please.');
      
              snack.onAction().subscribe(() => {
                  window.location.reload();
              });
      
              setTimeout(() => {
                  snack.dismiss();
              }, 10000);
          });
      

      如果您仍然遇到任何问题,请告诉我,这可能是一个有趣的问题需要解决。

      【讨论】:

      • 现在服务工作者在服务器上找不到 index.html 的错误,它为路径提供 404,正确的路径是 localhost:4200/new,但它在 localhost:4200 上找到。在真实的网站中,我已经删除了 serviceworker.js,所以有旧缓存的人仍然会遇到同样的错误
      • 您是否使用 NGINX 进行部署?请从您粘贴 Angular DIST 文件夹的服务器中删除所有旧文件,并将新的 ng build --prod 内容粘贴到该目录中并重新启动服务器。
      • 我只是使用 ng build --prod 进行部署,并且在服务器中部署了很多次,但是我们无法重新启动服务器它会重新启动其他很多东西。
      猜你喜欢
      • 2020-07-13
      • 2021-09-02
      • 2020-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-28
      • 1970-01-01
      相关资源
      最近更新 更多