【问题标题】:Javascript versioning to avoid caching, difference in these practices?Javascript 版本控制以避免缓存,这些做法的区别?
【发布时间】:2011-11-22 09:42:54
【问题描述】:

如果我决定使用 javascript 或 css 文件的 last_modified_time,并使用它的 unix 时间戳作为名称中的键,以在文件被修改时破坏缓存。 以下两种做法有什么区别? 文件名是:my_script.js,时间戳是:1321951817

1/ 文件包含为: <script type="text/javascript" src="http://example.com/js/my_script.js?v=1321951817"></script> 因此,每次v 更改时,查询字符串参数都会创建一个新的缓存。

2/ 文件包含为: <script type="text/javascript" src="http://example.com/js/my_script.1321951817.js"></script> 文件名随着每次修改而改变,重写规则删除时间戳并将请求的 url 指向my_script.js

3/ 更新:基于以下答案的另一种方法:文件已重命名并包含为: <script type="text/javascript" src="http://example.com/js/my_script.1321951817.js"></script> 文件名已更改且未使用 REWRITE RULE。

问题:这两种技术本质上是否相同,或者使用查询字符串参数而不是直接文件名有什么优点/缺点。

【问题讨论】:

  • 您也可以使用方法 2) 使用路径名而不是文件名:http://example.com/v-1321951817/js/my_script.js

标签: javascript versioning


【解决方案1】:

使用更新的查询字符串是一个糟糕的解决方案。看看 Steve souders 是怎么说的:http://www.stevesouders.com/blog/2008/08/23/revving-filenames-dont-use-querystring/

理想的方法是重命名文件本身。 有些人更喜欢使用最后修改日期的时间戳,我认为这是一个问题。

在现代 Web 开发中,您确实需要尽可能优化您的页面,这意味着将 css 和 javascript 组合成单个文件,这些文件会被压缩。 这意味着您在流程中引入了构建步骤,并且文件的最后修改时间始终是您的最后一次构建。如果你把它设置为你的文件名,你基本上会一直破坏用户缓存,有时你不需要。

我建议将文件重命名为其内容的 md5 总和。这样您就可以一直进行新的构建,但文件名仅在内容更改时才会更改。这使您的文件名成为内容的标识符。使用它,您可以在所有静态内容上设置一个遥远的未来过期标头,并且不再担心它。

我可以建议为此使用构建系统,因为这个工作流程很快就会变得乏味。 我的公司不久前开源了一个,它在许多其他优化你的网页的事情中做到了这一点:https://github.com/One-com/assetgraph-builder 还有许多其他构建工具可以做到这一点。环顾四周,找到最适合您的开发设置的那个。

【讨论】:

  • "理想的方法是重命名文件本身。"为什么这比重写规则更好?
  • 不使用时间戳的另一个原因是,如果您要部署到多个服务器,最后修改日期可能会更改。使用文件的 MD5 将确保无论您部署到何处或部署到多少位置,它都是一致的。
【解决方案2】:

您自己说的是:在第二个示例中,您使用的是重写规则,该规则使用正则表达式检查您正在加载的每个页面。

第一个只是欺骗浏览器认为它是一个不同的文件。所以第一个是要走的路。

【讨论】:

  • 我同意,第一个选择是要走的路。
  • @baklap 同意你的观点。但是我的版本控制脚本重命名文件是什么,并且没有使用重写规则。那什么更好呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-03
  • 1970-01-01
  • 2015-06-27
  • 2018-10-20
  • 1970-01-01
  • 1970-01-01
  • 2014-04-07
相关资源
最近更新 更多