web-dev-qa-db-ja.com

CloudFlareのRocket Loaderは実際にどのように機能しますか(また、開発者はどのように互換性を確保できますか)?

CloudFlare と呼ばれる画期的なテクノロジーを備えていますRocket Loader(無料アカウントと有料アカウントの両方で)。しかし、実際にはどのように機能しますか?

カップル of ページ that テクノロジーの説明 がありますが、技術的な詳細はあまりありません。重要な機能の1つは、すべてのJavascriptを非ブロック方式で(非同期的に)ロードすることです。これは非常に素晴らしい作業です。これは、スクリプトのロードと実行を待たずにHTML/CSSをレンダリングできることを意味します。

CloudFlare Rocket Loader diagram

それはどのように可能ですか?

<script>またはasync="true"を使用するようにすべてのdefer="true"タグを単純に変更することはできません。

  1. スクリプトは正しい順序でロードする必要があります(たとえば、jQueryライブラリがロードされるまでjQueryプラグインをロードできません)。
  2. これらのスクリプトのdocument.write()呼び出しは機能する必要があります( 明らかに、これらは典型的な非同期スクリプトでは何もしません )。
  3. DOMContentLoadedイベントはどうですか?一部のスクリプトがロードされた場合afterこれがトリガーされた場合、イベントハンドラーはトリガーされませんか?

開発者として、サイト/スクリプト/プラグインがRocket Loaderとの互換性を維持するために注意する必要があることは他にありますか?

29
Simon East

CloudFlareはRocket Loaderについて説明しています likethis ...

Rocket Loaderは、window.onloadの後にJavaScriptコードを安全に実行できる軽量の仮想ブラウザーと結合された汎用非同期JavaScriptローダーです。

Rocket Loaderは多くのことを行います。

  1. ページ上のすべてのスクリプトがページのコンテンツの読み込みをブロックしないようにします。
  2. サードパーティのスクリプトを含む、ページ上のすべてのスクリプトを非同期でロードします。
  3. すべてのスクリプト要求を単一の要求にバンドルし、複数の応答をストリーミングできるようにします。
  4. ほとんどのブラウザーとほぼすべてのスマートフォンでLocalStorageを使用して、スクリプトをよりインテリジェントに保存し、必要な場合を除き、スクリプトが再取得されないようにします。

だからそれはかなりクールですが、どのようにそれを達成しますか?

私が自分のサイトでCloudFlare + Rocket Loaderを実行して読んで発見したことから、おおよそ次のように動作します...

  1. CloudFlareサーバーからHTMLページがリクエストされると、Origin Webホストから読み込んでから、すべてのスクリプトタグを<script type="text/rocketscript">に書き換えます

  2. ブラウザは「text/rocketscript」という形式を理解していないため、スクリプトタグを自然に無視します。

  3. CloudFlareは、追加の cloudflare.min.js スクリプトをページに挿入して、マジックを実行します( フォーマットされたバージョンを参照 )。これは、ブラウザーによって(非同期的に)最初にロードされる唯一のスクリプトです。

  4. このスクリプトは、「text/rocketscript」タイプのスクリプトのページを解析します。

  5. 次に、これらのスクリプトのいずれかがブラウザーのローカルストレージに既に存在するかどうかを確認します。そうでない場合、CloudFlare CDNからAJAXリクエスト(論理バンドルに結合)を作成します。スクリプトをグループ化する方法がどのように機能するかはよくわかりません。

  6. CDNサーバーは、キャッシュまたはOriginサーバーからスクリプト(Google、Twitter、Facebook、その他のCDNなどの複数のサーバーから取得される可能性があります)を収集し、それらを結合、縮小、GZIPしてから返信しますブラウザに。

  7. 参照するこのvirtual browserは、単にこれらの各スクリプトを正しい順序で実行するJavaScriptである必要があります。

    • document.write()へのすべての呼び出しをキャッチし、そのコンテンツをページ上の正しい場所に挿入します。 (おそらくブラウザのwrite()関数をカスタム関数で上書きすることにより?)
    • DOMContentLoadedloadなどの再トリガーイベント。

私は実際にそれが機能することにかなりショックを受けています(おそらく itdoes n'talways )。しかし、通常の状況では、開発者はJavaScriptを互換にするために特別なことをする必要はないと思います。

これはコミュニティWikiであるため、不足している詳細を編集して追加してください。

24
Simon East