\n\n```\n\nБраузер:\n1. Парсит HTML\n2. **Останавливает** парсинг при встрече со скриптом\n3. Загружает и выполняет скрипт\n4. Продолжает парсинг HTML\n\nЭто блокирует рендеринг страницы!\n\n**С атрибутом defer:**\n\n```html\n\n\n\n```\n\nБраузер:\n1. Парсит HTML\n2. **Не останавливаясь**, инициирует загрузку скрипта\n3. Продолжает парсинг HTML\n4. После завершения парсинга выполняет скрипт\n5. Срабатывает событие `DOMContentLoaded`\n\n### Различия между async и defer\n\n```html\n\n\n\n\n\n\n\n\n```\n\n**Визуально:**\n\n```\n HTML парсинг\n |------------|------------|------------|------|\n | DOMContentLoaded\n\nБез defer: ↓ скрипт блокирует (ХОРОШО ДЛЯ СТАРЫХ БРАУЗЕРОВ)\n |---СКРИПТ---|-------HTML парсинг----------|\n\nС async: ↓ скрипт загружается параллельно\n |---HTML парсинг---|СКРИПТ|---|HTML парсинг--|\n (может прерваться для выполнения скрипта)\n\nС defer: ↓ скрипт загружается параллельно\n |-------HTML парсинг---------|----------СКРИПТ---|\n (выполняется ПОСЛЕ парсинга, сохраняет порядок)\n```\n\n### Когда использовать что\n\n**defer — оптимален для большинства случаев:**\n\n```html\n\n\n \n \n\n\n \n \n \n \n \n \n\n```\n\n**async — для независимых скриптов:**\n\n```html\n\n\n\n\n\n```\n\n### Практические примеры\n\n**Правильная структура современного проекта:**\n\n```html\n\n\n\n \n \n My App\n \n\n\n
\n \n \n \n\n\n```\n\n**React приложение с defer:**\n\n```html\n\n
\n \n \n \n\n```\n\n### Важные особенности\n\n**defer работает только с внешними скриптами:**\n\n```html\n\n\n\n\n\n```\n\n**Порядок выполнения сохраняется:**\n\n```html\n\n\n\n\n\n```\n\n**Событие DOMContentLoaded:**\n\n```javascript\ndocument.addEventListener(\"DOMContentLoaded\", () => {\n // Срабатывает ПОСЛЕ загрузки всех defer скриптов\n console.log(\"DOM полностью готов\");\n});\n```\n\n### Лучшие практики\n\n1. **Используй defer для основных скриптов** — это улучшает воспринимаемую скорость загрузки\n2. **Помещай скрипты в конец body** — это дополнительная гарантия\n3. **Используй async только для независимых скриптов** — аналитика, объявления\n4. **В modern стэках (React/Vue)** — defer идёален, так как приложение монолитное\n\n`defer` — это простой способ значительно улучшить производительность сайта, позволяя браузеру рендерить контент быстрее.","dateCreated":"2026-03-26T18:24:55.448147","upvoteCount":0,"author":{"@type":"Person","name":"claude-haiku-4.5"}}}}
← Назад к вопросам

Что такое атрибут defer у скрипта?

1.0 Junior🔥 241 комментариев
#HTML и CSS#Браузер и сетевые технологии

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

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

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

Что такое атрибут defer у скрипта?

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

Как работает defer

Стандартное поведение без defer:

<!-- Парсинг HTML ОСТАНАВЛИВАЕТСЯ -->
<script src="script.js"></script>
<!-- После выполнения скрипта парсинг продолжается -->

Браузер:

  1. Парсит HTML
  2. Останавливает парсинг при встрече со скриптом
  3. Загружает и выполняет скрипт
  4. Продолжает парсинг HTML

Это блокирует рендеринг страницы!

С атрибутом defer:

<!-- Парсинг HTML НЕ ПРЕРЫВАЕТСЯ -->
<script src="script.js" defer></script>
<!-- Парсинг продолжается параллельно с загрузкой -->

Браузер:

  1. Парсит HTML
  2. Не останавливаясь, инициирует загрузку скрипта
  3. Продолжает парсинг HTML
  4. После завершения парсинга выполняет скрипт
  5. Срабатывает событие DOMContentLoaded

Различия между async и defer

<!-- Блокирует парсинг HTML -->
<script src="script.js"></script>

<!-- Загружается параллельно, но выполняется сразу при готовности -->
<script src="script.js" async></script>

<!-- Загружается параллельно, выполняется после парсинга -->
<script src="script.js" defer></script>

Визуально:

            HTML парсинг
            |------------|------------|------------|------|
            |                                              DOMContentLoaded

Без defer:  ↓ скрипт блокирует (ХОРОШО ДЛЯ СТАРЫХ БРАУЗЕРОВ)
            |---СКРИПТ---|-------HTML парсинг----------|

С async:    ↓ скрипт загружается параллельно
            |---HTML парсинг---|СКРИПТ|---|HTML парсинг--|
            (может прерваться для выполнения скрипта)

С defer:    ↓ скрипт загружается параллельно
            |-------HTML парсинг---------|----------СКРИПТ---|
            (выполняется ПОСЛЕ парсинга, сохраняет порядок)

Когда использовать что

defer — оптимален для большинства случаев:

<!-- Основной контент и стили -->
<head>
  <meta charset="UTF-8">
  <link rel="stylesheet" href="styles.css">
</head>
<body>
  <!-- Контент -->
  
  <!-- Скрипты с defer (выполнятся в порядке) -->
  <script src="vendor/jquery.js" defer></script>
  <script src="app.js" defer></script>
  <script src="analytics.js" defer></script>
</body>

async — для независимых скриптов:

<!-- Аналитика, которой не важен порядок выполнения -->
<script src="https://analytics.google.com/ga.js" async></script>

<!-- Объявления, которые независимы от контента -->
<script src="https://adnetwork.com/ads.js" async></script>

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

Правильная структура современного проекта:

<!DOCTYPE html>
<html lang="ru">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>My App</title>
  <link rel="stylesheet" href="styles.css">
</head>
<body>
  <div id="root"></div>
  
  <!-- React/Vue/Angular выполнится после парсинга всего HTML -->
  <script src="bundle.js" defer></script>
</body>
</html>

React приложение с defer:

<body>
  <div id="root"></div>
  <script defer src="https://cdn.jsdelivr.net/npm/react@18/umd/react.production.min.js"></script>
  <script defer src="https://cdn.jsdelivr.net/npm/react-dom@18/umd/react-dom.production.min.js"></script>
  <script defer src="app.js"></script>
</body>

Важные особенности

defer работает только с внешними скриптами:

<!-- Работает (внешний файл) -->
<script src="script.js" defer></script>

<!-- НЕ работает (inline скрипт) -->
<script defer>
  console.log("Это выполнится сразу, defer не работает");
</script>

Порядок выполнения сохраняется:

<script src="first.js" defer></script>
<script src="second.js" defer></script>
<script src="third.js" defer></script>

<!-- Выполнятся в порядке: first → second → third -->

Событие DOMContentLoaded:

document.addEventListener("DOMContentLoaded", () => {
  // Срабатывает ПОСЛЕ загрузки всех defer скриптов
  console.log("DOM полностью готов");
});

Лучшие практики

  1. Используй defer для основных скриптов — это улучшает воспринимаемую скорость загрузки
  2. Помещай скрипты в конец body — это дополнительная гарантия
  3. Используй async только для независимых скриптов — аналитика, объявления
  4. В modern стэках (React/Vue) — defer идёален, так как приложение монолитное

defer — это простой способ значительно улучшить производительность сайта, позволяя браузеру рендерить контент быстрее.

Что такое атрибут defer у скрипта? | PrepBro