Sobes.tech
Back to questions
Middle
90
questionbank

Как правильно задать последовательность выполнения скриптов?

Sobes Copilot

Get answers in real time

Answer from AI

sobes.tech AI

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

HTML-порядок:

Браузер выполняет скрипты в том порядке, в котором они встречаются в документе (<head> или <body>), если не используются атрибуты async или defer. Парсинг HTML приостанавливается до полного выполнения каждого скрипта.

Атрибуты:

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

    <script async src="script1.js"></script>
    <script async src="script2.js"></script>
    
  • defer: Скрипт загружается асинхронно параллельно с парсингом HTML. Выполнение скрипта откладывается до тех пор, пока весь HTML-документ не будет полностью разобран. Скрипты с defer выполняются в том порядке, в котором они указаны в HTML.

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

Сравнение:

Атрибут Загрузка скрипта Выполнение скрипта Порядок выполнения Приостановка парсинга HTML
Без Блокирует парсинг HTML Сразу после загрузки В порядке HTML Да
async Асинхронно, не блокирует Как только загружен (может блокировать парсинг) Не гарантируется Да (во время выполнения)
defer Асинхронно, не блокирует После завершения парсинга HTML (DOMContentLoaded) В порядке HTML Нет

Динамическое добавление:

Скрипты, добавляемые в DOM с помощью JavaScript (document.createElement('script'), element.appendChild()), по умолчанию загружаются и выполняются асинхронно. Если вам нужен синхронный или упорядоченный асинхронный способ, можно использовать callback-функции или промисы.

// Пример динамического добавления с гарантированным порядком
function loadScript(src, callback) {
  const script = document.createElement('script');
  script.src = src;
  script.onload = callback; // Выполнить callback после загрузки скрипта
  document.head.appendChild(script);
}

loadScript('script1.js', () => {
  loadScript('script2.js', () => {
    console.log('Оба скрипта загружены и выполнены в порядке.');
  });
});