ウェブサイトを高速化するためのソリューションに取り組んでいます。私は、アプリケーションの予想される次のページを最初にクライアントに ajax でロードさせています。
$.ajax({url: '/some/real/path', ...});
サーバーはこれに応答し、ヘッダーに次を含めます。
Cache-Control => 'max-age=20'
これは、レスポンスがキャッシュ可能であることを示します。
次に、クライアント側のアプリケーションは、予測が正しかったかどうかを確認するために待機し、正しかったことが判明すると、ブラウザを同じページに遷移させますが、いくつかの情報を # フラグメントとして URL に追加します。ユーザーが実際にアクションをコミットした場合 (つまり、予測不可能な場合) のみ:
location.href = '/some/real/path#additionalInfoInFragement';
ブラウザがページに遷移すると、フラグメント内の追加情報がそのページの JavaScript によって取得され、そこで何らかの効果を達成するために機能します。
Safari を含むすべてのブラウザーで、開始 ajax 要求への応答がブラウザーのキャッシュに適切に挿入されます。
次に、Safari を除くすべてのブラウザーで、そのページへの location.href トランジションを実行すると、ブラウザーはそのコンテンツをキャッシュから引き出します。これにより、サーバーのヒットが回避され、スピードアップの基礎となっています。
ただし、Safari はキャッシュを使用してコンテンツを再提供していません。トランジションの「#additionalInfoInFragment」の部分でつまずいたようです。既存のキャッシュされたコンテンツをチェックするために使用するキャッシュ キーの構築にフラグメントが含まれています。以下は、sqlite 経由でダンプした Safari の cache.db ファイルのエントリです。
* ajax request: INSERT INTO "cfurl_cache_response" VALUES(3260,0,-1982644086,0,'http://localhost:8080/TomcatScratchPad/EmptyPage','2012-05-14 07:01:10');
* location.href transition: INSERT INTO "cfurl_cache_response" VALUES(3276,0,-230554366,0,'http://localhost:8080/TomcatScratchPad/EmptyPage#wtf','2012-05-14 07:01:20');
また、どちらも大量の WebKit コードを共有しているにもかかわらず、Chrome が正しく動作しているという事実も注目に値します。
コミュニティが持っているアイデアを本当に感謝します。ありがとう!