Googleマップのjavascriptは、DOMの大量の操作を行います。それでも、 すばらしいドキュメント は、defer
フラグを使用してロードすることをお勧めします。
<script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=initMap" async defer></script>
DOM操作を実行するスクリプトにdefer
フラグが推奨されるのはなぜですか? defer
フラグとGoogle Maps APIの両方について知りたいと思っています。彼らのしている。
通常、script
タグは、HTMLの解析を停止し、スクリプトをフェッチして実行し、その後HTMLの解析を続行するようにブラウザに指示します。これは、スクリプトコードがdocument.write
を使用してHTMLトークンストリームに出力するためです。
async
とdefer
はどちらも、ブラウザにスクリプトファイルのダウンロードと並行してHTMLの解析を続行してもよいことを通知するメカニズムです、そしてすぐにではなく、後でスクリプトファイルを実行します。
ただし、少し異なります。 HTML仕様のWHAT-WGバージョンの _script
セクション のこの図は、違いを想定するのに役立ちます。
上記のリンクされた仕様の詳細ですが、簡単に言えば、「クラシック」スクリプト(慣れ親しんだ種類ですが、モジュールスクリプトは近日提供予定です!):
async
とdefer
はどちらも、スクリプトのダウンロードを待たずにHTMLの解析を続行できます。defer
は、解析が完了するまで、ブラウザにスクリプトの実行を待機させます。async
は、スクリプトのダウンロードが完了するまでブラウザを待機させます。つまり、ダウンロードが完了するタイミングに応じて、解析が完了する前または後でスクリプトを実行する可能性があります(キャッシュから取得される可能性があることを忘れないでください)。async
が存在し、ブラウザによってサポートされている場合、defer
よりも優先されます。async
スクリプトは、HTMLでの表示順序に関係なく、任意の順序で実行できます。defer
スクリプトは、解析が完了すると、HTMLに表示される順序で実行されます。async
およびdefer
は、セミモダンブラウザーでも十分にサポートされていますが、IE9以前では適切にサポートされていません。 こちら と こちら 。DOM操作を実行するスクリプトに
defer
フラグが推奨されるのはなぜですか?
2つの理由:
defer
を使用せずにscript
タグを最適に配置しなかった場合、defer
を使用すると、ブラウザがDOMの構築前にDOMの構築を完了するため、APIスクリプトが適切に動作しますスクリプトはそれを操作しようとします。
多くの人はscript
タグをドキュメントのhead
セクションに挿入します。ただし、通常はそれらを配置する最悪の場所ですnless使用するdefer
(またはasync
)。ほとんどの場合、最適な場所(他に何かする理由がない限り)はendで、終了の</body>
タグの直前なので、A)サイトはすばやくレンダリングされます、スクリプトを待たずに; B)DOMは、操作しようとする前に完全に構築されています。 defer
を推奨することで、script
タグをHTMLの早い段階で配置する人々のサポートの手間を省くことができます。
グーグルマップの例では、async
フラグとdefer
フラグの両方を使用しています。
async
フラグを使用すると、スクリプトはDOM解析と並行してロードし、APIの準備ができ次第実行することができます。defer
フラグを使用すると、スクリプトはDOM解析と並行してロードできますが、DOMの解析が完了するまでスクリプトが実行されないことが保証されます。async
は最新のHTML5ブラウザーでサポートされていますが、defer
のサポートは普遍的です。タグが一緒に使用される場合、defer
は古いブラウザの単なるフォールバックであり、async
がサポートされている場合は無視されます。
これらの単純な例では、async
またはdefer
のどちらでも機能しますが、どちらも必要ありません。この場合、パフォーマンスのみを目的としています。
参照:
Googleマップ(およびその他すべて)を非同期で延期してスピードアップ
async vs defer attributes-Growing with the Web