代码之家  ›  专栏  ›  技术社区  ›  grom

如何使浏览器看到CSS和JavaScript更改?

  •  45
  • grom  · 技术社区  · 17 年前

    CSS和JavaScript文件不会经常更改,所以我希望它们被Web浏览器缓存。但我也希望Web浏览器可以查看对这些文件所做的更改,而无需用户清除其浏览器缓存。还需要一个与版本控制系统(如Subversion)一起工作良好的解决方案。


    我看到的一些解决方案包括以查询字符串的形式向文件末尾添加版本号。

    可以使用SVN版本号为您自动执行此操作: ASP.NET Display SVN Revision Number

    你能具体说明你如何包括 Revision 另一个文件的变量?在HTML文件中,我可以在css或javascript文件的URL中包含修订号。

    Subversion book 它提到了修订:“这个关键字描述了最后一个已知的修订,在这个修订中,这个文件在存储库中发生了更改。”

    火狐也允许按下 CTRL + R 重新加载特定页面上的所有内容。

    为了澄清,我正在寻找不需要用户做任何事情的解决方案。

    5 回复  |  直到 8 年前
        1
  •  22
  •   Markus Safar    9 年前

    我发现,如果您将文件最后一次修改的时间戳附加到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";
    }
    
        2
  •  10
  •   Community CDub    8 年前

    我看到的一些解决方案包括以查询字符串的形式向文件末尾添加版本号。

    <script type="text/javascript" src="funkycode.js?v1">
    

    您可以使用SVN版本号来自动执行此操作 for you 包括这个词 上次更改版本 在HTML文件中v1出现在上面之后。您还必须设置存储库才能执行此操作。

    我希望这能进一步澄清我的答案?

    火狐也允许按下 CTRL + R 重新加载特定页面上的所有内容。

        3
  •  7
  •   Alexander Elgin    8 年前

    在我看来,最好将版本号作为文件本身的一部分,例如 myscript.1.2.3.js . 您可以将Web服务器设置为永久缓存此文件,并在有新版本时添加一个新的JS文件。

        4
  •  6
  •   Justin Sheehy    17 年前

    当您发布新版本的CSS或JS库时,会导致以下情况发生:

    1. 修改文件名以包含唯一的版本字符串
    2. 修改引用库的HTML文件以指向版本化文件

    (对于发布脚本来说,这通常是一个非常简单的问题)

    现在,您可以将CSS/JS的过期时间设置为未来几年。每当更改内容时,如果引用HTML指向新的URI,浏览器将不再使用旧的缓存副本。

    这将导致所需的缓存行为,而不需要用户的任何内容。

        5
  •  6
  •   Michelle    17 年前

    当我找到格罗姆的答案时,我还在想怎么做。谢谢你的密码。

    我很难理解该如何使用代码。(我不使用版本控制系统。)总之,当您调用样式表时,会包含时间戳(TS)。您不打算经常更改样式表:

    <?php 
        include ('grom_file.php');
        // timestamp on the filename has to be updated manually
        include_css('_stylesheets/style.css?ts=20080912162813', 'all');
    ?>