Поиск по сайту
Ctrl + K
Вопросы по HTML

Опишите разницу между <script>, <script async> и <script defer>

Элементы <script> используются для подключения и выполнения JavaScript-кода в HTML-документе. Однако, существуют разные способы подключения скриптов, которые могут повлиять на поведение страницы и ее производительность. В этой статье мы рассмотрим разницу между обычным <script>, <script async> и <script defer>, а также обсудим их использование и влияние на загрузку и рендеринг страницы.

<script> — обычный скрипт

По умолчанию, когда вы подключаете JavaScript с помощью тега <script>, браузер выполняет следующие действия:

  • Блокировка рендеринга: При загрузке страницы, браузер приостанавливает парсинг и рендеринг HTML-контента до тех пор, пока не загрузит и не выполнит скрипт. Это может замедлить рендеринг страницы, особенно если скрипт большой или внешний.
  • Синхронность: Скрипты, подключенные обычным способом, выполняются синхронно, то есть браузер сначала загружает файл скрипта, затем выполняет его, после чего продолжает рендеринг HTML-страницы.
  • Пример:

    <script src="script.js"></script>
    

    Этот способ используется, если скрипт должен быть выполнен до того, как будет отрисован контент страницы, например, для настройки функций, которые необходимы для первоначальной загрузки.

    <script async> — асинхронная загрузка скрипта

    Когда используется атрибут async, скрипт загружается асинхронно, что означает, что браузер может продолжить рендеринг страницы, не дожидаясь завершения загрузки и выполнения скрипта.

    Как работает async:

  • Загрузка скрипта: Скрипт загружается асинхронно, параллельно с другими процессами на странице.
  • Выполнение скрипта: После того как скрипт загружен, он немедленно выполняется, даже если остальные части страницы еще не были загружены. Это может повлиять на порядок выполнения скриптов, так как они могут быть выполнены в том порядке, в котором завершится их загрузка.
  • Когда использовать async:

    • Идеально для скриптов, которые не зависят от других частей страницы или других скриптов, например, для аналитики, виджетов, рекламы и прочего.

    Пример:

    <script src="script.js" async></script>
    

    В этом случае скрипт загружается асинхронно, но выполнение не блокирует рендеринг страницы.

    <script defer> — отложенная загрузка скрипта

    Когда используется атрибут defer, скрипт загружается асинхронно, но его выполнение откладывается до тех пор, пока вся HTML-страница не будет полностью загружена и обработана.

    Как работает defer:

  • Загрузка скрипта: Скрипт загружается асинхронно, параллельно с рендерингом страницы, но его выполнение откладывается.
  • Выполнение скрипта: Скрипт выполняется только после того, как весь HTML будет загружен и обработан. Это гарантирует, что скрипт будет выполнен в правильном порядке, даже если он загружался позже других скриптов.
  • Когда использовать defer:

    • Идеально для скриптов, которые должны быть выполнены после загрузки всего контента страницы, но не должны блокировать рендеринг.

    Пример:

    <script src="script.js" defer></script>
    

    Скрипт загружается асинхронно, но выполняется только после того, как весь HTML будет загружен.

    Разница между async и defer

    Характеристика<script><script async><script defer>
    ЗагрузкаСинхроннаяАсинхроннаяАсинхронная
    ВыполнениеСинхронноеНемедленное (по завершению загрузки)После загрузки всей страницы
    Порядок выполненияВ том порядке, в котором указаны тегиВ том порядке, в котором завершена загрузкаВ том порядке, в котором указаны теги
    Блокировка рендерингаДаНетНет

    Когда использовать каждый из вариантов

  • Обычный <script>: Используйте, если JavaScript критичен для первоначальной загрузки страницы, например, для настроек, без которых страница не может корректно функционировать.
  • <script async>: Используйте, если скрипт независим и не зависит от других частей страницы, например, для аналитики или рекламы. Такой скрипт можно загрузить и выполнить параллельно с другими процессами на странице.
  • <script defer>: Используйте, если скрипт зависит от других частей страницы (например, взаимодействует с DOM) и должен быть выполнен только после того, как страница будет полностью загружена. Это гарантирует, что скрипт выполнится в правильном порядке.
  • Заключение

    Выбор между обычным <script>, <script async> и <script defer> зависит от того, как важен тот или иной скрипт для рендеринга страницы и от порядка выполнения JavaScript-кода. Правильное использование этих атрибутов поможет улучшить производительность страницы и оптимизировать её загрузку.

    Полезные ссылки: