2015-04-14 20 views
9

我正在处理一个Angular.js页面,并对html'partial'进行了修改。刷新页面会导致Firefox从服务器正确地重新请求主html页面,但后续的呈现客户端的“部分”模板不会被重新请求,而是从BFCache中获取,因此对这些文件的更改不是检测。从萤火虫如何强制Firefox绕过用于Angular.JS partials的BFCache?

截图: BFCache firebug screenshot

我可以通过开发服务器(Django的),这些谐音永远不会要求确认。

我试过了各种刷新,包括Reload Plus扩展名。

+0

你看过[这](http://stackoverflow.com/questions/7248111/how-to-prevent-content-being-displayed-from-back-forward-cache-in-firefox)?您是否仍在尝试为这些部分使用BFCache,或者可以完全禁用BFCache吗? – Charlie

+0

我实际上想使用BFCache,我只想在开发过程中偶尔告诉Firefox清除缓存并重新加载特定(或全部)部分。 – GDorn

回答

5

这些都不太理想,但有两个选择似乎解决了这个问题。

一个是Clear Cache插件,它可以配置为清除磁盘和内存缓存并重新加载当前选项卡。我不确定这是否会完全清除缓存或仅用于当前选项卡的域,但可能是整个缓存。

另一种是禁用萤火浏览器的缓存:firebug disable cache

我不知道,如果这仅仅关闭当前页面,当前域,或到处缓存。

有一个'重新加载此页面和此页面引用的所有内容'选项仍然很好。

1

我只想设置一个标志,在模板中添加一个简单的onunload的功能是这样的:

{% if CLEARBFCACHE %} <body onunload="myFunction()"> {% endif %} 

然后设置CLEARBFCACHE = 1(settings.py中)在开发的时候。

如果您需要测试生产集CLEARBFCACHE = 0,然后部署到您的登台服务器或(如果您没有单独的服务器),我相信您可以将url从127.0.0.1更改为locahost以使Firefox认为这是一个不同的网站。

0

另一种选择是让你开发的Web服务器至少HTML文件发送一个Cache-Control头:

Cache-Control: no-cache, max-age=0, must-revalidate, no-store 

来源:How to Defeat the Browser Back Button Cache

然后将所有文件从开发服务器提供永远被缓存,但来自例如文件CDN将被缓存,所以您不必在每次刷新时检索这些内容。

0

因为您正在制作单页应用程序。所以正确的解决方案应该是:(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', 
+0

如何将物理页面(即主页面)设置为“Cache-Control:No-cache”?我读过标签不起作用,我没有与他们的运气。 – CDelaney

1

另一种选择是,以包括所述部分以下面的方式:

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'''行而不是其他返回行。