Javascript版本控制以避免缓存,这些做法有何不同?

时间:2011-11-22 09:42:55

标签: javascript versioning

如果我决定使用javascript或css文件的last_modified_time,并使用它的unix时间戳作为修改文件时胸围缓存的名称中的键。 以下两种做法有什么区别? filename是: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> 文件名随每次修改而变化,重写规则会删除时间戳并将请求的网址指向my_script.js

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

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

2 个答案:

答案 0 :(得分:22)

使用更新的查询字符串是一个糟糕的解决方案。看看史蒂夫博士对此有何看法:http://www.stevesouders.com/blog/2008/08/23/revving-filenames-dont-use-querystring/

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

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

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

我可以推荐使用构建系统,因为这个工作流程很快。 我的公司前一段时间开源,在优化您的网页的许多其他事情中执行此操作:https://github.com/One-com/assetgraph-builder 还有许多其他构建工具也可以这样做。环顾四周,找到最适合您的开发设置的那个。

答案 1 :(得分:6)

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

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