\n \n

This content is blocked

\n \n\n```\n\n### Визуально\n\n```\nВремя парсинга:\n\nБез скрипта:\n|----HTML парсинг (50ms)---->\n\nСо скриптом:\n|--HTML--| загрузка |выполнение| --HTML--|\n H1 \n \n
\n \n

Main Content

\n

This is blocked

\n
\n\n\n```\n\n### Почему это происходит?\n\nСкрипт может:\n- Мутировать DOM (`document.write()`, `appendChild()`, и т.д.)\n- Запросить информацию о стилях (`getComputedStyle()`)\n- Изменить следующие элементы\n\nПоэтому браузер **не может продолжать парсинг**, пока скрипт не выполнится.\n\n```javascript\n// Скрипт может изменить следующий контент!\n\n```\n\n### Как исправить: async\n\nАтрибут `async` загружает скрипт в фоне и выполняет сразу когда готов:\n\n```html\n\n\n

Это будет парситься немедленно

\n```\n\n**Порядок выполнения:**\n```\nПарсинг: |----HTML парсинг (быстро)---->\nСкрипт: загрузка выполнение\n (параллельно)\n```\n\n### Как исправить: defer\n\nАтрибут `defer` загружает в фоне, но выполняет только когда парсинг готов:\n\n```html\n\n \n \n\n\n \n\n```\n\n**Порядок выполнения:**\n```\nПарсинг: |----HTML парсинг----|\nСкрипт: загрузка выполнение\n (параллельно) (после парсинга)\n```\n\n### async vs defer\n\n```\n Время парсинга Выполнение\n\nСинхронный: [===блок===|скрипт]\n \nasync: [===парсинг===]\n [скрипт]\n \ndefer: [===парсинг===]\n [скрипт]\n```\n\n**Практический пример:**\n\n```html\n\n \n \n \n \n \n \n \n\n```\n\n### Проблема с document.write()\n\n```javascript\n// Блокирует парсинг!\n\n\n// Лучше: манипулировать DOM после парсинга\n\n```\n\n### Оптимизация: inline критичный JS\n\n```html\n\n\n\n\n\n\n\n\n```\n\n### Лучшие практики\n\n1. **Помещай скрипты перед ``** вместо ``\n ```html\n \n \n \n \n ```\n\n2. **Используй async для независимых скриптов**\n ```html\n \n ```\n\n3. **Используй defer для главного приложения**\n ```html\n \n ```\n\n4. **Минимизируй inline скрипты**\n ```html\n \n \n \n \n \n ```\n\n### Инструменты для анализа\n\n```bash\n# Chrome DevTools - Performance tab\n# Смотри синий график парсинга и жёлтый скрипт выполнения\n\n# Lighthouse\n# Покажет \"Eliminate render-blocking resources\"\n```\n\n### Резюме\n\n- **Синхронный скрипт** = парсинг HTML замораживается\n- **async** = загружается параллельно, выполняется сразу (для независимых скриптов)\n- **defer** = загружается параллельно, выполняется после парсинга (для app.js)\n- **Inline** = только критичный код\n- **В конце body** = лучше чем в head","dateCreated":"2026-04-02T22:24:53.710100","upvoteCount":0,"author":{"@type":"Person","name":"claude-haiku-4.5"}}}}
← Назад к вопросам

Что такое блокировка скриптами во время парсинга страницы?

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

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

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

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

Блокировка скриптами при парсинге HTML

Это критичная проблема производительности, когда JavaScript (JS) скрипт останавливает парсинг HTML и замораживает рендеринг страницы. Разберу как это работает и как это исправить.

Как браузер парсит страницу

1. Загрузить HTML
2. Парсить HTML сверху вниз
3. Встреченные CSS - загрузить и заблокировать
4. Встреченные JS - загрузить, выполнить, потом продолжить парсинг
5. Встреченные ресурсы - загрузить параллельно

Проблема: синхронный скрипт

Когда браузер встречает <script>, он:

  1. Останавливает парсинг HTML
  2. Загружает скрипт (если он внешний)
  3. Выполняет скрипт полностью
  4. Продолжает парсинг HTML
<html>
  <head>
    <title>My Page</title>
  </head>
  <body>
    <h1>Hello</h1>
    <!-- Браузер парсит до сюда -->
    <script src="heavy-script.js"></script> <!-- СТОП! Парсинг заморожен -->
    <!-- Пока скрипт загружается и выполняется, остальное не парсится -->
    <p>This content is blocked</p>
  </body>
</html>

Визуально

Время парсинга:

Без скрипта:
|----HTML парсинг (50ms)---->

Со скриптом:
|--HTML--|  загрузка  |выполнение| --HTML--|
       H1 <script>     JS        P
       |<------ ПАРСИНГ ЗАМОРОЖЕН ------->|

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

<!DOCTYPE html>
<html>
<head>
  <title>Slow Page</title>
</head>
<body>
  <h1>My Website</h1>
  <p>This is visible</p>
  
  <!-- ПРОБЛЕМА: браузер заморозит парсинг -->
  <script src="analytics.js"></script> <!-- 2 сек загрузка -->
  
  <div id="content">
    <!-- Весь этот контент не начнёт парситься, пока не загрузится analytics.js -->
    <h2>Main Content</h2>
    <p>This is blocked</p>
  </div>
</body>
</html>

Почему это происходит?

Скрипт может:

  • Мутировать DOM (document.write(), appendChild(), и т.д.)
  • Запросить информацию о стилях (getComputedStyle())
  • Изменить следующие элементы

Поэтому браузер не может продолжать парсинг, пока скрипт не выполнится.

// Скрипт может изменить следующий контент!
<script>
  document.write('<h2>I came from JS!</h2>');
  // Это вставляется в место скрипта, влияя на парсинг
</script>

Как исправить: async

Атрибут async загружает скрипт в фоне и выполняет сразу когда готов:

<!-- Не блокирует парсинг -->
<script src="analytics.js" async></script>
<p>Это будет парситься немедленно</p>

Порядок выполнения:

Парсинг:  |----HTML парсинг (быстро)---->
Скрипт:                    загрузка     выполнение
          (параллельно)

Как исправить: defer

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

<head>
  <script src="app.js" defer></script>
  <script src="utils.js" defer></script>
</head>
<body>
  <!-- Весь контент парсится нормально -->
</body>

Порядок выполнения:

Парсинг:  |----HTML парсинг----|
Скрипт:       загрузка      выполнение
          (параллельно)    (после парсинга)

async vs defer

                 Время парсинга    Выполнение

Синхронный:      [===блок===|скрипт]
                
async:           [===парсинг===]
                       [скрипт]
                 
defer:           [===парсинг===]
                            [скрипт]

Практический пример:

<head>
  <!-- Рекомендуется: async для независимых скриптов -->
  <script src="analytics.js" async></script>
  <script src="tracking.js" async></script>
  
  <!-- defer для основного приложения (порядок важен) -->
  <script src="utils.js" defer></script>
  <script src="app.js" defer></script> <!-- utils загрузится первым -->
</head>

Проблема с document.write()

// Блокирует парсинг!
<script>
  document.write('<h1>Hello</h1>');
  // Браузер должен остановить парсинг и вставить это
</script>

// Лучше: манипулировать DOM после парсинга
<script>
  document.addEventListener('DOMContentLoaded', () => {
    document.body.innerHTML += '<h1>Hello</h1>';
  });
</script>

Оптимизация: inline критичный JS

<!-- Вместо внешнего скрипта (блокирует) -->
<script src="critical.js"></script>

<!-- Инлайни критичный код -->
<script>
  // Только критичный код (5KB max)
  const theme = localStorage.getItem('theme') || 'light';
  document.documentElement.setAttribute('data-theme', theme);
</script>

<!-- Остальное загружай с defer -->
<script src="app.js" defer></script>

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

  1. Помещай скрипты перед </body> вместо <head>

    <body>
      <!-- контент -->
      <script src="app.js"></script> <!-- парсинг уже почти готов -->
    </body>
    
  2. Используй async для независимых скриптов

    <script src="analytics.js" async></script>
    
  3. Используй defer для главного приложения

    <script src="app.js" defer></script>
    
  4. Минимизируй inline скрипты

    <!-- Плохо: большой inline скрипт -->
    <script>
      // 50KB кода здесь
    </script>
    
    <!-- Хорошо: только критичный inline -->
    <script>const x = 1;</script>
    

Инструменты для анализа

# Chrome DevTools - Performance tab
# Смотри синий график парсинга и жёлтый скрипт выполнения

# Lighthouse
# Покажет "Eliminate render-blocking resources"

Резюме

  • Синхронный скрипт = парсинг HTML замораживается
  • async = загружается параллельно, выполняется сразу (для независимых скриптов)
  • defer = загружается параллельно, выполняется после парсинга (для app.js)
  • Inline = только критичный код
  • В конце body = лучше чем в head
Что такое блокировка скриптами во время парсинга страницы? | PrepBro