JSファイルはBodyタグの最後に読み込んだ方が何かとメリットがあるというのはよく聞きますが、
bodyタグ最後とheadタグのどっちでjQueryCDN読み込んでいるのか調べると普通にheadタグ内で読み込んでるサイトの方が多いように感じます。
そこで質問なのですが、逆にBodyタグ最後でJSファイルを読み込むことによるデメリットってあるんでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
HTML
1 <script src="hoge.js"></script> 2</head> 3<body> 4 <p>It is a test.</p> 5</body> 6</html>
上記 HTML では hoge.js が読み込み終わって hoge.js 内のスクリプトコードが実行されるまで </head>
以降のHTML(It is a test)のレンダリングが停止します。
HTML
1</head> 2<body> 3 <p>It is a test.</p> 4 <script src="hoge.js"></script> 5</body> 6</html>
上記 HTML ではbody要素内の HTML(It is a test.) のレンダリングが終わってから hoge.js の読み込みを始める為、レンダリングの停止が発生しません。
</body>
直前に <script>
を置くのはscript読み込み中のレンダリング停止をなくすのが目的であり、メリットです。
逆にレンダリング前にJavaScriptを実行させたければ <head>
に置きますが、そうでなければ、</body>
直前に <script>
を置くのがレンダリングの高速化に繋がるのでお勧めです。
副次的効果ですが、</body>
直前に置けば DOMContentLoaded
を待つコードを省略出来ます。
投稿2015/08/17 05:21
総合スコア18189
0
ベストアンサー
think49様が書かれている通り、bodyの閉じタグ直前にscriptタグを書いたほうが良いと言われていた理由はHTMLやCSSの読み込み・レンダリングをブロックしないという所です。
だだ、HTML5でサポートされたasync
属性をつければHTMLやCSSのレンダリングをブロックせずにjavascriptを読み込むこともできますので、heahタグ内に書いても問題無くなってきています。
ex
html
1<head> 2 <script src="/maim.js" async></script> 3</head>
ただ、このasync
属性は注意が必要で複数スクリプトがあった場合読み込まれる順番が担保されません。
具体的に言えば、jQueryと自分で作ったjQuery使用したjavascriptmain.js
を別ファイルで読み込ませる場合などは先にjQueryが読み込まれる担保ができませんので、予期しないエラーを発生させる可能性ができてしまいます。
html
1<head> 2 <script src="/jQuery" async></script> <!-- jQuery が先に読み込まれるとは限らない! --> 3 <script src="/maim.js" async></script> 4</head>
このような使い方であれば、async
を使わずに、bodyの閉じタグ前に書いてあげる方が読み込み順も担保できるので確実です
html
1 <script src="/jQuery"></script> <!-- jQuery が先に読み込まれる --> 2 <script src="/maim.js"></script> 3</body>
ですので、使用するjQueryなどのライブラリも1つのファイルにまとめる。もしくは、他のjavascriptファイルに依存しないファイルであればasync
属性を使えばhead内に記述しても、レンダリングをブロックしてしまうということはありません。
[参考]
async属性で簡単!非同期でjsを読み込みレンダリングを速くしよう
[追記]
逆にBodyタグ最後でJSファイルを読み込むことによるデメリットってあるんでしょうか?
HTMLのレンダリングが完了する前に何かjsを動かしておきたいというような事があれば、bodyの閉じタグ前より先にスクリプトタグを書いておかなければ意図したとおり動作しないかと思います。
下の例ではwriteImage.js
のある位置にもともとあったかのようにimgタグが追加されます。
HTMLがレンダリングされてから画像1の前にjavascriptで画像を追加すると一瞬表示がガタッとなってしまうかもしれません。これが嫌だ!というような場合はHTMLのレンダリングをブロックさせてでもスクリプトを実行させるメリットは有るかもしれません。
html
1<body> 2<script src="writeImage.js"></script> 3<div> 4 <img alt="画像1" src="http://dic.nicovideo.jp/oekaki/663056.png"> 5</div> 6</body>
javascript
1// writeImage.js 2var d = document; 3var url = 'http://cdn-ak.b.st-hatena.com/entryimage/236933222-origin-1419307828.jpg'; 4var img = d.createElement('img'); 5img.src = url; 6d.getElementsByTagName('body').item(0).appendChild(img);
メリットとは別の先に書いていたasync
との違いも試してみるとこが出来ます。
<script src="writeImage.js" async></script>
としてみてください。
async
はHTMLのレンダリングをブロックしませんので、必ずしも追加される画像が画像1の上に表示される訳ではなくなる事が確かめられると思います。
最近のTwitterとかはてなとかの埋め込みscriptタグはasync付きのものが多いですが、
コメントでご指摘頂いております通り、async
の方法は下記に注意する必要があります。
“async”(非同期)はIE 8/9, Android 2.2/2.3.といった、いくつかの前の型のブラウザに対応していません。
投稿2015/08/18 04:59
編集2015/08/18 07:05総合スコア596
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/08/18 06:31 編集
2015/08/18 06:38
2015/08/18 06:57
0
jQuery等、HTMLに直接スクリプトを埋め込んだ時に利用したいライブラリは、埋め込んだJavaScriptが読み込まれる前にロードが終わってないと、HTMLに埋め込んだスクリプトが動かなくなります。このスクリプトが動かないと、表示が想定したとおりにできません。なので、jQuery等はheadタグで読み込んでいる事が多いです。
投稿2015/08/16 10:36
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。