Jqueryコードはヘッダーまたはフッターに入れるべきですか?


回答:


189

すべてのスクリプトは最後にロードする必要があります

ほぼすべての場合において、すべてのスクリプト参照をページの最後の直前に配置するのが最善</body>です。

テンプレートの問題などが原因でこれを行うことができない場合は、defer属性でスクリプトタグを装飾して、HTMLがダウンロードされた後にブラウザがスクリプトをダウンロードできるようにします。

<script src="my.js" type="text/javascript" defer="defer"></script>

エッジケース

ただし、ページの読み込み中にページのちらつきやその他のアーティファクトが発生する可能性があるエッジケースがいくつかありますが、通常は属性なしで<head>タグにjQueryスクリプト参照を配置するだけで解決できます。これらのケースには、jQuery UIや、機能の一部としてDOMを変更するjCarouselやTreeviewなどの他のアドオンが含まれます。defer


その他の警告

ポリフィルなど、DOMまたはCSSの前にロードする必要があるいくつかのライブラリがあります。Modernizrは、headタグに配置する必要があるライブラリの1つです。


5
まあ、これを考慮してください:themeforest.net/item/portfolious-professional-business-template/…。それは私が最近購入したサイトのテーマで、jCarouselでjQueryを使用するためのホームページの機能です。スクリプトブロックをファイルの先頭から最後まで移動すると、カルーセルで使用されている画像がページの読み込み中にすべて同時に表示されるのに対し、スクリプトファイルが先頭にあると、ページがよりスムーズに読み込まれることに気付きました。
Chad Levy

5
CSSを使用して、コンテンツの初期状態を設定します。CSSは頭に入れるべきです。何かを壊して他の何かを機能させることは解決策ではありません。訪問者がコンテンツがレンダリングされる前にjQueryと関連するすべてのプラグインがロードされるのを待たなければならない場合、訪問者はコンテンツを表示するのに十分な時間滞在しない可能性があります。
ダンカン

9
ChadLevyは正解です。jQueryプラグインがで参照されている場合、jQueryプラグインがより適切に機能するいくつかの条件があります<head>。マークアップがコンテンツを並べ替えるjQueryプラグインに依存している場合、プラグインが読み込まれるまでWebページでファンキーなマークアップを取得するため、ページの下部にプラグイン参照を配置しても意味がありません。ルールは、機能しなくなるまで従うことを意図しており、その時点でルールを破る必要があります。
Robert Harvey

2
@Duncan:理想的には、これはすべての依存関係を制御できる場合です。jQueryについて(具体的にはjQuery UIや他のアドオンのようなもの)の設計では、それらの機能を完全に制御することはできないため、可視性属性などをDOM要素に追加して、より適切にロードできるようにすると、正常にロードできない場合があります。その要素を使用するアドオンは、上記の属性を考慮しません。依存関係を意図したとおりに動作させるよりも、単純な規則を無視する方が良い場合があります。
Chad Levy

2
@Stefan:jQueryプラグインがDOMの操作を許可されていない場合、何が重要ですか?
Robert Harvey

229

スクリプトを一番下に置く

スクリプトが原因の問題は、スクリプトが並行ダウンロードをブロックすることです。HTTP / 1.1仕様では、ブラウザがホスト名ごとに並行して2つ以下のコンポーネントをダウンロードすることが推奨されています。複数のホスト名からイメージを提供する場合、3つ以上のダウンロードを並行して行うことができます。ただし、スクリプトのダウンロード中は、ホスト名が異なっていても、ブラウザは他のダウンロードを開始しません。場合によっては、スクリプトを一番下に移動するのは簡単ではありません。たとえば、スクリプトがdocument.writeを使用してページのコンテンツの一部を挿入する場合、ページの下部に移動することはできません。スコーピングの問題もあるかもしれません。多くの場合、これらの状況を回避する方法があります。

よく出てくる代替案は、遅延スクリプトを使用することです。DEFER属性は、スクリプトにdocument.writeが含まれていないことを示し、ブラウザがレンダリングを続行できるかどうかの手掛かりになります。残念ながら、FirefoxはDEFER属性をサポートしていません。Internet Explorerでは、スクリプトは延期される可能性がありますが、必要なだけではありません。スクリプトを延期できる場合は、ページの下部に移動することもできます。これにより、Webページの読み込みが速くなります。

編集: Firefoxは、バージョン3.6以降、DEFER属性をサポートしています。

出典:


4
スクリプトを先頭に配置する必要があるとの最新のアドバイスを見てきました。スクリプトを下部に配置すると、ページの本文にある画像やその他のコンテンツを並行して読み込むことができますが、ページ内のスクリプトが後で読み込まれるので、ブラウザが認識する前にHTMLの本文全体をダウンロードする必要があります。ロードするスクリプトのURL。ほとんどの人はYahooガイドを参照していますが、これは正確ではありません。Firefoxは確かにスクリプトの遅延属性を尊重しています。上部で延期すると、測定するとページの読み込みが速くなります。
ShadowChaser

この方法でページの読み込み速度に関する統計を確認できますか?
ガブリエルアラック2014

1
Firefoxは、バージョン3.6以降、DEFER属性をサポートしています。出典:w3schools.com/tags/att_script_defer.asp
Nikita

1
更新:初期/中期の2016年のように、すべての最新ブラウザは、少なくとも6にホスト名ごとの接続数を増加している
夜フクロウ

32

もちろん、jQuery自体はCDNを介してヘッドにのみロードします。

どうして?一部のシナリオでは、jQueryに依存するコードが埋め込まれた部分テンプレート(ajaxログインフォームスニペットなど)を含めることができます。ページ下部にjQueryが読み込まれると、「$ is not defined」エラーが表示されます。

もちろん、これを回避する方法はあります(JSを埋め込まず、load-at-bottom jsバンドルに追加するなど)が、なぜjQuery依存コードを好きな場所に配置できるのか、遅延ロードされたjsの自由を失うのですか?Javascriptエンジンは、依存関係(ロードされているjQueryなど)が満たされている限り、コードがDOMのどこに存在するかを考慮しません。

共通/共有jsファイルの場合、はい、それらをの前に配置します</body>が、例外の場合は、jQueryに依存するスニペットまたはファイル参照をhtmlのその場所に直接貼り付けることがアプリケーションのメンテナンスに意味がある場合は、そうします。

頭にjqueryをロードするパフォーマンスヒットはありません。地球上のどのブラウザーがキャッシュにjQuery CDNファイルをまだ持っていませんか?

jQueryを頭にくっつけて、あなたのjsの自由を支配させましょう。


1
多くのブラウザはサポートしていません。バージョンを考慮に入れ、ファクトキャッシングが正確なリソース名に基づいている場合、約2%は私が読んだ最高の数値です。そのため、jquery1.4.2はjquery1.7、または1.9.1または..と同じではありません。 。
トニリー

それらのうち2%、たとえば、ページが初めてロードされる前に半分が離れます。この方法で1%は、訪問者を失うことになりますが、開発時間とトラブルを大幅に節約できる可能性があります。これがあなたのビジネスモデルで理にかなっているかどうかを確認してください...
osa

13

Nimbuz関連する問題の非常に良い説明を提供しますが、最終的な答えはあなたのページに依存すると思います。

画像なしでは意味をなさないページがいくつかありますが、重要ではない小さなスクリプトしかありません。その場合、スクリプトを下部に配置することは理にかなっているので、ユーザーは画像をすぐに見てページを理解し始めることができます。他のページは、スクリプトを使用して動作します。その場合は、画像のある機能しないページよりも、画像のない機能するページの方が良いので、スクリプトを先頭に置くのが理にかなっています。

考慮すべきもう1つの点は、スクリプトは通常イメージよりも小さいということです。もちろん、これは一般化されたものであり、ページに適用されるかどうかを確認する必要があります。もしそうなら、私にとって、それは経験則として最初にそれらを置くことに対する議論です(つまり、他に行う正当な理由がない限り)、それらは画像がスクリプトを遅らせるほどには画像を遅らせないからです。最後に、スクリプトを上に配置する方がはるかに簡単です。スクリプトを使用する必要があるときに、スクリプトがまだロードされているかどうかを心配する必要がないからです。

要約すると、私はデフォルトでスクリプトを上部に配置する傾向があり、ページが完了した後でスクリプトを下部に移動する価値があるかどうかのみを検討します。これは最適化であり、時期尚早に実行したくありません。


時期尚早の最適化の論拠を引きずり出すまで、あなたは私を抱えていました。これは、その影響を完全に理解せずに、人々が独断的に従うもう1つのルールです。
Robert Harvey

6
まあ、それらすべてを獲得することはできません!私はその意味を理解していると信じています。:)
EMP

スクリプトが読み込まれたかどうかを心配する必要があるかどうかはわかりません。この説明の大部分は、スクリプトが読み込まれるまでレンダリングをブロックすることです。したがって、ロードする前に何も呼び出さない限り、問題はありません。それに、それがコールバックの目的であり、ページに他の多くを埋め込むべきではありません。私が理解しているように、画像はブロックされません(並列に読み込まれます)。実際、画像が完全に読み込まれる前にDOMを準備してスクリプトを実行できます。スクリプトがブロックされないようにするためだけにスクリプトを最初に置くことは意味がありません。
ダンカン

4
一般的なコンセンサスはスクリプトを一番下に置くことですが、デフォルトでそれを行い、問題が発生した場合にのみそれらを一番上に移動するほうがいいのではないでしょうか?逆のことをするのは奇妙に思えます。費やされた労力に差がない場合は、最適なことを行う方が良い場合があります。:)
Duncan

@ダンカン、はい、それが私のアプローチでした。プラグインを下部に配置し、問題が発生した場合は上部に配置して、問題を修正しました。
Robert Harvey、

6

ほとんどのjqueryコードはドキュメントの準備ができて実行されますが、いずれにしてもページの終わりまで実行されません。さらに、JavaScriptの解析/実行によってページのレンダリングが遅れる可能性があるため、すべてのJavaScriptをページの下部に配置することをお勧めします。


5

すべてのスクリプトをページの下部に配置するのが標準的な方法ですが、私はASP.NET MVCをいくつかのjQueryプラグインで使用しており<head>、マスターのセクションにjQueryスクリプトを配置すると、すべてがうまくいくことがわかりますページ。

私の場合、スクリプトがページの下部にある場合、ページのロード時にアーティファクトが発生します。私はjQuery TreeViewプラグインを使用していて、スクリプトが最初にロードされていない場合、プラグインによって課される必要なCSSクラスなしでツリーがレンダリングされます。そのため、ページが最初に読み込まれたときに、この奇妙に見える混乱が発生し、続いてTreeViewが適切にレンダリングされます。とても見栄えが悪い。<head>マスターページのセクションにjQueryプラグインを配置すると、この問題が解消されます。


イントラネットはインターネットと同じ条件の影響を受けないため、ロードの遅延はおそらくあまり知覚されません。ただし、ルールに従うことをお勧めします。
ダンカン

いいえ、CSS識別子/スタイルをマークアップに配置すると(jQueryがDOM対応で実行するのを待つ代わりに)、問題が解決します。
Dan Beam、

1
@Dan Beam:Treeviewはデータベーステーブルから入力され、Treeviewのスタイルは、テーブルのコンテンツに基づいてTreeviewプラグインによって設定されるため、機能しません。
Robert Harvey

1
変更されていないTreeviewプラグインスクリプトをページの上部に置くだけで問題なく動作するのに、なぜそれを行うのですか?ダン、それは意味がありません。
Robert Harvey

1
乾杯ロバート、私はまた、パーシャルのフォームでASP.NETMVCを使用しています。新しいフィールドはパーシャルが実行されるたびに(検証のためなど)機能が割り当てられるので、JavaScriptをパーシャル内に保持することは理にかなっています。@Html.Action私のパーシャルは$ is undefined意味を与えるので、結果を出力に動的に書き込むを使用しようとしたときに、この問題に直面しました。パーシャルをロードするには、代わりに.load( '@ Url.Action')を使用する必要があります。しかし、これは余分な要求のために不快感を与えます。あなたの入力に基づいて、私はマスターページのRenderBody()の上にjqueryを移動します
Malkin

4

ほとんどすべてのWebサイトで、Jqueryとその他のJavaScriptがヘッダー:Dに配置されていますが、stackoverflow.comも確認してください。

また、ボディの終了タグの前に装着することをお勧めします。どちらの場所に置いても積載時間を確認できます。スクリプトタグは、さらに読み込むためにWebページを一時停止します。

また、フッターにJavaScriptを配置すると、JavaScriptが読み込まれるまでWebページの外観が変わってしまう可能性があるため、ヘッダーセクションにCSSを配置します。


2
ただし、スクリプトでdeferを使用して同じことを達成できます。w3schools.com/tags/att_script_defer.asp
Jack Tuck


0

私にとって、jQueryは少し特別です。多分標準への例外。それに依存するスクリプトは他にもたくさんあるので、後でロードする他のスクリプトが意図したとおりに機能するように、早期にロードすることが非常に重要です。他の誰かが指摘したように、このページでさえヘッ​​ドセクションにjQueryをロードします。

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