JavaScript - async属性とdefer属性の違い

JavaScriptfの外部ファイルを非同期で読み込む方法として、 HTML5から「async属性」と「defer属性」が追加されました。

どちらも非同期でファイルを読み込むのですが、 その後の動作に違いがあります。

ここでは、async属性とdefer属性の違いについて説明します。

まずは、それぞれの属性の特徴をみてみます。

async属性の特徴

asyncという単語は「非同期、非同期の」という意味です。

asyncの特徴は次の通りです。

  • 非同期で読み込まれる
  • 読み込み完了後にJSファイル内容が実行される
  • 実行順序が保証されていない

defer属性の特徴

deferという単語は「遅らせる、延期する」という意味です。

deferの特徴は次の通りです。

  • 非同期で読み込まれる
  • 読み込みが完了してもすぐには実行されない
  • HTML解析後にJSファイルが実行される
  • 実行順序が保証されている

async属性とdefer属性の違い

上記の特徴から、両者の違いを上げると、

実行タイミングと、実行順序に違いがあります。

実行タイミングの違い

asyncの場合は、JSファイルの読み込み完了後に実行されます。

一方、deferの場合は、JSファイルが読み込まれてもすぐには実行されず、 HTML解析後に実行されます。

deferの実行タイミングをもう少し詳しく言うと、 「HTML解析完了後かつ DOMContentLoaded が発生する前」です。

実行順序の違い

async属性は実行順序が保証されたいないため、依存関係のあるファイルに asyac指定をすると、正常に実行されない可能性があります。


// async 実行順序は保証されない
<script src="common.js" async></script>
<script src="parts1.js" async></script>
<script src="parts2.js" async></script>

一方、defer属性は、記述した順序でJSファイルが実行されます。

ですから、JSファイルに依存関係がある場合は、 asyncではなくdeferを指定するといいでしょう。


// defer 実行順序は保証される
<script src="common.js" defer></script>
<script src="parts1.js" defer></script>
<script src="parts2.js" defer></script>

まとめ

・どちらも非同期で読み込まれます。

・asyncは読み込み完了後に実行されるが、実行順序の保証はありません。

・deferはHTML解析後に実行され、実行順序が保証されます。

・依存関係のある複数ファイルを読み込む場合は、deferを使った方がいいでしょう。