5

私が理解しているように、これがブラウザのキャッシュの仕組みです。遠い将来のヘッダーが 1 年と言うように設定されており、foo.js がキャッシュされるように設定されているとします。以下にいくつかのシナリオを示します。

  1. ページに最初にアクセスすると、サーバーは 200 を返し、foo.js は 1 年間キャッシュされます。

  2. 次回アクセスすると、ブラウザーはキャッシュをチェックしますが、foo.js が変更されているかどうかをサーバーでチェックする必要があります。そうでない場合、サーバーは 304 - Not Modified を返します。

  3. ユーザーが既にページにいる (そして foo.js がキャッシュにある) リンクをクリックして別のページに移動すると、ブラウザーはキャッシュされたバージョンの foo.js を見て、サーバーへのラウンドトリップを行わずにそれを提供し、200 (キャッシュされた)。

  4. ユーザーは既にページにアクセスしており (そして foo.js はキャッシュ内にあります)、何らかの理由で F5/Reload を押すと、ブラウザーはキャッシュをチェックしますが、サーバーへの往復を実行して foo.js が変更されているかどうかをチェックする必要があります。そうでない場合、サーバーは 304 を返します。

ご覧のとおり、ページが更新されるたびに、ファイルが変更されているかどうかを確認するために、常にサーバーにアクセスする必要があります。これはそれほど多くなく、サーバーはヘッダー情報のみを返しますが、場合によっては往復時間が非常に重要であることはわかっています。

問題は、ファイルの有効期限を既に設定しているため、これを回避できる方法があるかどうかです。有効期限が切れるまで、常にキャッシュからフェッチするか、ファイルを別のものに置き換える(バージョン管理する)ようにしたいだけです。

4

2 に答える 2

0

私が理解していることから、 F5/Ctrl-R を押すのはブラウザ固有のアクションであるため、コントロールはブラウザに任せられます。

ユーザーが別のアクションをクリックする前にキャッシュをクリアするとどうなりますか? したがって、F5 で強制的にキャッシュを使用する HTTP 仕様があったとしても、そのニーズを達成できる保証はありません。

可能な限りキャッシュするように構成してコーディングし、残りはユーザーに任せます。

于 2012-11-18T08:37:23.403 に答える
0

ページに移動すると (つまり、URL バーにアドレスを入力するか、リンクをクリックすると)、サーバーへの HEAD リクエストなしでリソースがキャッシュから取得されます。ただし、ページを更新すると、HEAD リクエストと RTT が実行されます。

これは、IE の開発者ツールの [ネットワーク] タブでより明確に見えます。Initator 列が表示されているnavigate場合は、最初のケースとrefreshforCTRL+Rまたはと表示されF5ます。

それらにイベントリスナーを追加し、または同様の方法でデフォルトの動作を防止することにより、F5および動作をオーバーライドできます。これにより、更新ではなくページ ナビゲーションが発生します。CTRL+Rwindow.location = window.locationevent.peventDefault

また、キャッシュされたリソースがサーバー上で実際に変更された場合はテストしませんでした。それが問題になる場合は、リソースにバージョン番号を付けて、リソースの最新バージョンを指す URL を含む HTML を生成することで解決できます (HTML5 オフライン アプリケーションのキャッシュ マニフェストの問題に似ています)。

編集:ただし、ユーザーがブラウザの更新ボタンをクリックしても問題は解決しません。onbeforeunloadそんな時に役立つのがイベント。

于 2012-11-18T08:53:32.527 に答える