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

Dhr*_*hak 15 javascript versioning

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

1/File包含在: <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> 文件名被更改并且使用NO REWRITE RULE.

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

Mun*_*ter 22

使用更新的查询字符串是一个糟糕的解决方案.看看Steve Souders对此有何看法: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 还有许多其他的构建工具也是如此.环顾四周,找到最适合您的开发设置的那个.

  • 不使用时间戳的另一个原因是,如果要部署到多个服务器,则上次修改日期可能会更改.使用文件的MD5将确保无论您部署到何处或有多少位置,它都是一致的. (3认同)

bak*_*lap 6

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

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