2

ウェブサイトを高速化するためのソリューションに取り組んでいます。私は、アプリケーションの予想される次のページを最初にクライアントに 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 が正しく動作しているという事実も注目に値します。

コミュニティが持っているアイデアを本当に感謝します。ありがとう!

4

1 に答える 1

1

いくつかのオプションしか表示されません。

  1. 心配する必要はありません。Apple にバグ レポートを提出してください。:-) キャッシュは他のブラウザでも機能します。全体として、Safari の市場シェアは非常に小さいですが、もちろん、サイトが (たとえば) iPad や iPhone ユーザーをターゲットにしている場合は、特定のサイトの統計の性質が変わります. :-) (あなたのログから、あなたの Safari オーディエンスがどれだけ大きいかを知っているでしょう。)

    サブカテゴリ: ターゲット市場で Safari が大きな部分を占めていて、これが本当に気になる場合は、Safari のオープン ソース部分にバグがあるかどうかを確認し、そうである場合はパッチを提供します。

  2. フラグメント識別子を使用して情報を渡すのではなく、代わりに別のもの (おそらく Cookie) を使用してください。

于 2012-05-14T13:37:33.927 に答える