\n

Текст загрузится только после выполнения script.js

\n\n\n```\n\nВремённая шкала:\n```\nПарсинг HTML → Скачивание script.js → Выполнение → Парсинг HTML продолжается\n(блокируется во время скачивания и выполнения)\n```\n\nПроблема: если script.js большой или медленный, пользователь видит пустую страницу.\n\n### Атрибут async\n\n`async` загружает скрипт параллельно с парсингом, но выполняет немедленно:\n\n```html\n\n\n```\n\nВремённая шкала:\n```\nПарсинг HTML ─────────────────────────────────────────────\n ↓\n Скачивание analytics.js ──→ Выполнение ─┐\n Скачивание tracker.js ─────→ Выполнение ─┘\n```\n\n**Характеристики async:**\n- ✅ Загрузка не блокирует парсинг\n- ❌ Выполнение может прерывать парсинг\n- ❌ Порядок выполнения непредсказуем\n- ✅ Идеален для независимых скриптов\n\n```javascript\n// script1.js завершится раньше script2.js\n// потому что скачается быстрее (async не гарантирует порядок)\n\n\n\n\n// script1 может выполниться до script2 или наоборот!\n```\n\n### Атрибут defer\n\n`defer` загружает скрипт параллельно, но выполняет после парсинга HTML:\n\n```html\n\n\n```\n\nВремённая шкала:\n```\nПарсинг HTML ─────────────────────────────────────────\n ↓\n Скачивание app.js ──┐\n Скачивание utils.js ─┤\n └─→ Выполнение (после парсинга)\n```\n\n**Характеристики defer:**\n- ✅ Загрузка не блокирует парсинг\n- ✅ Выполнение ПОСЛЕ парсинга HTML\n- ✅ Порядок ГАРАНТИРОВАН\n- ✅ Идеален для зависимых скриптов\n\n```javascript\n// script1.js ВСЕГДА выполнится перед script2.js\n// даже если script2.js скачается быстрее\n\n\n\n\n// Порядок: script1 → script2 (гарантирован)\n```\n\n### Сравнительная таблица\n\n```\n┌─────────────┬────────────┬─────────────┬──────────────┬──────────────────┐\n│ Атрибут │ Загрузка │ Выполнение │ Порядок │ Когда выполняется │\n├─────────────┼────────────┼─────────────┼──────────────┼──────────────────┤\n│ (без атр.) │ Блокирует │ Блокирует │ Гарантирован │ Сразу при встрече │\n│ async │ Параллель │ Блокирует │ НЕ гарант. │ После загрузки │\n│ defer │ Параллель │ Не блокирует│ Гарантирован │ После парсинга │\n└─────────────┴────────────┴─────────────┴──────────────┴──────────────────┘\n```\n\n### Практические примеры\n\n#### Использовать async:\n\n```html\n\n\n\n\n```\n\nУ этих скриптов нет зависимостей друг от друга, поэтому порядок неважен.\n\n#### Использовать defer:\n\n```html\n\n\n\n\n\n```\n\nЭти скрипты зависят друг от друга, поэтому нужна гарантия порядка.\n\n#### Современный подход с ES6 модулями:\n\n```html\n\n\n\n\n```\n\n### Реальный пример\n\n```html\n\n\n\n My App\n \n \n \n \n \n \n\n\n

Заголовок загружается быстро

\n
\n \n \n \n \n \n \n \n\n\n```\n\n### Интерактивный пример\n\n```javascript\n// Без defeя — блокирует HTML парсинг\n\n\n// С async — может выполниться в любой момент\n\n\n// С defer — безопасно, DOM готов\n\n```\n\n### Практические советы\n\n```javascript\n// 1. Для критичного функционала → defer\n\n\n// 2. Для аналитики/трекинга → async\n\n\n// 3. Для ES6 модулей → просто type=\"module\"\n\n\n// 4. Для inline скриптов → гарантированный порядок\n\n\n```\n\n### Итоги\n\n**async:**\n- Загружается параллельно\n- Выполняется сразу (может прерывать парсинг)\n- Порядок НЕ гарантирован\n- Для независимых скриптов (analytics, tracking)\n\n**defer:**\n- Загружается параллельно\n- Выполняется после парсинга HTML\n- Порядок ГАРАНТИРОВАН\n- Для зависимых скриптов (app, framework)\n\n**Правило:**\n- `async` — для скриптов, которые не зависят от других\n- `defer` — для скриптов, которые зависят друг от друга\n- По умолчанию — используй `defer` (это безопаснее)","dateCreated":"2026-03-22T10:07:16.823009","upvoteCount":0,"author":{"@type":"Person","name":"claude-haiku-4.5"}}}}
← Назад к вопросам

В чем разницами между атрибутами тега script async и defer?

1.3 Junior🔥 211 комментариев
#Браузер и сетевые технологии#Оптимизация и производительность

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

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

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

В чем разница между атрибутами тега script async и defer?

Это два важнейших атрибута для оптимизации загрузки скриптов. Они по-разному влияют на производительность приложения.

Без async и defer (по умолчанию)

По умолчанию скрипты блокируют парсинг HTML:

<!DOCTYPE html>
<html>
<head>
  <title>Example</title>
</head>
<body>
  <h1>Заголовок</h1>
  <script src="script.js"></script> <!-- Блокирует парсинг -->
  <p>Текст загрузится только после выполнения script.js</p>
</body>
</html>

Времённая шкала:

Парсинг HTML  → Скачивание script.js → Выполнение → Парсинг HTML продолжается
(блокируется во время скачивания и выполнения)

Проблема: если script.js большой или медленный, пользователь видит пустую страницу.

Атрибут async

async загружает скрипт параллельно с парсингом, но выполняет немедленно:

<script src="analytics.js" async></script>
<script src="tracker.js" async></script>

Времённая шкала:

Парсинг HTML ─────────────────────────────────────────────
   ↓
   Скачивание analytics.js ──→ Выполнение ─┐
   Скачивание tracker.js ─────→ Выполнение ─┘

Характеристики async:

  • ✅ Загрузка не блокирует парсинг
  • ❌ Выполнение может прерывать парсинг
  • ❌ Порядок выполнения непредсказуем
  • ✅ Идеален для независимых скриптов
// script1.js завершится раньше script2.js
// потому что скачается быстрее (async не гарантирует порядок)

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

// script1 может выполниться до script2 или наоборот!

Атрибут defer

defer загружает скрипт параллельно, но выполняет после парсинга HTML:

<script src="app.js" defer></script>
<script src="utils.js" defer></script>

Времённая шкала:

Парсинг HTML ─────────────────────────────────────────
   ↓
   Скачивание app.js ──┐
   Скачивание utils.js ─┤
                       └─→ Выполнение (после парсинга)

Характеристики defer:

  • ✅ Загрузка не блокирует парсинг
  • ✅ Выполнение ПОСЛЕ парсинга HTML
  • ✅ Порядок ГАРАНТИРОВАН
  • ✅ Идеален для зависимых скриптов
// script1.js ВСЕГДА выполнится перед script2.js
// даже если script2.js скачается быстрее

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

// Порядок: script1 → script2 (гарантирован)

Сравнительная таблица

┌─────────────┬────────────┬─────────────┬──────────────┬──────────────────┐
│ Атрибут     │ Загрузка   │ Выполнение  │ Порядок      │ Когда выполняется │
├─────────────┼────────────┼─────────────┼──────────────┼──────────────────┤
│ (без атр.)  │ Блокирует  │ Блокирует   │ Гарантирован │ Сразу при встрече │
│ async       │ Параллель  │ Блокирует   │ НЕ гарант.   │ После загрузки    │
│ defer       │ Параллель  │ Не блокирует│ Гарантирован │ После парсинга    │
└─────────────┴────────────┴─────────────┴──────────────┴──────────────────┘

Практические примеры

Использовать async:

<!-- Для независимых скриптов -->
<script src="https://cdn.jsdelivr.net/npm/analytics@1.0/script.js" async></script>
<script src="https://cdn.jsdelivr.net/npm/tracker@1.0/script.js" async></script>
<script src="https://cdn.jsdelivr.net/npm/ads@1.0/script.js" async></script>

У этих скриптов нет зависимостей друг от друга, поэтому порядок неважен.

Использовать defer:

<!-- Основной скрипт приложения с зависимостями -->
<script src="/lib/jquery.js" defer></script>
<script src="/lib/lodash.js" defer></script>
<script src="/app.js" defer></script>
<!-- app.js зависит от jquery и lodash -->

Эти скрипты зависят друг от друга, поэтому нужна гарантия порядка.

Современный подход с ES6 модулями:

<!-- ES6 модули автоматически defer -->
<script type="module" src="/app.js"></script>

<!-- Эквивалент:
<script type="module" src="/app.js" defer></script>
-->

Реальный пример

<!DOCTYPE html>
<html>
<head>
  <title>My App</title>
  
  <!-- Стили (блокирует рендеринг, но это OK) -->
  <link rel="stylesheet" href="styles.css">
  
  <!-- Аналитика (не зависит ни от чего, может async) -->
  <script src="https://analytics.example.com/script.js" async></script>
</head>
<body>
  <h1>Заголовок загружается быстро</h1>
  <div id="app"></div>
  
  <!-- React загружаем с defer, он выполнится после парсинга -->
  <script src="https://cdn.jsdelivr.net/npm/react@18/umd/react.js" defer></script>
  <script src="https://cdn.jsdelivr.net/npm/react-dom@18/umd/react-dom.js" defer></script>
  
  <!-- Наш app скрипт зависит от React -->
  <script src="/app.js" defer></script>
</body>
</html>

Интерактивный пример

// Без defeя — блокирует HTML парсинг
<script>console.log("Этот скрипт блокирует парсинг");</script>

// С async — может выполниться в любой момент
<script async>
  // Опасно! document может быть не полностью загружен
  document.addEventListener('DOMContentLoaded', () => {
    console.log("Теперь DOM готов");
  });
</script>

// С defer — безопасно, DOM готов
<script defer>
  // Безопасно! DOM гарантированно загружен
  document.body.appendChild(document.createElement('div'));
</script>

Практические советы

// 1. Для критичного функционала → defer
<script src="/core.js" defer></script>

// 2. Для аналитики/трекинга → async
<script src="analytics.js" async></script>

// 3. Для ES6 модулей → просто type="module"
<script type="module" src="/app.js"></script>

// 4. Для inline скриптов → гарантированный порядок
<script>
  window.config = { apiUrl: 'https://api.example.com' };
</script>
<script defer src="/app.js"></script>

Итоги

async:

  • Загружается параллельно
  • Выполняется сразу (может прерывать парсинг)
  • Порядок НЕ гарантирован
  • Для независимых скриптов (analytics, tracking)

defer:

  • Загружается параллельно
  • Выполняется после парсинга HTML
  • Порядок ГАРАНТИРОВАН
  • Для зависимых скриптов (app, framework)

Правило:

  • async — для скриптов, которые не зависят от других
  • defer — для скриптов, которые зависят друг от друга
  • По умолчанию — используй defer (это безопаснее)
В чем разницами между атрибутами тега script async и defer? | PrepBro