【问题标题】:Angular 8 Service Worker Fails OfflineAngular 8 Service Worker 离线失败
【发布时间】:2020-06-09 13:29:40
【问题描述】:

我遇到了与 Linwe 在此处报告的相同或非常相似的问题:Angular : service worker configuration(在提出此问题时没有答案)。

我使用 Angular CLI 创建了一个新项目,然后按照此处列出的步骤添加了对服务工作者的支持:https://angular.io/guide/service-worker-getting-started。我更改了网站的内容,只说“这是应用程序组件”,所以它非常简单,没有任何功能。我只是想单独测试服务人员。

Service Worker 技术使用了一个名为“manifest.webmanifest”的文件,该文件在我的本地 IIS 中没有定义 MIME 类型,因此我添加了它(application/manifest+json)。但即便如此,我的网络浏览器 (Chrome) 也无法始终找到该文件(而是在获取请求时获取 index.html 页面)。但是,根据manifest.json vs manifest.webmanifest,名称中没有什么神奇之处,因此我在文件末尾添加了“.json”,并修改了引用以使用该名称。这似乎工作正常。

在 Visual Studio 2019 中运行(使用 IIS Express,并在 https://localhost:44303/ 上处理请求),根本没有创建服务工作者。当我转到 Chrome 的 DevTools 的 Application 选项卡并寻找 service worker 时,我什么也没看到。

但是当我将站点部署到本地 IIS 时,我可以看到(在 http 或 https 下)服务工作者已创建并正在运行:

当在线运行时,我可以看到服务工作者(如 Linwe)正在提供内容。但是当我转到“网络”选项卡并将浏览器脱机时,我遇到了与根本没有使用服务工作者一样的错误:

在网络选项卡中,我看到一个失败的 fetch 命令(预期??),但我没有看到任何其他错误:

我只为这个(相当简单的)应用程序转向服务工作者,因为 Chrome 将在 4 月停止对 AppCache 的支持。如果服务人员无法在 Chrome 中工作,我不知道还有什么替代方案...

任何帮助将不胜感激。

(我注意到 Linwe 表示他的问题仅出现在 Windows 上运行的浏览器上 - 他说运行在 MAC 上的浏览​​器是可以的。我没有 MAC 来验证它,但该评论暗示了 Windows 特有的一些东西。 )

更新:我完全按照此处列出的步骤重新开始:https://angular.io/guide/service-worker-getting-started。然后我使用 http-server 运行它,一切正常。我把它下线了,刷新了页面,看到了缓存的内容。

然后,我完成了整个项目并将所有文件复制到 Visual Studio 2019 Angular 项目的 ClientApp 文件夹中(首先从该文件夹中删除所有文件后)。然后我将它发布到我的本地 IIS,并遇到了与之前报告的相同的问题。服务工作者已创建并且我可以看到它,但是在离线时我没有得到任何缓存的内容。我所做的 only 更改是对我的 angular.json 文件中的 outputPath,因为我希望它部署到 dist 目录的根目录,而不是 dist 目录下的子文件夹(IIS 找不到它)。

然后,为了进一步实验,我从通过 CLI 创建的原始应用程序中的 dist/[项目名称] 文件夹中复制了所有文件,并将它们放在 IIS 中应用程序文件夹的根目录下(首先删除所有其他文件)。我更改了 index.html 文件的基本 href 以匹配应用程序名称,但没有进行其他更改。而且,我再次看到与最初报告的问题相同的问题 - 我看到了服务人员,但离线时不提供缓存的内容。 (无论我是通过 http 还是 https 访问 IIS 站点,都会发生这种情况 - 没有区别。)

因此,在我看来,当我使用 http-server 为它们提供服务时,完全相同的文件在我的服务器是 IIS(这是在 Windows 10 专业 PC 上)时无法正常运行。

我该去哪里???

【问题讨论】:

    标签: angular windows google-chrome-devtools visual-studio-2019 angular-service-worker


    【解决方案1】:

    好的,事实证明这与 IIS 无关,而是问题的根源与 service worker 注册的范围有关。节点服务器仅在某些端口上与 localhost 一起工作。但在 IIS 中,代码被部署到应用程序,而不仅仅是本地主机(例如,http://localhost/myapplication/)。

    必须为此构建角度解决方案,这可以通过将 baseHref 参数传递给构建命令来完成:

    ng build --prod --baseHref=/myapplication/ 
    

    经过数小时的挖掘,我在这里发现了这一点:https://github.com/angular/angular/issues/29163

    完成此操作后,您可以将生成的文件推送到应用程序指向的文件夹中,并且可以正常工作。

    现在,如果您想将相同的代码部署到其他应用程序,但名称不同,它就行不通了。您不能只更改 index.html 文件的基本 href 值 - 您需要使用要部署到的应用程序名称进行新构建。这在我的特定情况下不是问题,但如果有人希望将相同的代码部署到许多不同的应用程序,每个应用程序都有不同的名称,即 customer1AppInstance、customer2AppInstance 等,我可以看到这是一场噩梦。我本来希望它是仅更改 index.html 文件中的基本 href 就足够了,但并非如此 - 应用程序名称显然已融入生成的 javascript。

    无论如何,它有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-06
      • 1970-01-01
      • 2017-07-06
      • 2020-02-09
      • 2017-01-01
      • 2020-04-23
      • 2017-05-18
      • 2021-01-23
      相关资源
      最近更新 更多