Атрибуты async и defer используются для управления загрузкой внешних JavaScript-файлов и влияют на порядок исполнения скриптов и время загрузки страницы.
Основное отличие заключается в порядке исполнения скриптов и блокировке парсинга HTML.
async не гарантирован. Они исполняются сразу после загрузки, в порядке, отличном от порядка их упоминания в HTML, в зависимости от скорости загрузки каждого файла.Пример:
html
В этом случае script1.js и script2.js загрузятся одновременно, но кто из них исполнится первым, неизвестно.
defer исполняются в том порядке, в котором они указаны в HTML.Пример:
html
В этом случае script1.js и script2.js загрузятся одновременно, но script1.js гарантированно исполнится до script2.js, и оба скрипта будут исполнены только после парсинга HTML.
| Характеристика | async | defer |
|---|---|---|
| Загрузка | Асинхронная (не блокирует парсинг HTML) | Асинхронная (не блокирует парсинг HTML) |
| Исполнение | Сразу после загрузки (может прервать парсинг) | После полного парсинга HTML |
| Порядок исполнения | Не гарантирован | В порядке следования в HTML |
| Зависимость от DOM | Не должен зависеть от полного DOM | Может зависеть от полного DOM |
Если скрипт не имеет ни async, ни defer атрибутов, его загрузка и исполнение блокируют парсинг HTML до завершения. Это может замедлить отображение страницы.