最近我们的团队正在进行快速更新,因此我的angular
应用程序不断地变化。
由于缓存的原因,我们的客户端并不总是具有最新版本的代码。
那么,在angular
中是否有一种方法可以强制浏览器清除缓存呢?
最近我们的团队正在进行快速更新,因此我的angular
应用程序不断地变化。
由于缓存的原因,我们的客户端并不总是具有最新版本的代码。
那么,在angular
中是否有一种方法可以强制浏览器清除缓存呢?
如上所述,解决浏览器缓存问题的常见方法是给加载的资源文件添加某种版本令牌(版本号、时间戳、哈希值等)。这适用于用户加载页面或重新加载页面的情况。像 gulp 任务、WebPack、一些后端框架(如 Asp.net MVC 等)都支持这个功能以及打包、最小化、混淆等特性。最好使用它们来解决其他相关问题。
但是,它们不能解决的一个问题是在后端更改(部署)主页面本身和已加载的文件时更新它们。例如,当其他用户在不重新加载页面的情况下访问您的单个页面时,您部署了应用程序。或者用户在浏览器选项卡中开着应用程序并在一小时后回到该页面。在这种情况下,一些已经加载的文件(包括主页)是旧的,而一些在后端方面是新的。此外,所有已加载的文件对于可能在后端不存在但在浏览器缓存中已存在的文件具有旧的引用。因此,在总体上,您的应用程序出现了问题,这实际上是 Angular 本身无法解决的更普遍的问题。
为了解决这个问题,您需要通知用户存在新的应用程序版本,并要求他们重新加载页面或强制刷新页面。从用户体验的角度来看,第二种方法并不好。想象一下在工作时某个时刻页面开始重新加载。很奇怪,对吧?
为了通知用户有新版本可用,您可以使用 WebSockets 消息将新版本信息发送到应用程序,将版本传递给每个响应(不是好的解决方案)或定期从后端拉取新版本(也不是很好)。但它们都不是简单的解决方案。如果您的应用程序登录会话很短,则可以在重新登录时检查版本、刷新身份验证 cookie 等。
因此,要完全解决这个问题,您需要实现文件打包 + 新版本用户通知机制。
public string GetVersionApp => System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString();
<script type="text/javascript" src="App/RequestsList/directives/comment-directive.js?<%=GetVersionApp%>"></script>
使用此解决方案,您的文件仅在发生新构建时重新加载。
?ver=timestamp
添加到 URL 中,或者像 ^ 所说的那样添加到脚本中。 - Razvan Dumitru