[Easy] 📄 <script>, <script async>, <script defer>
Обзор (Overview)
В HTML существует три основных способа загрузки JavaScript-файлов:
<script><script async><script defer>
Эти три способа ведут себя по-разному при загрузке и выполнении скриптов.
Подробное сравнение (Detailed Comparison)
<script>
- Поведение: когда браузер встречает этот тег, он приостанавливает парсинг HTML, загружает и выполняет скрипт, затем продолжает парсинг.
- Когда использовать: для скриптов, критически важных для рендеринга.
- Плюсы: гарантирует выполнение скриптов в порядке.
- Минусы: может задерживать рендеринг страницы.
<script src="important.js"></script>
<script async>
- Поведение: браузер загружает скрипт в фоновом режиме, продолжая парсить HTML. После загрузки скрипт немедленно выполняется и может прервать парсинг.
- Когда использовать: для независимых скриптов, таких как аналитика или реклама.
- Плюсы: не блокирует парсинг HTML и может ускорить загрузку.
- Минусы: порядок выполнения не гарантирован, и скрипт может запуститься до полной готовности DOM.
<script async src="analytics.js"></script>
<script defer>
- Поведение: браузер загружает скрипт в фоновом режиме, но выполняет его только после завершения парсинга HTML. Несколько отложенных скриптов выполняются в порядке документа.
- Когда использовать: для скриптов, которым нужен полный DOM, но которые не нужны немедленно.
- Плюсы: не блокирует парсинг HTML, сохраняет порядок и хорошо работает для скриптов, зависящих от DOM.
- Минусы: если скрипт критичен, он может задержать интера ктивность.
<script defer src="ui-enhancements.js"></script>
Аналогия (Analogy)
Представьте, что вы готовитесь к свиданию:
-
<script>: Вы бросаете все дела и звоните партнёру, чтобы уточнить детали. Общение ясное, но подготовка откладывается. -
<script async>: Вы готовитесь, разговаривая через Bluetooth-наушники. Это эффективно, но вы можете потерять фокус и допустить ошибки. -
<script defer>: Вы отправляете сообщение, что позвоните после подготовки. Можно закончить подготовку, а потом нормально пообщаться.
Текущее использование (Current Usage)
В современных фреймворках вы обычно не настраиваете поведение <script> вручную.
Например, Vite по умолчанию использует type="module", что ведёт себя аналогично defer.
<script type="module" src="/src/main.js"></script>
Исключение — сторонние скрипты, например Google Analytics.
<script async src="https://www.google-analytics.com/analytics.js"></script>