Атрибуты async
и defer
используются для управления загрузкой и выполнением внешних JavaScript-файлов в HTML-документе. Оба атрибута применяются к тегу <script>
, когда он ссылается на внешний файл (например, <script src="example.js"></script>
). Разберем их подробнее:
Атрибут async
Описание: Атрибут async
указывает браузеру загружать скрипт асинхронно, то есть параллельно с парсингом остальной части страницы. Как только скрипт будет загружен, его выполнение блокирует обработку документа до завершения выполнения скрипта.
Поведение:
- Скрипт загружается одновременно с другими ресурсами (CSS, изображения) и остальными частями HTML.
- Когда скрипт готов, браузер приостанавливает рендеринг страницы и выполняет этот скрипт.
- После завершения выполнения скрипта продолжается обработка оставшейся части документа.
Пример использования:
<script src="example.js" async></script>
Когда использовать:
- Если ваш скрипт не зависит от других скриптов и может быть выполнен независимо от порядка загрузки остальных ресурсов.
- Для сторонних библиотек, которые могут работать автономно.
Атрибут defer
Описание: Атрибут defer
также указывает браузеру загружать скрипт асинхронно, но выполнение этого скрипта откладывается до тех пор, пока вся страница полностью не будет загружена и обработана.
Поведение:
- Скрипт загружается параллельно с другими ресурсами, как и в случае с
async
. - Однако вместо немедленного выполнения после загрузки, скрипт ожидает полной загрузки и обработки всего HTML-документа перед началом своего выполнения.
- Скрипты с атрибутом
defer
выполняются в порядке их появления в документе.
Пример использования:
<script src="example.js" defer></script>
Когда использовать:
- Если вам нужно гарантировать, что все элементы DOM будут доступны до начала выполнения скрипта.
- Если несколько скриптов зависят друг от друга и должны выполняться строго по порядку.
Сравнение
Загрузка | Выполнение | |
---|---|---|
async |
Параллельно | Сразу после загрузки |
defer |
Параллельно | После полной загрузки страницы |
Важные моменты:
- Совместное использование: Нельзя применять оба атрибута (
async
иdefer
) одновременно к одному и тому же скрипту. В таком случае поведение браузера может отличаться в зависимости от реализации. - Поддержка: Оба атрибута поддерживаются всеми современными браузерами.
- Встроенные скрипты: Эти атрибуты применимы только к внешним скриптам, встроенный код внутри тега
<script>
всегда выполняется синхронно.
Таким образом, выбор между async
и defer
зависит от того, насколько критично время выполнения вашего скрипта относительно загрузки всей страницы и наличия зависимостей между различными скриптами.