質問するログイン新規登録

回答編集履歴

2

追加部分の誤字を修正

2017/11/17 06:34

投稿

miyabi-sun
miyabi-sun

スコア21542

answer CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  インターネット上には回線速度やマシンスペックが速い人も遅い人も居ます。
7
7
  特にスマホユーザーは多くのケースで回線速度やマシンスペックが低速になってしまいます。
8
- パフォーマンスを重視する為に</body>直前に設置する事が基本です。
8
+ パフォーマンスを重視する為に`</body>`直前に設置する事が基本です。
9
9
 
10
10
  対するheadに設置する主張は、CSSやメタ情報等と同じ位置にあり統一感が取れていることですね。
11
11
 
@@ -64,12 +64,12 @@
64
64
 
65
65
  HTML5で実装されたasyncという属性を利用しています。
66
66
  この属性が付与されたscriptタグはDOMの読み込みを停止することなく裏で読み込み続けてくれます。
67
- ただし、依存ライブラ等がどの順番で読み込まれるか制御できなくなります詳しくはコメント欄へ)
67
+ デメットります詳しくはコメント欄へ)
68
68
 
69
69
  他にも最近ではSPA(シングルページアプリケーション)という
70
70
  JavaScriptで画面全ての面倒を見るWebアプリが増えています。
71
71
  その場合ODMツリーを先に描画しようがしまいがあまり関係なくなってしまいますね。
72
72
 
73
73
  とりあえずは</body>の直前が好ましいと覚えておくと良いでしょう。
74
- ただし、フロントエンド技術者としての技術力が爺文にあればhead内に設置してあっても構いません。
74
+ ただし、フロントエンド技術者としての技術力が十分にあればhead内に設置してあっても構いません。
75
75
  色々調べてみたり試してみてください。

1

校正+おまけ追加

2017/11/17 06:33

投稿

miyabi-sun
miyabi-sun

スコア21542

answer CHANGED
@@ -1,28 +1,33 @@
1
- に於かで決まります。
1
+ を重視したいかで決まります。
2
2
 
3
3
  - HTML構造の綺麗さを重視: JSは`head`内に全て設置
4
4
  - パフォーマンスを重視: JSは`</body>`の直前に全て設置
5
5
 
6
- 基本的Webは回線速度やマシンスペックが速い人も遅い人も居るわけで、
6
+ インターネット上には回線速度やマシンスペックが速い人も遅い人も居ます。
7
+ 特にスマホユーザーは多くのケースで回線速度やマシンスペックが低速になってしまいます。
7
8
  パフォーマンスを重視する為に</body>直前に設置する事が基本です。
8
- (でも汚いですし、エンジニア的には整頓できてないからイライラするので、こういうサイトで聞くと前者が紹介されることが多いでしょう)
9
9
 
10
+ 対するheadに設置する主張は、CSSやメタ情報等と同じ位置にあり統一感が取れていることですね。
11
+
10
12
  ---
11
13
 
12
14
  何故構造と速度で分けたか?
15
+
13
16
  理由としては、JavaScriptはダウンロードから実行完了まで描画が停止します。
14
17
  その為Googleの検索エンジンでは「head要素内にJavaScriptは入れないでください」とアナウンスしています。
15
18
  アナリティクス等のコードも「</body>タグの直前に挿入してください」という一文があり徹底しています。
16
19
 
17
- headに書いたほうが統一感があるのはそのまんまなので割愛します。
18
-
19
20
  ---
20
21
 
21
22
  > JSでDOMの操作をしたい場合対象となるhtmlの要素を読み込んだあとでないと動作しないと思います。
22
23
 
24
+ その通り!
25
+
23
- その通り、DOMツリー構造が読み込まれる前なので、先に書いても期待通りの動作はされません。
26
+ DOMツリー構造が読み込まれる前なので、先に書いても期待通りの動作はされません。
24
27
  しかしJavaScriptはイベント駆動で動作しており、ブラウザが発行する様々なイベントをトリガーに関数を実行することが可能です。
28
+
25
29
  その中には「DOMツリー構造をブラウザが全て読み終わった」というイベントも用意されています。
30
+ 下記のような記述のスクリプトを見たことはありませんか?
26
31
 
27
32
  ```JavaScript
28
33
  function fn () {
@@ -43,4 +48,28 @@
43
48
  });
44
49
  ```
45
50
 
46
- これならばhead要素内にJSを設置してもDOMツリー構造を解析するまで処理が遅延されます。
51
+ これならばhead要素内にJSを設置してもDOMツリー構造を解析するまで処理が遅延されます。
52
+
53
+ ---
54
+
55
+ 【追記】おまけ: 速度を犠牲にせず、headに設置できないか?
56
+
57
+ 結論から言えば可能です。
58
+ 例えばあまりの速さで大騒ぎになってる[dev.to](http://dev.to)というサイトでは、
59
+ headタグ内に全てのscriptタグが設置されています。
60
+
61
+ Googleの[PageSpeed Insights](https://developers.google.com/speed/pagespeed/insights/)では
62
+ head要素内に設置したscriptタグは減点扱いになりますが、dev.toは減点されてません。
63
+ なぜ?Googleにお金払ったから?
64
+
65
+ HTML5で実装されたasyncという属性を利用しています。
66
+ この属性が付与されたscriptタグはDOMの読み込みを停止することなく裏で読み込み続けてくれます。
67
+ (ただし、依存ライブラリ等がどの順番で読み込まれるかも制御できなくなります、詳しくはコメント欄へ)
68
+
69
+ 他にも最近ではSPA(シングルページアプリケーション)という
70
+ JavaScriptで画面全ての面倒を見るWebアプリが増えています。
71
+ その場合ODMツリーを先に描画しようがしまいがあまり関係なくなってしまいますね。
72
+
73
+ とりあえずは</body>の直前が好ましいと覚えておくと良いでしょう。
74
+ ただし、フロントエンド技術者としての技術力が爺文にあればhead内に設置してあっても構いません。
75
+ 色々調べてみたり試してみてください。