63

CSS と Javascript ファイルは頻繁に変更されるわけではないので、Web ブラウザーによってキャッシュされるようにしたいと考えています。しかし、ユーザーがブラウザーのキャッシュをクリアしなくても、これらのファイルに加えられた変更を Web ブラウザーで確認できるようにしたいと考えています。また、Subversion などのバージョン管理システムとうまく連携するソリューションも必要です。


私が見た解決策の中には、クエリ文字列の形式でファイルの末尾にバージョン番号を追加するものがあります。

SVN リビジョン番号を使用してこれを自動化できます: ASP.NET Display SVN Revision Number

別のファイルのリビジョン変数を含める方法を指定できますか? それは HTML ファイルにあり、CSS または Javascript ファイルへの URL にリビジョン番号を含めることができます。

Subversionの本では、リビジョンについて次のように述べています。「このキーワードは、このファイルがリポジトリで変更された最後の既知のリビジョンを表します」。

Firefox では、CTRL+Rを押して特定のページのすべてをリロードすることもできます。

明確にするために、ユーザーが自分で何もする必要のないソリューションを探しています。

4

5 に答える 5

29

ファイルの最終変更のタイムスタンプを 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";
}
于 2008-08-06T09:41:02.353 に答える
10

私が見た解決策の中には、クエリ文字列の形式でファイルの末尾にバージョン番号を追加するものがあります。

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

SVN リビジョン番号を使用してこれを自動化できます。上記の v1 が表示された場所の後に、LastChangedRevisionという単語を html ファイルに含めます。これを行うには、リポジトリもセットアップする必要があります。

これで私の答えがさらに明確になることを願っていますか?

Firefox では、CTRL+Rを押して特定のページのすべてをリロードすることもできます。

于 2008-08-06T09:52:01.347 に答える
8

私の意見では、バージョン番号をファイル自体の一部にすることをお勧めしますmyscript.1.2.3.js。このファイルを永久にキャッシュするように Web サーバーを設定し、新しいバージョンができたら新しい js ファイルを追加するだけです。

于 2008-08-06T21:33:14.473 に答える
6

グロムの答えを見つけたとき、私はこれを行う方法も考えていました。コードをありがとう。

コードの使用方法を理解するのに苦労しました。(私はバージョン管理システムを使用していません。) 要約すると、スタイルシートを呼び出すときにタイムスタンプ (ts) を含めます。スタイルシートを頻繁に変更する予定はありません。

<?php 
    include ('grom_file.php');
    // timestamp on the filename has to be updated manually
    include_css('_stylesheets/style.css?ts=20080912162813', 'all');
?>
于 2008-09-13T16:54:51.573 に答える
6

CSS または JS ライブラリの新しいバージョンをリリースすると、次のことが発生します。

  1. ファイル名を変更して一意のバージョン文字列を含める
  2. ライブラリを参照する HTML ファイルを変更して、バージョン管理されたファイルを指すようにします。

(これは通常、リリース スクリプトの非常に単純な問題です)

CSS/JS の有効期限を数年先に設定できるようになりました。コンテンツを変更するたびに、参照元の HTML が新しい URI を指している場合、ブラウザーはキャッシュされた古いコピーを使用しなくなります。

これにより、ユーザーが何も必要とせずに、必要なキャッシュ動作が発生します。

于 2008-08-09T14:37:46.130 に答える