defer属性は、スクリプトの実行タイミングをページの読み込み後に遅らせるために指定する属性です。この属性は外部スクリプト(src属性を持つscriptタグ)にのみ有効で、値を持たないブール型属性として記述します。
defer属性の基本的な動作
defer属性が付与されたスクリプトは、以下のような流れで処理されます。
- HTMLの解析中にスクリプトファイルのダウンロードが並行して開始される
- HTMLドキュメントの解析(パース)が完了した後、DOM構築が終わってからスクリプトが順番に実行される
- 複数の
defer付きスクリプトがある場合、記述された順序どおりに実行されることが保証される
そのため、deferを使えばスクリプトの読み込みがページ表示をブロックすることなく、かつDOMへのアクセスも安全に行えるようになります。<body>の末尾にscriptタグを置く代替手法と似た効果がありますが、外部スクリプトの並列ダウンロードという点でより効率的です。
使用例
次のコードは、defer属性の基本的な使い方を示しています。
<!DOCTYPE html>
<html>
<body>
<script src="defer_test.js" defer></script>
<p>deferを使用しているため、外部ファイルは後から読み込まれます</p>
</body>
</html>
この例では、defer_test.jsはHTMLの解析が完了した時点で実行されます。ページのレンダリングを妨げることなくスクリプトを読み込めるため、ページの表示速度向上にも役立ちます。
async属性との違い
よく比較されるのがasync属性です。両者の主な違いは以下のとおりです。
- defer:ダウンロードは並行、実行はHTML解析完了後・記述順に実行
- async:ダウンロードは並行、ダウンロード完了後すぐに実行(順序は保証されない)
DOMの構築を前提としたスクリプトや、他のスクリプトとの依存関係がある場合はdeferを、広告やアクセス解析など独立性の高いスクリプトにはasyncを使うのが一般的です。