11

私はプロジェクトのためにこれを調査していますが、新しいリリースごとに古い CSS および JavaScript ファイルが提供されるのを防ぐために他の人が何をしているのか疑問に思っています。すべてのリクエストでキャッシュを妨げる可能性のあるタイムスタンプなどを追加したくありません。

私はSpring 2.5 MVCフレームワークを使用しており、すでにGoogle APIを使用してプロトタイプとscriptaculousを提供しています。また、Amazon S3 と新しい Cloudfront サービスを使用して、ネットワークのレイテンシを最小限に抑えることも検討しています。

4

7 に答える 7

14

次のようなリビジョン番号のパラメーターをリクエストに追加します。

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

「ver」パラメーターは、ビルドごとに自動的に更新されます (ビルドが更新するファイルから読み取られます)。これにより、スクリプトが現在のリビジョンに対してのみキャッシュされるようになります。

于 2008-12-10T16:12:39.990 に答える
4

@eran-galperin のように、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" />
于 2012-09-12T22:35:37.383 に答える
2

キャッシュされたファイルに関しては、querystring メソッドを使用して古いキャッシュ ファイルに関連するバグの問題にまだ遭遇していません。

ただし、パフォーマンスに関しては、Todd Bのファイル名によるリビジョンの言及を反映して、トピックの詳細については Steve Souders の作品をチェックしてください。

「人気のあるプロキシである Squid は、クエリ文字列を使用してリソースをキャッシュしません。プロキシ キャッシュの背後にある複数のユーザーが同じファイルを要求すると、パフォーマンスが低下します。キャッシュされたバージョンを使用するのではなく、全員がオリジン サーバーに要求を送信する必要があります。」

「プロキシ管理者は、キャッシュ ヘッダーが適切であることを示している場合、クエリ文字列を使用してリソースのキャッシュをサポートするように構成を変更できます。ただし、デフォルトの構成は、Web 開発者が最も頻繁に遭遇することを期待するものです。」

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

于 2008-12-10T20:03:50.460 に答える
1

ヘッダーconditional get付きのリクエストを使用するIf-Modified-Since

于 2008-12-10T15:58:12.360 に答える
1

これは実際には非常に難しい問題であり、適切なソリューションを設計するのに時間を費やすことができます。

URL に組み込まれたタイムスタンプやバージョンを使用してファイルを公開することをお勧めします。

/media/js/my.js 最終的には次のようになります。

/media/js/v12/my.js または同様のもの。

バージョニング/タイムスタンプは、任意のツールで自動化できます。

これには、新しいバージョンを展開してもサイトが壊れないという追加の利点があり、(バージョンを削除して最新のファイルを送り返すだけの書き換えルールとは異なり) 実際に並べてテストを行うことができます。

JS または CSS で注意すべきことの 1 つは、それらの内部に依存 URL (背景画像など) を含める場合です。しかし、それは非常に単純な正規表現とリソース マニフェストで可能です)。

何をするにしても、最後に ?vblah を投げないようにしてください。これを行うと、基本的にウィンドウからキャッシュを投げ出すことになります (これは、これを処理する最も簡単な方法であるため、残念です)。

于 2008-12-10T16:12:18.710 に答える
0

ファイルの「変更時刻」をタイムスタンプとして取得すると、ファイルが変更されるまでキャッシュされます。ヘルパー関数 (または他のフレームワークで呼び出されるもの) を使用して、ファイルからタイムスタンプを取得する script/css/image タグを追加するだけです。Unix のようなシステム (ほとんどのサーバーがそうです) ではtouch、必要に応じて変更時刻を強制的に変更するファイルを単純に作成できます。

Ruby on Rails は、プロダクション モードでこの戦略を使用し (デフォルトでは私は信じません)、開発モードでは通常のタイムスタンプを使用します (何かがキャッシュされていないことを本当に確認するため)。

于 2008-12-10T18:12:36.487 に答える