Кратко
СкопированоСкрипты с атрибутами defer
загружаются и выполняются последовательно, а с async
– асинхронно. Кроме того, defer
всегда ждёт, пока весь HTML-документ будет готов, а async
выполняется сразу после загрузки.
Как пишется
СкопированоОба атрибута являются логическими. Это значит, что им не нужно задавать значение. Если атрибут указан, то браузер понимает это как команду к действию. Чтобы отменить эффект, достаточно убрать атрибут.
Как понять
СкопированоОбычно браузеры загружают <script>
синхронно, во время разбора документа. Поэтому принято добавлять скрипты в конец документа, перед <
, чтобы они не тормозили загрузку страницы. Но при помощи атрибутов defer
и async
можно явно управлять порядком загрузки и выполнения скриптов.
Атрибут async
СкопированоУказывает браузеру по возможности загружать скрипт асинхронно.
Скрипт выполняется полностью асинхронно. Это означает, что файл будет выполняться без ожидания загрузки и отображения веб-страницы. При обнаружении <script async src
браузер не останавливает обработку страницы, а спокойно работает дальше. Когда скрипт будет загружен – он выполнится.
<script src="script1.js" async></script><script src="script2.js" async></script>
<script src="script1.js" async></script> <script src="script2.js" async></script>
Первым выполнится тот скрипт, который быстрее загрузится.
Поддерживается всеми браузерами, кроме IE9-.
Атрибут defer
СкопированоУказывает браузеру что скрипт должен выполняться после разбора документа, но до события DOM
.
Скрипты с атрибутом defer
будут предотвращать запуск события DOM
до тех пор, пока скрипт не загрузится полностью и не завершится его инициализация.
<script src="script1.js" defer></script><script src="script2.js" defer></script>
<script src="script1.js" defer></script> <script src="script2.js" defer></script>
Первым всегда выполнится script1
, который подключён раньше. Даже если script2
загрузится раньше, он будет выполнен после первого скрипта.
Применение
СкопированоНа практике defer
используется для скриптов, которым требуется доступ ко всему DOM-дереву или если важен их порядок выполнения.
А async
хорош для независимых скриптов, например счётчиков и рекламы, порядок выполнения которых не играет роли.
Подсказки
Скопировано💡 Динамически вставленный <script>
(например, вставленный при помощи document
) по умолчанию загружается браузером асинхронно.
На собеседовании
СкопированоЭто вопрос без ответа. Вы можете помочь! Почитайте о том, как контрибьютить в Доку.