2008-12-10 40 views
10

我正在研究这个项目,我想知道其他人正在做什么来防止陈旧的CSS和JavaScript文件与每个新版本一起提供。我不想追加时间戳或类似的东西,这可能会阻止每个请求的缓存。什么是防止陈旧的CSS和JavaScript的最佳实践

我正在使用Spring 2.5 MVC框架,我已经在使用google api来提供原型和scriptaculous。我也在考虑使用Amazon S3和新的Cloudfront产品来最大限度地减少网络延迟。

回答

14

我一个参数添加到使用版本号的要求,是这样的:

<script type="text/javascript" src="/path/to/script.js?ver=456"></script> 

的“版本”参数与每个版本自动更新(从文件中读取,它构建更新)。这可以确保只对当前版本缓存脚本。

+0

最好的解决办法是最简单:)谢谢 – Mike 2010-10-09 21:42:19

1

使用conditional get请求与If-Modified-Since

1

这其实是一个很难的问题,以及东西,你可以花一段时间工。正确的解决方案。

我会建议使用内置的URL时间戳和/或版本发布的文件,这样,而不是:

/media/js/my.js你结束了:

/媒体/ js/v12/my.js或类似的东西。

您可以使用任何工具自动执行版本控制/时间戳。

这有附加好处,就是在您推出新版本时不会破坏站点,并且可以进行真正的并行测试(不同于只删除版本并发回最新文件的重写规则)。

有一点要注意的JS或CSS是当你需要包含依赖的URL(背景图像等)时,你需要确保JS/CSS的时间戳/版本改变,如果内部的资源(以及作为重写它们,但这是可能的一个非常简单的正则表达式和资源清单)。

无论你做什么,都要确保不要折腾vblah到最后,因为当你这样做时,基本上会抛出窗口缓存(这是不幸的,因为它是迄今为止最简单的处理方法)

0

如果您将文件的“修改时间”作为时间戳记,它将被缓存直到文件被修改。只需使用助手函数(或其他框架中调用的任何函数)来添加从文件获取时间戳的script/css/image标记。在unix系统上(绝大多数超级用户),你可以简单地使用touch这些文件来强制修改时间以便在必要时进行更改。

Ruby on Rails在生产模式下使用此策略(默认情况下我是beleave),并在开发模式下使用正常的时间戳(以确保某些内容没有被缓存)。

2

关于缓存文件,我还没有遇到任何与使用querystring方法的失效缓存文件相关的错误问题。

然而,关于性能和呼应Todd B的提按文件名转速时,请确认了史蒂夫Souders的“工作更多的题目

“鱿鱼,一个流行的代理,不使用查询字符串缓存资源,当代理缓存后面的多个用户请求同一个文件时,这会损害性能 - 而不是使用缓存版本,每个人都必须向原始服务器发送请求。

“代理服务器管理员可以更改配置,支持缓存资源,查询字符串,当缓存头表示是合适的,但默认配置是开发商应该期望最常遇到什么网站。”

http://www.stevesouders.com/blog/2008/08/23/revving-filenames-dont-use-querystring/

4

像@埃伦 - 加尔佩林,我用一个参数的参考JS文件,但我有一个服务器生成的参考文件的“上次修改”日期。 @ stein-g-strindhaug建议这种方法。这将是这个样子:

<script type="text/javascript" src="/path/to/script.js?1347486578"></script> 

服务器忽略的参数为静态文件和客户端可以缓存脚本,直到日期代码的变化。如果(且仅当)您修改服务器上的JS文件,则日期代码将自动更改。

例如,在PHP中,我的脚本来创建此代码如下所示:

function cachePreventCode($filename) { 
    if (!file_exists($filename)) 
     return ""; 
    $mtime = filemtime($filename); 
    return $mtime; 
} 

所以,那么当你的PHP文件包含一个CSS文件的引用,它可能是这样的:

<link rel="stylesheet" type="text/css" href="main.css?<?= cachePreventCode("main.css") ?>" /> 

...这将创造...

<link rel="stylesheet" type="text/css" href="main.css?1347489244" /> 
0

如果你使用Maven,你可以利用这一点,加上你p om.xml:

<properties> 
    <maven.build.timestamp.format>yyyyMMddHHmm</maven.build.timestamp.format> 
    <timestamp>${maven.build.timestamp}</timestamp> 
</properties> 

有了这个,你可以在你的视图中获得$ {timestamp}。 喜欢这个样本:

<script type="text/javascript" src="/js/myScript.js?t=${timestamp}"></script>