微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Angular - Service Worker 没有立即应用更新

如何解决Angular - Service Worker 没有立即应用更新

我们将 Angular 8 与 .NET Web API 一起使用。最近我们在 UI 方面进行了重大更改,这对最终用户产生了影响,因为 Service Worker 没有立即应用来自服务器的最新更改。只有在刷新浏览器或在下一个标签中重新打开浏览器后,才会在最终用户浏览器上应用最新更新。

但我们希望在更新可用后立即刷新浏览器。在开发者工具下,我们可以看到 Service Worker 正在拉取最新的更改,但并未立即应用。

下图来自我的浏览器 - Service Worker 显示浏览器中可用的更新

我们尝试创建我们自己的 ngsw-serviceworker.js 文件,但是在部署后脚本之后我们看不到我们自己的文件。 Angular 从 service worker 包中创建认的 ngsw-serviceworker.js。

这是我们为强制刷新而编写的一段代码(如果有任何更新可用)。但是没有运气,即使是此代码也仅在浏览器重新打开时才适用。

我们使用的版本 - "@angular/service-worker": "8.2.14",角 8.

Angular.json

"serviceWorker": 真,"ngswConfigPath": "ngsw-config.json"

App.Component.ts:(下面是我们在构造函数中写的代码

  if (this.swUpdate) {
   this.swUpdate.available.subscribe((event) => {
    console.log(`current`,event.current,`available `,event.available);
    this.swUpdate.activateUpdate().then(() =>
    {
      location.reload();
    
    }
    ); 
  });

有人可以帮助我们找到解决方案,从服务器在用户浏览器上应用 html/js/CSS 更改,或者在 Service Worker 更新可用后立即重新加载浏览器。

我们的 UI 代码部署在云 AWS 上。

解决方法

你需要告诉 service worker 检查服务器是否有更新,我通常为此使用一个服务:

export class UpdateService {

  constructor(public updates: SwUpdate) {
    if (updates.isEnabled) {
      interval(6 * 60 * 60).subscribe(() => updates.checkForUpdate()
        .then(() => console.log('checking for updates')));
    }
  }

  public checkForUpdates(): void {
    this.updates.available.subscribe(event => this.promptUser());
  }

  private promptUser(): void {
    console.log('updating to new version');
    this.updates.activateUpdate().then(() => document.location.reload()); 
  }

在你的 app-component.ts 中:

  constructor(private sw: UpdateService) {
    // check the service worker for updates
    this.sw.checkForUpdates();
  }

无论出于何种原因,Angular 有时无法正确注册 Service Worker。所以你可以修改 main.ts : 替换:

platformBrowserDynamic().bootstrapModule(AppModule);

与:

platformBrowserDynamic().bootstrapModule(AppModule).then(() => {
  if ('serviceWorker' in navigator && environment.production) {
    navigator.serviceWorker.register('ngsw-worker.js');
  }
}).catch(err => console.log(err));

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。