Angular服务工作者和index.html缓存

问题描述 投票:4回答:2

虽然有类似的帖子,但我找不到清晰的答案如果应该缓存index.html使用Cache-Control标头。

如果我错了,请纠正我,但现在我将Cache-Control: no-store返回index.html,以避免散列不匹配错误,该错误会导致服务工作者进入降级模式。

[我认为,如果将具有index.htmlCache-Control: max-age=3600缓存在CDN服务器上,并且该应用程序将在缓存过期之前进行更新,则ngsw.json将返回与脚本文件相比不同的文件散列,包括index.html中的脚本文件和错误的文件事情会发生的。对吧?

此外,为了清楚起见,我注意到有些人index.html添加到ngsw-config.json,这也没有意义,因为index.html是在服务工作者之前加载的。

angular caching service-worker cache-control angular-service-worker
2个回答
0
投票

我不是这方面的专家,但是我很确定以下链接将帮助您解决疑问。

https://angular.io/guide/service-worker-getting-started#whats-being-cached

正在缓存什么?

注意,浏览器呈现此应用程序所需的所有文件均已缓存。设置ngsw-config.json样板配置以缓存CLI使用的特定资源:

  • index.html。

  • favicon.ico。

  • 构建工件(JS和CSS包)。

  • 资产下的任何东西。

  • 图像和字体直接位于配置的outputPath(默认为./dist//)或resourcesOutputPath下。查看ng build有关这些选项的更多信息。

并且下面的链接包含有关Service worker and caching of app resources的信息。我想从中阅读有关App versionsUpdate checksResource integrity的信息。

https://angular.io/guide/service-worker-devops#service-worker-and-caching-of-app-resources

我也在这里粘贴了这三个部分的内容,只是为了避免使此答案成为“仅链接的答案”

App版本

在Angular服务工作者的上下文中,“版本”是代表Angular应用程序特定版本的资源集合。每当部署新版本的应用程序时,服务工作人员都会将该版本视为新版本的应用程序。即使仅更新一个文件,也是如此。在任何给定时间,服务工作者都可以在其缓存中拥有该应用程序的多个版本,并且可以同时为它们提供服务。有关更多信息,请参见下面的“应用程序”选项卡部分。

为了保持应用程序的完整性,Angular服务工作人员将所有文件分组为一个版本。分组为一个版本的文件通常包括HTML,JS和CSS文件。这些文件的分组对于完整性至关重要,因为HTML,JS和CSS文件经常相互引用并且依赖于特定的内容。例如,index.html文件可能具有引用bundle.js的标签,并且可能尝试从该脚本中调用函数startApp()。每当提供此版本的index.html时,都必须为其提供相应的bundle.js。例如,假设两个文件中的startApp()函数都重命名为runApp()。在这种情况下,服务于调用startApp()的旧index.html和定义runApp()的新捆绑包是无效的。

此文件的完整性在延迟加载模块时尤其重要。 JS捆绑包可能引用许多惰性块,并且这些惰性块的文件名对于特定的应用程序版本而言是唯一的。如果正在运行的版本X的应用程序尝试加载惰性块,但服务器已更新至版本X + 1,则惰性加载操作将失败。

应用程序的版本标识符由所有资源的内容确定,如果其中任何一个发生更改,它就会更改。实际上,版本由ngsw.json文件的内容确定,其中包括所有已知内容的哈希值。如果任何缓存的文件发生更改,则ngsw.json中的文件哈希将发生更改,从而导致Angular服务工作人员将活动文件集视为新版本。

[通过Angular Service Worker的版本控制行为,应用服务器可以确保Angular应用始终具有一致的文件集。

更新检查

[每次用户打开或刷新应用程序时,Angular服务工作人员都会通过查找ngsw.json清单的更新来检查应用程序的更新。如果找到更新,则将自动下载并缓存该更新,并将在下次加载应用程序时将其提供。

资源完整性

长缓存的潜在副作用之一是无意中缓存了无效资源。在普通的HTTP缓存中,硬刷新或缓存过期限制了缓存无效文件的负面影响。服务工作人员会忽略此类约束,并有效地长时间缓存整个应用程序。因此,至关重要的是服务人员必须获取正确的内容。

为了确保资源完整性,Angular服务工作程序会验证其具有哈希值的所有资源的哈希值。通常,对于使用Angular CLI创建的应用程序,这是dist目录中用户src / ngsw-config.json配置覆盖的所有内容。

如果特定文件未通过验证,Angular服务工作人员将尝试使用“缓存无效” URL参数重新获取内容,以消除浏览器或中间缓存的影响。如果该内容也未通过验证,则服务工作者将认为该应用程序的整个版本无效,并停止提供该应用程序。如有必要,服务人员将进入安全模式,在该模式下,请求会回退到网络上,如果服务无效,损坏或过时的内容的风险很高,则选择不使用其缓存。

散列不匹配可能由于多种原因发生:

  • 在源服务器和最终用户之间缓存层可以提供过时的内容。
  • 非原子部署可能会导致角度服务工作者的可见性已部分更新内容。
  • 构建过程中的错误可能会导致更新无需更新ngsw.json的资源。相反也可以导致更新的ngsw.json没有更新的资源。

0
投票

我认为您有必要了解Angular应用程序生命周期和Angular Service Worker运行时缓存机制。所以我将在这里写下有关它们的信息。这将对您的理解有所帮助。

((对于您的问题,我想说是。)

Angulars开始执行以下步骤。

  • Angular以main.ts开头。
  • Angular应用程序已启动,并且app.module.ts作为参数传递。
  • 和Angular分析应用程序组件,读取那里传递的设置,并且有SELECTOR应用程序根。
  • 现在,Angular可以处理index.html中的app-root,并且知道SELECTOR的规则。
  • SELECTOR应该插入应用程序组件并具有一些HTML代码-附加到他的模板-html组件。

Angular ServiceWorker

Angular CLI还在Angular应用程序根模块中包含了服务工作者模块。 CLI还添加了一个名为ngsw-config.json的新配置文件,用于配置AngularService Worker运行时行为,并且生成的文件随附一些智能的默认值。这里有很多事情,所以让我们逐步分解。该文件包含默认缓存行为或Angular Service Worker(针对应用程序静态资产文件:index.htmlCSSJavascript捆绑包。

<< [Angular Service Worker可以将所有内容缓存在浏览器缓存存储。这是基于Javascript的键/值缓存机制与标准浏览器无关Cache-Control机制,并且两种机制可以分别使用。

应用程序部分下的文件是应用程序:由其

index.html

加上其CSSJs捆绑包。这些文件对于应用程序的每个页面都是必需的,并且无法被延迟加载对于这些文件,我们希望尽早缓存它们,尽可能永久地保存,这就是

app caching配置

。应用程序文件将被主动由Service Worker下载并安装在后台,这就是安装方式预取的意思。 服务worker不会等待服务器请求这些文件应用程序,它将提前下载它们缓存它们,以便它可以在下次请求它们]时为它们提供服务。这是采用以下策略的好策略:一起构成应用程序本身(index.htmlCSSJavascript包),因为我们已经知道我们将一直需要它们。
© www.soinside.com 2019 - 2024. All rights reserved.