控えめなJavaScript:HTMLコードの上部または下部に<script>がありますか?


90

最近、YahooマニフェストのWebサイトの高速化に関するベストプラクティスを読みました。できる限り、JavaScriptのインクルードをHTMLコードの下部に配置することをお勧めします。

しかし、正確にはいつどこで?

クローズする前</html>か後か?そして何よりも、いつ<head>セクションに配置する必要がありますか?


回答:


87

本当に邪魔にならないスクリプトには2つの可能性があります。

  • ヘッドセクションのスクリプトタグを介して外部スクリプトファイルを含める
  • 本文の下部にあるスクリプトタグを介して外部スクリプトファイルを含める(前</body></html>

最初のYahooの調査では、一部のブラウザーがスクリプトタグにヒットしたときにスクリプトファイルを読み込もうとし、それが完了するまでページの残りの部分を読み込まないことが示されているため、2番目の方法はより高速になる可能性があります。ただし、スクリプトに「準備完了」部分があり、DOMの準備ができるとすぐに実行する必要がある場合は、それを先頭に置く必要がある場合があります。もう1つの問題はレイアウトです。スクリプトがページレイアウトを変更する場合、できるだけ早くロードして、ユーザーの前でページを再描画するのに長時間を費やさないようにします。

外部スクリプトサイトが別のドメイン(外部ウィジェットなど)にある場合は、ページの読み込みの遅延を回避するために、下部に配置することをお勧めします。

また、パフォーマンスの問題については、独自のベンチマークを実行します。調査が行われたときに真実である可能性があるのは、ローカルの設定やブラウザの変更によって変わる可能性があります。


13
「準備完了」部分があるスクリプトについて。そのスクリプトを本文の下部に置くと、DOMを操作する準備ができていることが保証されます。それを頭に置く場合は、DOMReady(または同様の)イベントを待つようにラップする必要があります
Juan Mendes

4
@Juan Yesはそうですが、スクリプトを下部に配置することで、ブラウザがドキュメントを解析してヘッド要素を処理するのに必要な時間(200〜500ミリ秒)だけDOMReadyイベントを遅延させ、そのスクリプトを要求します。 。主に最初のページの読み込み時(そこからキャッシュできると仮定)。頭の中に置いたら。それははるかに速く準備ができている可能性があります。したがって、HTML5を念頭に置いて、DOMの準備ができたときにスクリプトがレイアウトを変更する必要がある場合は、「非同期」または「据え置き」スクリプトを頭に置いたほうがよいでしょう。
hexalys 2013年

31

それはそれほどカットアンドドライではありません-Yahooはスクリプトを終了</body>タグの直前に置くことをお勧めします、それは空のキャッシュでページがより速くロードされるという錯覚を引き起こします(スクリプトが残りのドキュメントのダウンロードをブロックしないため)。ただし、ページの読み込み時に実行したいコードがある場合、ページ全体が読み込まれた後にのみ実行が開始されます。<head>タグにスクリプトを配置すると、スクリプトは前に実行を開始します。つまり、プライムキャッシュでは、ページの読み込みが実際より速くなります。

また、ページの下部にスクリプトを配置する特権は常に利用できるとは限りません。ライブラリまたは以前に読み込まれたその他のJavaScriptコードに依存するビューにインラインスクリプトを含める必要がある場合は、これらの依存関係を<head>タグに読み込む必要があります。

すべてのYahooの推奨事項は興味深いものですが、常に適用できるわけではなく、ケースバイケースで検討する必要があります。


1
控えめなJAVScriptがある場合、インラインスニペットはありません。質問は控えめに記述されています。
ファンメンデス、

1
インライン<script>タグは邪魔なJavaScriptを意味しません。
エランガルペリン

@Eric Galperin:邪魔にならないインラインスクリプトタグの良い使い方は何ですか?
ファンメンデス

4
@JuanのやっかいなJavascriptは、UIがないとUIが壊れるか、マークアップに埋め込まれていることを意味します。<script>タグはマークアップとは別のものであり、インターフェースを拡張するコードで使用できますが、必須ではありません。したがって、インライン<script>タグについて本質的に邪魔になるものはありません。
エランガルペリン2011年

4
1.私の名前はエリックではなくエランです。2。サーバー側の言語からJavascriptにデータを渡したい場合、たとえばアイテムのループで、<script>タグを使用してこれらの値をJavaScript変数にエンコードし、おそらくインライン編集またはその他の同様の動作。
エランガルペリン2011

22

他の人が言ったように、それを閉じるbody htmlタグの前に置きます。

先日、クライアントからサイトへの電話が非常に遅いという苦情が何度もありました。ローカルで訪問したところ、1つのページを読み込むのに20〜30秒かかりました。サーバーのパフォーマンスが悪いと考えて、ログオンしましたが、WebサーバーとSQLサーバーの両方が〜0%のアクティビティでした。

数分後、Javascript追跡タグ用にリンクしていた外部サイトがダウンしていることに気付きました。これは、ブラウザがサイトのヘッドセクションのスクリプトタグにアクセスし、スクリプトファイルのダウンロードを待機していることを意味します。

したがって、少なくともサードパーティ/外部スクリプトの場合は、ページの最後に配置することをお勧めします。次に、それらが利用できない場合、ブラウザは少なくともその時点までページをロードし、ユーザーはそれを知らないでしょう。


10
クールなストーリーブロ:)しかし、真剣に、これはページの下部にスクリプトタグを配置することについて私が見た中で最も説得力のある議論です。
user271608 '05年

16

上記の提案に基づいて要約すると:

  1. 外部スクリプト(Googleアナリティクス、サードパーティのマーケティングトラッカーなど)の場合は、</body>タグの前に配置します。
  2. ページのレイアウトに影響を与えるスクリプトの場合は、頭に配置します。
  3. 「dom ready」に依存するスクリプト(jqueryなど)の</body>場合、スクリプトを先頭に配置する特別な理由がない限り、前に配置することを検討してください。
  4. 依存関係のあるインラインスクリプトがある場合は、必要なスクリプトを先頭に配置します。

6

スクリプトの位置をいじくり回したい場合、YSlowは、パフォーマンスを向上または低下させる場合に味を与えるための優れたツールです。javascriptを特定のドキュメント位置に配置すると、ページの読み込み時間が非常に長くなる可能性があります。

http://developer.yahoo.com/yslow/


5

いいえ、それは</html>無効になるので、後にするべきではありません。スクリプトを配置するのに最適な場所は、</body>

これは基本的に、ほとんどのブラウザーが、提供したスクリプトを評価している間、ページのレンダリングを停止するためです。したがって、ページ内の任意の場所にノンブロッキングコードを配置してもかまいません(onLoadイベントバインディングは非常に高速で効果的に解放されるため、主にイベントに関数をアタッチすることを考えています)。ここでの大きなキラーは、ページの先頭にある広告サーバースクリプトを配置することです。これにより、広告が完全にダウンロードされる前にページが読み込まれなくなり、ページの読み込み時間が長くなります。


本当に速度に関心がある場合は、</ body>や</ html>はありません。これらの要素タイプの終了タグはオプションです。最後に<script>を置き、</ body>と</ html>を一緒に使用することを忘れます。
ジム

9
うまくいけば、ジムは皮肉っぽくなっている-とにかく、彼の助言をとらないでください。整形式のXHTMLでは、bodyタグとhtmlタグを含むすべての要素の終了タグが必要です。コードが有効なXMLではない場合、それは間違っています。
matt lohkamp 2008

6
いいえ、私は皮肉ではありません。質問を見てください。XHTMLではなくHTMLを指定します。有効なXHTMLにはこれらのものが必要ですが、有効なHTMLには必要ありません。HTMLを選択し、これらの要素タイプの終了タグを省略しても、何も問題はありません。
ジム

2

下部に配置すると、最後に読み込まれるため、ユーザーがページを表示できる速度が速くなります。ファイナルの前にある必要がありますが</html>、そうでなければDOMの一部にはなりません。

ただし、コードがすぐに必要な場合は、頭に入れてください。

ブログウィジェットなどを下部に配置することをお勧めします。そうしないと、ウィジェットが読み込まれなくても、ページのユーザビリティに影響が出ません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.