Web浏览器是否允许以编程方式清除(过期)缓存?

时间:2009-10-23 19:39:36

标签: javascript deployment browser caching

目前浏览器的缓存实现不完整。它只允许设置到期或保持即时到期。缺少以编程方式使缓存过期的重要第三个选项。如果没有第三个选项,开发人员就无法高效可靠地部署新版本的代码。

如果他们使用第二个选项,如果他们有许多小文件的框架,效率很低。将许多小文件合并为一个文件效率不高,因为任何小的更改都将导致部署整个框架而不是单个文件。

如果他们使用第一个选项,则在缓存过期之前不会获得用户,这会在服务器端代码和客户端代码之间以及可能在客户端代码的不同部分之间产生兼容性问题。设置到期需要预测未来部署,这是不方便的,并且将禁止快速修复错误。

当人们询问这个问题时,有些人会建议使用版本号或其他临时ID来通过加载唯一的URL来欺骗浏览器缓存。它的问题在于它为网络和本地文件系统带来了不必要的开销,以加载和存储不必要的旧版本和大量独特的URL。它几乎违背了通过URL缓存的目的。 正确的解决方案是允许网站的程序员清理仅来自该网站的文件的缓存。这样可以请求更新文件列表,并清理新文件的缓存,以允许浏览器加载新版本。

正确的缓存机制是简单而强大的模式,可以将所有Web客户端开发提升到新的水平,我只是想知道为什么浏览器生产者还没有实现它。

8 个答案:

答案 0 :(得分:5)

呵呵,好吧,就我们开发人员而言,当然是这样!

另一方面,缓存用于促进用户在响应性方面的体验。我们有责任解决所有这些滋扰问题,并在无知和健康的环境中保护用户。

答案 1 :(得分:3)

我认为这不容易。我能看到的一个问题是它不仅仅是浏览器缓存。您的文件可以在从服务器到浏览器(客户端)的许多地方缓存。一些浏览器仍然可以使用旧版本,并且问题的答案是哪一个被清除以及应该到这个特定客户端的版本变得非常不确定。

答案 2 :(得分:2)

这是一个有趣的想法,但浏览器如何知道何时询问您的网站是否应清除缓存?每次加载页面?这不会部分地破坏缓存的目的吗?设置合理的缓存到期时间间隔,并安排更新以匹配这些更新,它应该没问题。

答案 3 :(得分:1)

我不认为你的建议是必要或可取的。

客户端缓存应该由用户控制,而不是由您(数据/代码提供者)控制。如果用户想要一种更好的方式来管理他的“临时Internet文件”,那么这取决于浏览器开发人员,但我认为你不应该对如何管理它有发言权。

出于所有意图和目的,您只需要说“此数据/代码在X日期之前可用”,“此数据/代码可用到Y版”,或“它永远不可用”。

可以使用现有的HTTP标头(Cache-Control,ETag等)设置出色的缓存控制策略。如果你想要“强制”刷新某些东西,你总是可以添加一个带有日期的查询字符串。这不是真正的黑客,正如你所建议的那样,因为你说,“从这个日期开始,让我获得该文件的版本”......并且你的服务器拥有全世界刷新缓存策略的所有自由:返回“ 302重定向“到非查询字符串版本,或发送新标题等

修改

我可以从上面改进我的想法:

您可以使用路径或查询字符串来标识“当前”版本:

http://somedomain.com/somepath/current/yourfile.js

可以设置“当前”URL,以便为特定版本的files.js提供302重定向,同时还告诉浏览器永远不要缓存当前版本:

302 Moved Temporarily
Location: /somepath/v3.2.3/yourfile.js
Cache-Control: no-cache;

这允许您的“加载器”HTML包含决定使用某个版本的Javascript:

<script type="text/javascript">
<%php
   if($action == "clearCache") {
        print "var version = 'current';";
   } else {
        print "var version = '" . $version . "';";
   }
%>
</script>

答案 4 :(得分:0)

他们理论上是这样做的,在标题部分和元参数中有缓存参数 (google meta no-cache,PHP / ASP no-cache) 像缓存过期,应该到期的日期等

我同意这在大多数(如果不是全部)浏览器中都很奇怪。 有时它有效,有时由于某种原因它没有或需要更多时间来清除缓存

但是很高兴在脚本中有这个选项,比如javascript或直接在标签上的东西,比如img src =“blah.jpg”expires =“my_blah_last_edited”

它可能更好,真实

答案 5 :(得分:0)

我想有很多安全问题。您有匿名和远程网页告诉本地客户端删除客户端计算机上的文件 - 这有各种各样的灾难可能性。你会相信IE会这样做吗?这听起来太危险了。首先不缓存某些内容的指令与从缓存中删除已存在的内容的指令之间存在很大差异。

答案 6 :(得分:0)

为什么不在每个部署的图像等uri中嵌入某种唯一标记或时间戳,从而导致浏览器重新加载?

答案 7 :(得分:0)

应该有一个javascript或jquery告诉浏览器内容已被更改并再次下载,即使内容的网址相同..