我正在处理一个Angular.js页面,并对html'partial'进行了修改。刷新页面会导致Firefox从服务器正确地重新请求主html页面,但后续的呈现客户端的“部分”模板不会被重新请求,而是从BFCache中获取,因此对这些文件的更改不是检测。从萤火虫如何强制Firefox绕过用于Angular.JS partials的BFCache?
截图:
我可以通过开发服务器(Django的),这些谐音永远不会要求确认。
我试过了各种刷新,包括Reload Plus扩展名。
我正在处理一个Angular.js页面,并对html'partial'进行了修改。刷新页面会导致Firefox从服务器正确地重新请求主html页面,但后续的呈现客户端的“部分”模板不会被重新请求,而是从BFCache中获取,因此对这些文件的更改不是检测。从萤火虫如何强制Firefox绕过用于Angular.JS partials的BFCache?
截图:
我可以通过开发服务器(Django的),这些谐音永远不会要求确认。
我试过了各种刷新,包括Reload Plus扩展名。
这些都不太理想,但有两个选择似乎解决了这个问题。
一个是Clear Cache插件,它可以配置为清除磁盘和内存缓存并重新加载当前选项卡。我不确定这是否会完全清除缓存或仅用于当前选项卡的域,但可能是整个缓存。
另一种是禁用萤火浏览器的缓存:
我不知道,如果这仅仅关闭当前页面,当前域,或到处缓存。
有一个'重新加载此页面和此页面引用的所有内容'选项仍然很好。
我只想设置一个标志,在模板中添加一个简单的onunload的功能是这样的:
{% if CLEARBFCACHE %} <body onunload="myFunction()"> {% endif %}
然后设置CLEARBFCACHE = 1(settings.py中)在开发的时候。
如果您需要测试生产集CLEARBFCACHE = 0,然后部署到您的登台服务器或(如果您没有单独的服务器),我相信您可以将url从127.0.0.1更改为locahost以使Firefox认为这是一个不同的网站。
另一种选择是让你开发的Web服务器至少HTML文件发送一个Cache-Control头:
Cache-Control: no-cache, max-age=0, must-revalidate, no-store
来源:How to Defeat the Browser Back Button Cache
然后将所有文件从开发服务器提供永远被缓存,但来自例如文件CDN将被缓存,所以您不必在每次刷新时检索这些内容。
因为您正在制作单页应用程序。所以正确的解决方案应该是:(1)将物理页面(即主页面)设置为“缓存控制:无缓存”。 物理页面应该很小,因为逻辑页面全部是由JavaScript动态加载的,因此加载物理页面本身应该是快速的,因此对于“部分”页面(即逻辑页面),每次更改文件夹名称当您发布新版本时,
例如:部署新版本时,假定物理页面是索引。html
在index.html中,所有JavaScript,css和angularJs模板文件都在文件夹asset - {{TimeStamp}}中。 因为index.html没有缓存,所以浏览器总是会得到最新的index.html。 因为所有JS,CSS和其他模板html文件都与上一版本位于不同的文件夹中。 因此浏览器将加载新文件夹中的所有文件,而不是从缓存中加载。
您可以创建一个构建过程自动执行: 在index.html中搜索所有js,css文件,并将资产名称asset/**替换为asset - {{TimeStamp}}/**,然后将所有文件资产文件夹中的{{TimeStamp}}
现在您没有头痛缓存问题,但浏览器确实利用本地缓存来加速您的网页。 (3)对于angularJs模板文件,因为它也是由JS加载的,所以我们强烈建议你使用相对路径(与当前运行的JS代码相关)来获取它。 一些示例JS这样的代码:
function _getCurrentJSPath() {
var scripts = document.getElementsByTagName("script");
var currentFile = scripts[scripts.length - 1].src;
var currentPath = currentFile.substr(0, currentFile.lastIndexOf('/')) + "/";
return currentPath;
}
...
templateUrl: _getCurrentJSPath() + 'currencyField.html',
如何将物理页面(即主页面)设置为“Cache-Control:No-cache”?我读过标签不起作用,我没有与他们的运气。 – CDelaney
另一种选择是,以包括所述部分以下面的方式:
angular
.module("app")
.directive("appPartial", function() {
return {
templateUrl: "partials/partial1.htm"+getTempStr(),
restrict: "E",
scope: {},
controller: PartialController,
controllerAs: "vm"
}
});
function getTempStr(){
// dev
return "?a=" + (new Date().getTime()).toString();
// prod
//return "";
}
这每次局部方式被装载它不会被存储在BFCache。
要在生产环境中使用BFCache,您可以取消注释'return'''行而不是其他返回行。
你看过[这](http://stackoverflow.com/questions/7248111/how-to-prevent-content-being-displayed-from-back-forward-cache-in-firefox)?您是否仍在尝试为这些部分使用BFCache,或者可以完全禁用BFCache吗? – Charlie
我实际上想使用BFCache,我只想在开发过程中偶尔告诉Firefox清除缓存并重新加载特定(或全部)部分。 – GDorn