我认为我已成功缓存广告,并将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始终来自服务器?
答案 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。可能有以下几个原因:
unrecoverable
属性,该属性是订阅的 Observable 以处理这些情况(通常,重新加载文档会正确重新加载应用程序)。有关更多信息,请参阅 angular 文档:https://angular.io/guide/service-worker-intro