Всегда ли загружаются скрипты синхронно?
Продвинутые темы
Нет, скрипты загружаются синхронно не всегда: по умолчанию — да (блокируя парсинг), но атрибуты `async` и `defer`, а также динамическое добавление делают загрузку асинхронной.
По умолчанию — синхронно (блокирующе)
Обычный <script> блокирует парсинг HTML: браузер останавливается, загружает и выполняет скрипт, потом продолжает:
<script src="app.js"></script> <!-- блокирует парсинг -->Асинхронная загрузка
async
Загружается параллельно с парсингом, выполняется сразу по загрузке (порядок не гарантирован):
<script async src="analytics.js"></script>defer
Загружается параллельно, выполняется после DOM (порядок сохраняется):
<script defer src="app.js"></script>Модули (type="module")
По умолчанию ведут себя как defer.
Динамическое добавление
Скрипты, созданные из JS, загружаются асинхронно:
const s = document.createElement('script');
s.src = 'lib.js';
document.head.appendChild(s); // асинхронноКоротко для собеседования
Нет: по умолчанию скрипт грузится синхронно, блокируя парсинг HTML. Но async (параллельно, выполнение по загрузке), defer (параллельно, после DOM), модули (как defer) и динамически добавленные скрипты загружаются асинхронно. Синхронность — только у обычного <script> без атрибутов.