スクリプトの実行タイミング

JavaScriptはブラウザ上で実行され、Webページに動きや機能を追加するためのプログラミング言語です。スクリプトがいつ実行されるかによって、ページの表示速度や動作に大きな違いが生まれます。
特に、JavaScriptを読み込む位置や、async・deferなどの属性の違いは、現在のWeb開発では非常に重要なポイントです。本記事では、それぞれの実行タイミングと使い分けについて分かりやすく解説します。
スクリプトの実行タイミング
ブラウザはHTMLを上から順番に読み込みながらページを表示します。JavaScriptを読み込む位置や設定によって、実行されるタイミングが異なります。
| タイミング | 説明 |
|---|---|
<head>内での実行 |
HTMLの解析中にスクリプトが実行されます。処理が終わるまでHTMLの解析が一時停止するため、ページ表示が遅くなることがあります。 |
<body>末尾での実行 |
ページの主要なHTMLを読み込んだ後にスクリプトが実行されます。画面が表示されてから処理されるため、表示速度への影響を抑えられます。 |
非同期スクリプト(async) |
HTMLの解析と並行してダウンロードされ、準備ができ次第すぐに実行されます。実行順序は保証されません。 |
遅延スクリプト(defer) |
HTMLの解析と並行してダウンロードされ、HTMLの解析完了後に順番どおり実行されます。 |
現在はdeferが推奨されることが多い
近年のWeb開発では、外部JavaScriptファイルを読み込む際はdefer属性を付ける方法が一般的です。
HTMLの表示を妨げず、スクリプトの実行順序も保たれるため、多くのWebサイトで採用されています。
スクリプトの実行場所とタイミングの違い
スクリプトをどこに配置するかによって、ページの表示速度やJavaScriptからHTML要素へアクセスできるタイミングが変わります。
<head>内のスクリプト
<head>内に配置されたスクリプトは、その位置までHTMLが読み込まれるとすぐに実行されます。
<head>
<script src="script.js"></script>
</head>
この場合、JavaScriptの実行中はHTMLの解析が停止します。そのため、処理が重いスクリプトではページ表示が遅くなる場合があります。
また、この時点ではまだ<body>内の要素が読み込まれていないため、ボタンや入力欄などのHTML要素を取得しようとするとエラーになることがあります。
<body>末尾のスクリプト
<body>タグの終了直前に配置すると、HTMLの大部分を読み込んでからJavaScriptが実行されます。
<body>
<!-- ページのコンテンツ -->
<script src="script.js"></script>
</body>
この配置方法では、画面表示を優先できるほか、多くの場合でHTML要素が既に読み込まれているため、そのままJavaScriptから操作できます。
以前はこの方法がよく利用されていましたが、現在ではdeferを利用するケースが増えています。
非同期スクリプトと遅延スクリプト
非同期スクリプト(async)
async属性を付けると、HTMLの解析と並行してスクリプトがダウンロードされます。ダウンロードが完了すると、その時点で直ちに実行されます。
<script src="script.js" async></script>
特徴は次のとおりです。
- HTMLの解析と並行してダウンロードされる。
- ダウンロード完了後、すぐに実行される。
- 複数の
asyncスクリプトがある場合、実行順序は保証されない。
アクセス解析ツールや広告タグなど、他のJavaScriptに依存しないスクリプトに適しています。
遅延スクリプト(defer)
defer属性を付けたスクリプトもHTMLの解析と並行してダウンロードされますが、実行されるのはHTMLの解析が完了した後です。
<script src="script.js" defer></script>
特徴は次のとおりです。
- HTMLの解析を止めない。
- HTMLの解析完了後に実行される。
- 複数の
deferスクリプトは記述した順番どおりに実行される。
複数のJavaScriptファイルを順番どおり実行したい場合や、ページ内のHTML要素を操作するスクリプトでは、deferを使用するのが一般的です。
asyncとdeferの使い分け
| 属性 | 実行タイミング | 実行順序 | 主な用途 |
|---|---|---|---|
async |
ダウンロード完了後すぐ | 保証されない | 広告、アクセス解析など |
defer |
HTML解析完了後 | 保証される | 一般的なWebアプリやサイト |
初心者が覚えておきたいポイント
- HTML要素を操作するJavaScriptでは、要素が読み込まれてから実行する必要があります。
- 現在は外部JavaScriptファイルを読み込む際に
deferを利用するケースが多くなっています。 asyncは便利ですが、実行順序が保証されないため依存関係のあるスクリプトには向きません。- ページ表示を高速化するためにも、実行タイミングを意識することが重要です。
まとめ
- JavaScriptは読み込む位置や属性によって実行タイミングが変わる。
<head>内に配置するとHTMLの解析が一時停止することがある。<body>末尾に配置すると画面表示を優先できる。asyncは実行順序が保証されず、独立したスクリプト向きである。deferはHTML解析後に順番どおり実行されるため、現在のWeb開発で広く利用されている。