Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про JavaScript: script loading, async, defer, HTML parsing, DOMContentLoaded

Что происходит при загрузке скрипта без async и defer?

Вопрос проверяет понимание порядка загрузки и выполнения скриптов в HTML-документе и их влияния на отрисовку страницы.

Короткий ответ

Когда браузер встречает тег

Длинный ответ

Когда браузер загружает HTML-страницу, он последовательно парсит (разбирает) её содержимое, строя DOM-дерево. Встречая обычный тег <script> без атрибутов async или defer, он немедленно приостанавливает процесс парсинга. Это критическое поведение, потому что скрипт может содержать команды, изменяющие DOM (например, document.write), и браузер должен обеспечить согласованное состояние дерева.

Последовательность событий

  1. Браузер находит тег <script src="app.js">.
  2. Парсинг HTML приостанавливается.
  3. Браузер начинает загрузку файла скрипта с сервера (если указан src).
  4. После полной загрузки скрипт выполняется синхронно.
  5. Только после завершения выполнения парсинг HTML возобновляется.

Практический пример и последствия

Рассмотрим простую HTML-страницу:

<!DOCTYPE html>
<html>
<head>
    <title>Пример</title>
    <script src="heavy-script.js"></script>
</head>
<body>
    <h1>Важный заголовок</h1>
    <p>Этот текст появится с задержкой.</p>
</body>
</html>

Пока браузер загружает и выполняет heavy-script.js, пользователь увидит пустой экран. Контент страницы (<h1>, <p>) не будет отрисован до завершения работы скрипта. Это приводит к плохому пользовательскому опыту, особенно при медленном соединении.

Где это применяется и как избежать проблем

Такой подход необходим, если скрипту критически важно взаимодействовать с DOM-элементами, расположенными непосредственно перед ним, или если порядок выполнения нескольких скриптов строго задан. Однако в современной разработке для оптимизации производительности рекомендуется:

  • Использовать атрибут defer для скриптов, которым не нужно выполняться немедленно. Они загрузятся параллельно с парсингом, но выполнятся только после полного построения DOM, перед событием DOMContentLoaded.
  • Использовать атрибут async для независимых скриптов (например, счётчиков аналитики), которые могут выполниться в любой момент после загрузки, не блокируя парсинг.
  • Размещать некритичные скрипты перед закрывающим тегом </body>, чтобы основной контент успел отобразиться.

Вывод: Обычная загрузка скрипта (без async/defer) блокирует парсинг страницы, что может серьёзно ухудшить воспринимаемую скорость загрузки. Используйте её осознанно, только когда требуется строгий порядок выполнения и немедленный доступ к DOM. В большинстве случаев для скриптов, работающих с DOM, предпочтительнее defer, а для независимых — async.

Уровень

  • Рейтинг:

    4

  • Сложность:

    3

Навыки

  • JavaScript

    JavaScript

  • HTML

    HTML

Ключевые слова

#script loading

#async

#defer

#HTML parsing

#DOMContentLoaded

Подпишись на React Developer в телеграм