4

ウェブページを作成するとき、クライアント/ブラウザは、画像、.css、.jsなどのファイルを更新するか、それともキャッシュから取得するかを決定します。

.aspxページの場合、決定するのはサーバーです。

もちろん、IISレベルで、またはいくつかのHttpModule手法を使用して、要求のヘッダーを変更して、ファイルをキャッシュするかどうか、およびキャッシュする期間をクライアントに通知できます。

今、私は.aspxが対応する.jsと連携するWebサイトを持っています。したがって、おそらく私は.aspxの要素にアクセスする.jsにいくつかのjQueryコードを持っています。その要素を.aspxから削除すると、.jsも適応します。ユーザーが私のページにアクセスすると、新しい.aspxを取得しますが、古い.jsを取得する可能性があり、面白い効果が得られます。

私のサイトはたくさんのスクリプトとたくさんの画像を使っています。パフォーマンス上の理由から、IISで、これらのファイルが「期限切れにならない」ように構成しました。

さて、ファイルは時々変更されます。ユーザーが更新ファイルを確実に入手できるようにしたいと思います。

最初は、ファイルの名前を変更することで自分自身を助けました。だから、私はSkriptV1.jsとSkriptV2.jsなどを持っていました。リポジトリの履歴が壊れており、参照とファイル名の両方を調整する必要があるため、これは最悪のオプションです。

ここで改善し、Skript.js?v = 1またはSkript.js?v=2を使用して参照のみを変更しました。これにより、クライアントはファイルを更新する必要があります。それはうまく機能しますが、それでも私は参照を適応させる必要があります。

さて、ここには次のようなさらなる改善があります:

<script type='text/javascript' src='../scripts/<%# GetScriptLastModified("MyScript.js") %>'></script>

したがって、「GetScriptLastModified」は次のように?v=パラメータを追加します。

protected string GetScriptLastModified(string FileName)
{
    string File4Info = System.Threading.Thread.GetDomain().BaseDirectory + @"scripts\" + FileName;
    System.IO.FileInfo fileInfo = new System.IO.FileInfo(File4Info);
    return FileName + "?v=" + fileInfo.LastWriteTime.GetHashCode().ToString();
}

したがって、レンダリングされた.js-Linkは、クライアントには次のようになります。

<script type='text/javascript' src='/scripts/GamesCharts.js?v=1377815076'></script>

新しいバージョンをアップロードすると、リンクは毎回変更されます。変更すると、ユーザーはすぐに新しいスクリプトまたは画像を取得できます。

さて、2つの質問:a)これを達成するためのよりエレガントな方法はありますか?b)そうでない場合:サーバーのパフォーマンスオーバーヘッドがどれほど大きくなるかを誰かが推測していますか?1ページに50のバージョン管理された要素が簡単に存在する可能性があるため、1つの.aspxに対してGetScriptLastModifiedが50回呼び出されます。

議論を楽しみにしています:)

4

1 に答える 1

0

この質問にはいくつかの異なる答えがあります。

まず、たまにしか変更されないファイルがある場合は、Expires ヘッダーと Cache-Control ヘッダーを 1 年で期限切れになるように設定します。ファイルが本当に期限切れにならない場合にのみ、ファイルが期限切れにならないと言うべきです。現在、「期限切れにならない」という問題が発生しています。

また、大量の画像や JavaScript を提供するためにサイトでパフォーマンスの問題が発生している場合、一般的に受け入れられている解決策は、CDN (コンテンツ配信ネットワーク) を使用することです。さまざまなプロバイダーがあり、予算に合ったプロバイダーを見つけることができると確信しています。また、CDN は IIS から大量の I/O と CPU 時間をオフロードするため、長期的にはお金を節約できます。それがどれだけ大きな違いをもたらすことができるかは驚くべきことです。

最後に、ほとんど変更されないファイルをユーザーが確実に最新の状態に保つ方法の 1 つは、アセットの URL に何らかのバージョン管理スキームを実装して、キャッシュの無効化を行うことです。これにはさまざまな方法がありますが、1 つの (非常に素朴な) 方法は、サイトに展開するたびにバージョン番号を増やすことです。

たとえば、すべてのアセット URL は /static/123/img/dog_and_pony.jpg のようになります。

次に、次にサイトにデプロイするときに、バージョン番号を「124」に増やします。バージョンを追跡し、それをアセット URL に動的に挿入し、デプロイするたびにバージョン番号が変更されるようにする何らかの方法が必要です。このアセットを参照するものはすべて、新しいバージョン番号を自動的に認識する必要があるという考えです。

パフォーマンスに関しては、ユーザーが更新したり、同じものを 2 回ダウンロードしたりする必要がないようにすることは、立派な目標です。しかし、場合によっては手間が大幅に軽減されることもあります。ユーザーがすべてを定期的に更新するだけであれば、ほとんどの Web サイトではおそらく問題ありません。

お役に立てれば。

于 2012-04-15T06:41:58.063 に答える