【问题标题】:How can I make the browser see CSS and Javascript changes?如何让浏览器看到 CSS 和 Javascript 更改?
【发布时间】:2010-09-05 10:00:50
【问题描述】:

CSS 和 Javascript 文件不会经常更改,因此我希望它们被 Web 浏览器缓存。但我也希望 Web 浏览器能够查看对这些文件所做的更改,而无需用户清除浏览器缓存。还需要一个与 Subversion 等版本控制系统配合良好的解决方案。


我见过的一些解决方案涉及以查询字符串的形式在文件末尾添加版本号。

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

您能否指定如何包含另一个文件的Revision 变量?那就是在 HTML 文件中,我可以在 CSS 或 Javascript 文件的 URL 中包含修订号。

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

Firefox 还允许按 CTRL+R 重新加载特定页面上的所有内容。

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

【问题讨论】:

    标签: javascript css http caching


    【解决方案1】:

    我发现如果您将文件的最后修改时间戳附加到 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";
    }
    

    【讨论】:

    • 嗨,格罗姆,我试过这个方法。但是,我发现一旦我包含参数,浏览器就没有缓存 css 文件。每次我重新访问页面而不缓存它时,它都会加载 css 文件。我通过不断更改 css 文件以查看 css 文件是否被浏览器缓存来检测到这一点。我正在使用铬。我可以知道如何让浏览器缓存css文件并仅在参数更改时加载吗?谢谢。
    • @benmsia,您查看过请求 CSS 文件时返回的 HTTP 标头吗?
    【解决方案2】:

    我见过的一些解决方案涉及以查询字符串的形式在文件末尾添加版本号。

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

    您可以使用 SVN 修订号自动执行此 for you,方法是在您的 html 文件中出现上面的 v1 之后包含单词 LastChangedRevision。您还必须设置您的存储库来执行此操作。

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

    Firefox 还允许按 CTRL + R 重新加载特定页面上的所有内容。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        (对于发布脚本来说,这通常是一件非常简单的事情)

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

        这会导致您想要的缓存行为,而不需要用户的任何东西。

        【讨论】:

          【解决方案5】:

          当我找到格罗姆的答案时,我也想知道如何做到这一点。感谢您的代码。

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

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

          【讨论】:

          • ?? include_css 函数会将文件上最后修改的时间戳附加到 url 的末尾。无需版本控制。
          猜你喜欢
          • 1970-01-01
          • 2015-07-23
          • 1970-01-01
          • 2015-10-21
          • 2011-11-29
          • 1970-01-01
          • 2012-10-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多