angular-cli的输出散列总是应该与延迟加载的模块一起使用吗?

时间:2018-03-13 23:24:10

标签: angular angular-cli

我认为我已成功缓存广告,并将angular-cli的--output-hashing选项设置为all,以确保用户获得最新的块/更新。我意识到这并不总是适用于延迟加载的模块。

如果我将更改为延迟加载模块+ build + deploy到IIS,并转到属于延迟加载模块的URL,那么我会按预期获得最新更改

但是,如果我关闭并重新打开浏览器并转到不属于延迟加载模块的URL,然后单击一个链接,将我带到延迟加载的模块,最新的更改是没有观察到。

这几乎就像浏览器假设每当我从一个没有改变的模块进入应用程序时没有任何改变,并且当我访问该模块时没有取出新的块 已更改。

更奇怪的是,当我试图复制问题以提供一些屏幕截图时,问题就消失了。

是否有其他人使用输出哈希与缓存清除不一致?

修改

经过调查后,事实证明,如果我进入我的网站[IP地址]:[端口]的登录页面,那么index.html来自缓存。

相反,如果我转到任何其他路由[IP地址]:[port] / [route],则index.html来自服务器。

由于index.html指向内联。(hash).bundle.js,它反过来指向延迟加载的模块,获取index.html的旧副本会导致获取旧版本的inline.js和其他模块。

我尝试将<meta http-equiv="expires" content="0" />添加到index.html并清除浏览器缓存,但仍然从缓存中获取该文件。

我也尝试在web.config中添加一个部分,但这也不起作用。

如何确保index.html始终来自服务器?

enter image description here

2 个答案:

答案 0 :(得分:2)

我认为你的答案可以在这个与SO相关的问题中找到。

How to disable caching of single page application HTML file served through IIS?

此外,根据Mozilla Docs,您应该将Cache-Control标头设置为:no-cache, no-store, must-revalidate

答案 1 :(得分:0)

是的,angular cli 输出散列总是应该与延迟加载的模块一起使用。

如果 angular 尝试加载服务器上不再存在的惰性模块,那么它可能加载了过时的 index.html。可能有以下几个原因:

  • Service Worker 更新期间发生错误,导致应用处于不可恢复状态。 SwUpdate 服务现在有一个 unrecoverable 属性,该属性是订阅的 Observable 以处理这些情况(通常,重新加载文档会正确重新加载应用程序)。
  • angular sw 轮询的 ngsw.json 文件缓存在客户端和服务器之间,或者在构建过程中没有正确更新。

有关更多信息,请参阅 angular 文档:https://angular.io/guide/service-worker-intro

延迟模块加载问题参考https://github.com/angular/angular/issues/28114