gro*_*rom 53 javascript css caching http
CSS和Javascript文件不会经常更改,因此我希望它们可以通过Web浏览器进行缓存.但我还希望Web浏览器能够看到对这些文件所做的更改,而无需用户清除其浏览器缓存.还需要一个适用于版本控制系统(如Subversion)的解决方案.
我见过的一些解决方案涉及以查询字符串的形式在文件末尾添加版本号.
可以使用SVN修订版号为您自动执行此操作:ASP.NET显示SVN修订版号
你能指定如何包含另一个文件的Revision变量吗?那是在HTML文件中,我可以在CSS或Javascript文件的URL中包含修订号.
在Subversion的书中,它说的是Revision:"这个关键字描述了这个文件在存储库中发生变化的最新已知修订版本".
Firefox还允许按CTRL+ R重新加载特定页面上的所有内容.
澄清我正在寻找不需要用户做任何事情的解决方案.
gro*_*rom 25
我发现如果您将文件的最后修改时间戳附加到URL的末尾,浏览器将在修改文件时请求这些文件.例如在PHP中:
function urlmtime($url) {
$parsed_url = parse_url($url);
$path = $parsed_url['path'];
if ($path[0] == "/") {
$filename = $_SERVER['DOCUMENT_ROOT'] . "/" . $path;
} else {
$filename = $path;
}
if (!file_exists($filename)) {
// If not a file then use the current time
$lastModified = date('YmdHis');
} else {
$lastModified = date('YmdHis', filemtime($filename));
}
if (strpos($url, '?') === false) {
$url .= '?ts=' . $lastModified;
} else {
$url .= '&ts=' . $lastModified;
}
return $url;
}
function include_css($css_url, $media='all') {
// According to Yahoo, using link allows for progressive
// rendering in IE where as @import url($css_url) does not
echo '<link rel="stylesheet" type="text/css" media="' .
$media . '" href="' . urlmtime($css_url) . '">'."\n";
}
function include_javascript($javascript_url) {
echo '<script type="text/javascript" src="' . urlmtime($javascript_url) .
'"></script>'."\n";
}
Run Code Online (Sandbox Code Playgroud)
Gat*_*ler 10
我见过的一些解决方案涉及以查询字符串的形式在文件末尾添加版本号.
<script type="text/javascript" src="funkycode.js?v1">
Run Code Online (Sandbox Code Playgroud)
您可以使用SVN修订版号为您自动执行此操作,方法是在您的html文件中包含单词LastChangedRevision,之后v1出现在上面.您还必须设置存储库才能执行此操作.
我希望这进一步澄清我的答案?
Firefox还允许按CTRL+ R重新加载特定页面上的所有内容.
当您发布新版本的CSS或JS库时,会导致以下情况发生:
(对于发布脚本,这通常是一件非常简单的事情)
现在,您可以将CSS/JS的Expires设置为未来几年.每当您更改内容时,如果引用HTML指向新URI,浏览器将不再使用旧的缓存副本.
这会导致您需要的缓存行为,而不需要用户的任何内容.
当我找到格罗姆的答案时,我也想知道如何做到这一点.谢谢你的代码.
我很难理解代码应该如何使用.(我不使用版本控制系统.)总之,您在调用样式表时包含时间戳(ts).您不打算经常更改样式表:
<?php
include ('grom_file.php');
// timestamp on the filename has to be updated manually
include_css('_stylesheets/style.css?ts=20080912162813', 'all');
?>
Run Code Online (Sandbox Code Playgroud)