目标: 目标是让最终用户无需手动清除缓存即可查看更新的网站。
设置: 客户端:Angular 1.4 服务器端:Azure Web Apps 部署方法:Azure链接到bitbucket帐户上的分支,并检测从git推送到此帐户的更新。
问题: 质量保证报告称她无法看到更新。我提到这可能是缓存并清除缓存以查看以下网站中提到的更新:
她指出,本网站的用户不会知道清除缓存以查看更新(即使它就像按ctrl + shift + r一样简单)。
尝试解决问题的研究和步骤:
我研究了这个主题,并在index.html中添加了以下元标记以停止缓存:
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />
我通过更新页面的标题测试了这个更改,这似乎在她的最终工作,因为页面标题更新,而不需要清除她的缓存。但是,今天QA报告该页面显示不正确,她需要刷新缓存以正确查看页面。在模型/视图/任何结构中进行了很多更改,因此我无法确定结构中发生这种突破性更改的位置。
对我而言,这似乎是用户查看网站更新的一个非常常见的要求。最终用户自动查看网站更新的最佳做法是什么?我非常感谢您提供的任何有用的建议或步骤。
答案 0 :(得分:0)
这应该可以解决您的问题。我在这里找到了: https://www.reddit.com/r/angularjs/comments/3j77a2/prevent_browser_template_caching/
$httpProvider.interceptors.push(['constants', function(constants){
return {
request: function(config){
if(config.url.indexOf('partials/') > -1){
var separator = config.url.indexOf('?') === -1 ? '?' : '&';
config.url = config.url + separator + 'c=' + constants.cache;
}
return config;
}
};
}]);
这将为您的请求添加缓存清除参数以获取模板文件。该示例查找了对/partials
的所有来电,但我建议更改此内容以查找以.html
结尾的请求。
执行此操作的简单方法是使用+new Date()
而不是constants.cache
。这样它将始终拉出最新版本的模板文件。如果您在模板文件尚未更改时不关心缓存模板文件,则可以轻松解决此问题。
$httpProvider.interceptors.push([function(){
function endsWith(str, suffix) {
return str.indexOf(suffix, str.length - suffix.length) !== -1;
}
return {
request: function(config){
if(!endsWith(config.url, '.html')) return config;
config.url = config.url + '?c=' +new Date();
return config;
}
};
}]);
答案 1 :(得分:0)
如果提供的.html文件有缓存控制标头告诉他们缓存它,浏览器应该只缓存部分内容。
此答案显示了阻止任何缓存所需的标头:How to control web page caching, across all browsers?
这只适用于当然。已缓存部分内容的用户需要刷新。
为了减少服务器上的负载,您可能需要修改标头,例如缓存一天或1小时,或满足您的发布周期/用户要求的任何内容。
我不认为您使用HTML元标记的方法在这种情况下会起作用,因为浏览器将部分内容加载/呈现为html页面作为普通页面管道的一部分。它们是异步加载的,由Angular编译。因此,您需要将缓存控制置于较低级别(即标题上)。这可能是浏览器特定的,但如果它们不起作用,我希望这就是原因。
答案 2 :(得分:0)
如果视图显示不正确,则这是css和/或javascript问题(浏览器缓存css和js)。最简单的解决方法是随机编号,或者在我的情况下,我将我的网页版本放在我的css和js文件中,并在我更新我的网站时更改它
myweb.com/style.css?v=11009
如果版本发生变化,您的客户端浏览器将始终检索您的网站css(因为浏览器会认为它们是两个不同的文件)