JavaScriptファイルの非同期ロード、asyncとdeferの違いを図で説明

JavaScriptファイルを非同期で読み込む手段として、 HTML5で追加されたasync属性とdefer属性があります。

どちらも非同期で読み込むのは同じですが、 JSファイルの実行順序実行タイミングが異なります。

ここでは、図を使って、asyncとdeferの違いを説明します。

実行順序の違い(複数のJSファイル指定時)

async属性

asyncで複数のJSファイルを指定する場合、 JSファイルの実行順序が保証されません

ですから、依存関係がある複数ファイルを指定した場合、 正常に動作しない可能性があります。

例えば、次のように記述しても「common.js」ファイルが先に実行されない可能性があります。


<script src="common.js" async></script>
<script src="parts.js" async></script>

defer属性

一方、defer属性を指定した場合、 指定した順番にJSファイルを実行します

ですから、指定する複数ファイルに依存関係がある場合は、 defer属性を指定します。

実行タイミングの違い

普通のロード、(async、deferなし)

「async」も「defer」も指定しない場合、


<script src="test.js"></script>

図にすると、次のようになります。

async、deferなし

HTML解析の途中でJSファイルのロードが始まり、 JSファイルのロードが終わるとJSファイルの実行が始まります。

JSファイルの実行が終わったら、HTML解析が再開されます。

つまり、「JSファイルのロード・実行中」は、、HTML解析を中断しています

async属性を指定した場合

async属性を指定した場合、


<script src="test.js" async></script>

図にすると、次のようになります。

async

HTML解析中に、JSファイルを非同期にロードします。

この間、HTML解析は中断されません(これが非同期ロードの特徴です)

非同期でのJSファイルのロードが終わった時点で、JSファイルが実行されます。

この間はHTML解析は中断されます。

そして、JSファイルの実行が終わったら、HTML解析が再開されます。

defer属性を指定した場合

defer属性を指定した場合、


<script src="test.js" defer></script>

図にすると、次のようになります。

defer

HTML解析中に、JSファイルを非同期にロードします。

JSファイルのロードが終わっても、JSファイルはすぐには実行されません。

HTMLの解析が終わってから、JSファイルが続行されます。

この点がasync属性と異なる所です。

defer属性を指定すると、HTML解析が中断されません。

まとめ

・async属性とdefer属性は、どちらも非同期ロードする点では同じです。

・JSファイルの実行順序と実行タイミングがことなります。

・async属性は実行順序が保証されません。

・defer属性は指定した順番で実行されます。

・async属性はJSファイルのロード後に実行されます。

・defer属性はHTML解析が終了後に実行されます。