あなたの例では、クライアントがすでに持っているかどうかにかかわらず、Webサーバーは常に CSSと画像を送信し、帯域幅を大幅に浪費します(したがって、おそらくあなたの意図であった待ち時間を短縮して接続を遅くするのではなく、接続を遅くします)。CSS、JavaScript、および画像ファイルは通常、まさにその理由で非常に長い有効期限で送信されることに注意してください(それらを変更する必要がある場合は、ファイル名を変更するだけで、新しいキャッシュが再びキャッシュされます)。
これで、「OK、ただしクライアントは既にそのリソースの一部を持っていると示すことができるので、サーバーはそれを再び送信しない」と言うことで、帯域幅の浪費を回避することができます。何かのようなもの:
GET /index.html HTTP/1.1
Host: www.example.com
If-None-Match: "686897696a7c876b7e"
Connection: Keep-Alive
GET /style.css HTTP/1.1
Host: www.example.com
If-None-Match: "70b26618ce2c246c71"
GET /image.png HTTP/1.1
Host: www.example.com
If-None-Match: "16d5b7c2e50e571a46"
そして、変更されていないファイルのみを取得し、1つのTCP接続を介して送信します(持続接続を介したHTTPパイプライン化を使用)。そして何を推測しますか?すでに動作している方法です(If-None-Matchの代わりにIf- Modified-Sinceを使用することもできます)。
ただし、(元のリクエストのように)大量の帯域幅を浪費して遅延を本当に削減したい場合は、Webサイトを設計するときに標準のHTTP / 1.1を使用して今日できます。ほとんどの人がそれをしない理由は、それが価値があるとは思わないからです。
それを行うには、CSSまたはJavaScriptを別のファイルに入れる必要はありません。<style>
また、<script>
タグを使用してメインHTMLファイルに含めることができます(おそらく手動で行う必要はありません。テンプレートエンジンはおそらく自動的に行うことができます) 。次のように、データURIを使用してHTMLファイルに画像を含めることもできます。
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==" alt="Red dot" />
もちろん、base64エンコードは帯域幅の使用量をわずかに増加させますが、帯域幅の浪費を気にしないのであれば、それは問題になりません。
さて、あなたが本当に気にかけているなら、あなたは両方の世界の最高を得るためにあなたのウェブスクリプトを十分にスマートにすることさえできます:最初のリクエスト(ユーザーはクッキーを持っていません)で、ただ一つのHTMLに埋め込まれたすべて(CSS、JavaScript、画像)を送信します上記のようにファイルを作成し、ファイルの外部コピーにrel = "prefetch"タグのリンクを追加し、Cookieを追加します。ユーザーが既にCookieを持っている場合(たとえば、以前に訪問したことがある場合)、通常のHTMLのみを送信します<img src="example.jpg">
(<link rel="stylesheet" type="text/css" href="style.css">
など)。
したがって、最初にアクセスすると、ブラウザーは1つのHTMLファイルのみを要求し、すべてを取得して表示します。次に、指定された外部CSS、JS、イメージを(アイドル状態のときに)プリロードします。次回ユーザーがアクセスしたとき、ブラウザーは変更されたリソース(おそらく新しいHTML)のみを要求して取得します。
Webサイトで何百回クリックした場合でも、追加のCSS + JS + imagesデータは2回しか送信されません。提案されたソリューションが示唆した数百回よりもはるかに優れています。そして、それ以上の使用(ない最初の時間に、また次の回に)だろう1レイテンシの増加往復。
今、それがあまりにも多くの仕事のように聞こえ、SPDYのような別のプロトコルを使いたくない場合、Apacheのmod_pagespeedのようなモジュールが既にあります。それはあなたのためにその仕事のいくつかを自動的に行うことができます(複数のCSS / JSファイルをマージします) Webページの1行を変更することなく、小さなCSSを自動的にインライン化し、それらを縮小し、オリジナルの読み込み、画像の遅延読み込みなどを待つ間に小さなプレースホルダーのインライン画像を作成します。