Angular 5服务工作者无法工作/无法缓存背景图片

6
我在使用Angular5的服务工作者(Service Worker)时遇到了问题。主要存在两个问题:
  1. 服务工作者不能缓存作为背景图像使用的资源图像
  2. 模拟网络断开后,服务工作者最初从缓存中获取文件(除了之前提到的未缓存文件),但在第二次刷新时会出现错误。

以下是我问题的更详细报告。您可以通过克隆我制作的用于突出显示此问题的库(在此处)来跟随。

我使用提供的--service-worker标签创建了应用程序。然后,我确保遵循了Angular文档(此处)上列出的5个步骤,即:

  1. 添加服务工作者包。
  2. 将angular-cli.json设置为true。
  3. 在app.module.ts中导入并注册服务工作者。
  4. 生成并按照文档中描述的方式配置了ngsw-config.json。
  5. 运行ng build --prod以在我的应用程序dist文件夹中生成捆绑包。

我使用node/express和server.js文档来提供我的应用程序。当我在隐身窗口中打开应用程序(如文档中所建议的)时,我看到我的服务工作者被注册,并且缓存存储了我的捆绑包和索引文件。它还将用于img标记的图像缓存,但不会缓存在我的css background-image中指定的图像。当我通过在服务工作者上勾选离线框,然后刷新页面来模拟网络问题时,页面正确显示除了需要背景图像的部分。

但最终/主要问题发生在我第二次刷新应用程序或打开另一个标签页(在同一隐身窗口中,因此服务工作者仍然被注册并且缓存仍然处于活动状态)。此时,我没有看到任何显示。控制台给出了三个错误:

  1. GET http://localhost:3000/favicon.ico net::ERR_INTERNET_DISCONNECTED
  2. An unknown error occurred when fetching the script.
  3. Failed to load resource: net::ERR_INTERNET_DISCONNECTED

最后一个错误来自ngsw-worker.js。我不太确定这些错误的含义。我认为可能是尝试注册新的服务工作者,但我不确定为什么会发生这种情况...

这是我请求的ng-config.json文件:

{
  "index": "/index.html",
  "assetGroups": [{
    "name": "app",
    "installMode": "prefetch",
    "resources": {
      "files": [
        "/favicon.ico",
        "/index.html"
      ],
      "versionedFiles": [
        "/*.bundle.css",
        "/*.bundle.js",
        "/*.chunk.js"
      ]
    }
  }, {
    "name": "assets",
    "installMode": "lazy",
    "updateMode": "prefetch",
    "resources": {
      "files": [
        "/assets/**"
      ]
    }
  }]
}

任何关于此事的帮助都将不胜感激!谢谢大家。
更新
我注意到当我在没有运行服务器的情况下访问localhost:3000时,会出现以下错误:
Uncaught (in promise) Error: Response not Ok (fetchAndCacheOnce): request for http://localhost:3000/assets/images/background-silver-grainy.jpg returned response 504 Gateway Timeout

我也遇到了错误:
Failed to load resource: the server responded with a status of 504 (Gateway Timeout)

来自我的所有资源

更新2

我一直在使用node测试这个项目,使用express应用程序来处理所有请求并将其指向位于dist文件夹中的angular应用程序(在运行ng build --prod后生成)。我决定在一个简单的http服务器上进行测试。我还发现,直接重新加载会破坏我的服务工作者,但如果我导航到另一个页面,然后返回到我的原始页面,服务工作者就可以工作(奇怪但与此问题无关)。

不过,我仍然无法让服务工作者与express一起工作...


你能分享一下你的ngsw-config.json文件吗? - Nadhir Falta
马上就来! - Stephen Agwu
你运行两个服务器吗?一个用于API,另一个用于UI?Node运行的Express服务器有什么用? - Nadhir Falta
我只运行一个服务器。Node服务器通过运行来提供和处理Express应用程序。Express应用程序将所有请求指向我的应用程序(该应用程序位于通过运行ng build --prod生成的dist文件夹中)。 - Stephen Agwu
@StephenAgwu。#2 是我正在经历的...是的...很烦人。 - a2345sooted
显示剩余6条评论
1个回答

6

首先,Service Worker仅适用于--prod构建。

其次,Service Worker无法通过ng serve提供服务。在进行ng build --prod之后,您需要使用其他服务器来提供应用程序,例如:

1- npm install -g http-server // 全局安装http-server
2- cd dist
3- http-server -p 4200
4- 在浏览器中打开localhost:4200

第三,也是最重要的,您必须在浏览器中启用缓存。如果您已经勾选了“禁用缓存”,请取消勾选。

这是您的应用程序已经提供服务,所有内容都可以离线加载。

enter image description here


1
抱歉如果我没有表达清楚,但我已经按照您建议的做了一切。我的第5步是使用ng build --prod构建一个dist文件夹。接下来一句话中,我说我使用一个express文件server.js来启动应用程序。 - Stephen Agwu
是的。但我刚刚注意到他们给了我另一个错误...我会更新帖子。 - Stephen Agwu
4
文档实际上建议您在隐身模式下开发。[提示:测试 Angular 服务工作者时,最好在浏览器中使用隐身或私人窗口,以确保服务工作者不会从以前留下的状态中读取数据,这可能会导致意外行为。] (https://angular.io/guide/service-worker-getting-started) - Stephen Agwu
@stephenagwu 不,你可以在附加的图片中看到,我能够成功地加载你的repo而没有任何问题。首先加载它,刷新,离线,再次刷新,一切都正常运作。 - Nadhir Falta
我发现如果我导航到另一页,然后返回到我正在测试服务工作者的页面,它就可以正常工作。只有在直接重新加载时,服务工作者才会出问题(奇怪但可以容忍且与此问题无关)。现在我只需要让它与我的MEAN堆栈一起工作即可。感谢所有的帮助。 - Stephen Agwu
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接