Angular Service Worker起步太晚了

时间:2017-12-13 17:45:58

标签: angular service-worker angular-service-worker

我将Angular 5.1与内部Service Worker一起使用 这是我的ngsw-config.json文件:

{
  "appData": "Angular 5.1",
  "index": "/index.html",
  "assetGroups": [
    {
      "name": "app",
      "installMode": "prefetch",
      "resources": {
        "files": ["/favicon.ico", "/index.html"],
        "versionedFiles": ["/*.bundle.css", "/*.bundle.js", "/*.chunk.js"]
      }
    },
    {
      "name": "assets",
      "installMode": "prefetch",
      "updateMode": "prefetch",
      "resources": {
        "files": ["/assets/**"]
      }
    }
  ],
  "dataGroups": [
    {
      "name": "tasks-users-api",
      "urls": ["/api"],
      "cacheConfig": {
        "strategy": "freshness",
        "maxSize": 20,
        "maxAge": "1h",
        "timeout": "5s"
      }
    }
  ]
}

在我的主页的ngOnInit函数中,我调用dataGroups中列出的/ api url。当我打开我的控制台时,我可以看到这个url是在服务工作者启动之前调用(下面用红色框起)(我猜服务工作者的开始与下面用蓝色框架的元素匹配)。

dev console screen

因此,如果我关闭我的互联网连接,服务工作人员不会处理/ api调用。 如果我在另一个页面上导航并在关闭连接之前返回主页,则/ api调用由服务工作者处理。

这是一个问题吗?如何处理案件?

1 个答案:

答案 0 :(得分:1)

这是真的,这是一个功能而不是bug。服务工作者的设计目标之一是非常灵活,因此,您可以自由决定何时安装SW以及安装它需要什么。

理论上,安装可能是脚本执行的第一件事,它可能会阻塞,直到安装完成。但由于安装阶段可能是任意长的(我们可能会尝试预先缓存一半的互联网),这将是非常不切实际的。

我不知道Angular实现的细节,但一般的做法是仅在页面完全加载后才调用SW注册。因此,预计SW不会提供第一次负载(或至少安装和激活SW的阶段)。

如何处理此案件?真的无所事事。如果您在第一次加载时丢失连接,则无论谁负责,都会丢失。您的用户无法直接加载数据,或者您的SW无法缓存数据 - 在这两种情况下,您基本上都无法提供任何服务。