\n\n\n\n\n\n```\n\n## Attribute: async\n\n`async` загружает скрипт параллельно и выполняет его сразу после загрузки, не дожидаясь парсинга DOM. Скрипты выполняются в произвольном порядке. Используй для независимых скриптов (аналитика, трекеры).\n\n```html\n\n\n\n\n\n\n```\n\n## Динамическая загрузка с помощью JavaScript\n\nДля более гибкого контроля можешь динамически загружать скрипты:\n\n```javascript\n// Загрузка без блокировки\nfunction loadScript(src) {\n return new Promise((resolve, reject) => {\n const script = document.createElement('script');\n script.src = src;\n script.async = true;\n \n script.onload = resolve;\n script.onerror = reject;\n \n document.head.appendChild(script);\n });\n}\n\n// Использование\nawait loadScript('app.js');\nconsole.log('Script loaded!');\n\n// Загрузка нескольких скриптов параллельно\nPromise.all([\n loadScript('lib1.js'),\n loadScript('lib2.js'),\n loadScript('lib3.js')\n]).then(() => {\n console.log('All scripts loaded!');\n});\n```\n\n## Динамическая загрузка с контролем порядка\n\nЕсли нужен конкретный порядок выполнения:\n\n```javascript\n// Последовательная загрузка\nasync function loadScriptsInOrder(scripts) {\n for (const src of scripts) {\n await loadScript(src);\n }\n console.log('All scripts loaded in order!');\n}\n\nloadScriptsInOrder([\n 'jquery.js',\n 'bootstrap.js',\n 'app.js'\n]);\n\n// Или более просто с async/await\nconst loadScriptAsync = (src) => \n new Promise((resolve) => {\n const script = document.createElement('script');\n script.src = src;\n script.onload = () => resolve();\n document.head.appendChild(script);\n });\n\nawait loadScriptAsync('dependency.js');\nawait loadScriptAsync('app.js');\n```\n\n## Modern approach: ES Modules\n\nС поддержкой модулей в браузере можешь использовать native imports:\n\n```html\n\n\n```\n\n```javascript\n// app.js\nimport { init } from './modules/init.js';\nimport { setupUI } from './modules/ui.js';\n\nawait init();\nawait setupUI();\n```\n\n## Сравнение стратегий\n\n```\nсинхронный \n \n \n \n \n \n \n\n```\n\nВывод: используй `defer` для основных скриптов, `async` для независимых, и избегай синхронной загрузки. Это значительно улучшит Core Web Vitals и пользовательский опыт.","dateCreated":"2026-04-02T22:24:57.093638","upvoteCount":0,"author":{"@type":"Person","name":"claude-haiku-4.5"}}}}
← Назад к вопросам

Как загружать скрипт, не блокируя загрузку страницы?

2.0 Middle🔥 121 комментариев
#Браузер и сетевые технологии

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Неблокирующая загрузка скриптов: async и defer

Дефолтное поведение тега <script> в HTML — синхронная загрузка и выполнение, что блокирует парсинг DOM и рендеринг страницы. Это серьезно замедляет Time to Interactive. Есть несколько стратегий решения.

Attribute: defer

Атрибут defer загружает скрипт параллельно с парсингом DOM, но выполняет его только после полной загрузки документа. Это идеально для скриптов, которые зависят от DOM-элементов.

<!-- Загружается в фоне, выполняется ПОСЛЕ парсинга DOM -->
<script src="app.js" defer></script>

<!-- Несколько скриптов с defer выполняются в порядке исходного кода -->
<script src="library.js" defer></script>
<script src="app.js" defer></script>
<!-- library.js выполнится ДО app.js -->

Attribute: async

async загружает скрипт параллельно и выполняет его сразу после загрузки, не дожидаясь парсинга DOM. Скрипты выполняются в произвольном порядке. Используй для независимых скриптов (аналитика, трекеры).

<!-- Загружается и выполняется в любой момент -->
<script src="analytics.js" async></script>

<!-- Несколько async скриптов — не гарантирован порядок -->
<script src="tracker1.js" async></script>
<script src="tracker2.js" async></script>

Динамическая загрузка с помощью JavaScript

Для более гибкого контроля можешь динамически загружать скрипты:

// Загрузка без блокировки
function loadScript(src) {
  return new Promise((resolve, reject) => {
    const script = document.createElement('script');
    script.src = src;
    script.async = true;
    
    script.onload = resolve;
    script.onerror = reject;
    
    document.head.appendChild(script);
  });
}

// Использование
await loadScript('app.js');
console.log('Script loaded!');

// Загрузка нескольких скриптов параллельно
Promise.all([
  loadScript('lib1.js'),
  loadScript('lib2.js'),
  loadScript('lib3.js')
]).then(() => {
  console.log('All scripts loaded!');
});

Динамическая загрузка с контролем порядка

Если нужен конкретный порядок выполнения:

// Последовательная загрузка
async function loadScriptsInOrder(scripts) {
  for (const src of scripts) {
    await loadScript(src);
  }
  console.log('All scripts loaded in order!');
}

loadScriptsInOrder([
  'jquery.js',
  'bootstrap.js',
  'app.js'
]);

// Или более просто с async/await
const loadScriptAsync = (src) => 
  new Promise((resolve) => {
    const script = document.createElement('script');
    script.src = src;
    script.onload = () => resolve();
    document.head.appendChild(script);
  });

await loadScriptAsync('dependency.js');
await loadScriptAsync('app.js');

Modern approach: ES Modules

С поддержкой модулей в браузере можешь использовать native imports:

<!-- Автоматически асинхронно, типо defer -->
<script type="module" src="app.js"></script>
// app.js
import { init } from './modules/init.js';
import { setupUI } from './modules/ui.js';

await init();
await setupUI();

Сравнение стратегий

синхронный <script>:
  Время загрузки: ████████ БЛОКИРУЕТ парсинг
  Используй: Критичные скрипты нужные ДО рендера

<script defer>:
  Время загрузки: ████ загружается в фоне
  Выполнение: ████ после парсинга DOM
  Используй: Основные скрипты (app.js, analytics)

<script async>:
  Время загрузки: ████ загружается в фоне
  Выполнение: ████ сразу после загрузки
  Используй: независимые скрипты (трекеры)

Best Practice для Production

<head>
  <!-- Критичные стили -->
  <link rel="stylesheet" href="critical.css">
</head>
<body>
  <div id="app"></div>
  
  <!-- Основной скрипт приложения -->
  <script src="app.js" defer></script>
  
  <!-- Аналитика -->
  <script src="analytics.js" async></script>
  
  <!-- Реклама (может задержаться) -->
  <script src="ads.js" async></script>
</body>

Вывод: используй defer для основных скриптов, async для независимых, и избегай синхронной загрузки. Это значительно улучшит Core Web Vitals и пользовательский опыт.

Как загружать скрипт, не блокируя загрузку страницы? | PrepBro