正解はHTMLの解析を止めずにスクリプトをダウンロードし、解析完了後に実行することです。asyncはダウンロード完了後すぐに実行(解析を一時停止)します。deferはDOMContentLoadedイベント前に順序通り実行されるため、DOM操作を含むスクリプトに適しています。