Процесс обработки веб-страницы браузером можно разбить на несколько этапов:
-
Запрос и получение ресурса:
- Пользователь вводит URL в адресную строку или кликает по ссылке.
- Браузер отправляет HTTP-запрос на сервер.
- Сервер обрабатывает запрос и отправляет ответ, содержащий, как правило, HTML-документ.
-
Синтаксический анализ (Parsing):
- Браузер получает HTML-документ в виде байтов.
- Эти байты декодируются в символы согласно указанной кодировке.
- Парсер HTML посимвольно анализирует документ и строит дерево DOM (Document Object Model). DOM представляет собой логическую структуру документа.
- При обнаружении тегов
<link> (для CSS) или <script> (для JavaScript), браузер начинает скачивание этих ресурсов параллельно с парсингом HTML.
-
Построение CSSOM:
- Парсер CSS анализирует CSS-правила из
<style> тегов, <link> тегов и инлайн-стилей.
- На основе этих правил строится дерево CSSOM (CSS Object Model), которое содержит все стили для каждого элемента на странице.
-
Построение дерева рендеринга (Render Tree):
- Render Tree объединяет DOM и CSSOM. Оно содержит только те элементы, которые будут отображены на странице, и соответствующие им стили.
- Элементы, для которых установлено CSS-правило
display: none;, не включаются в Render Tree.
-
Макет (Layout / Reflow):
- Браузер вычисляет точные геометрические размеры и положение каждого элемента на странице на основе Render Tree. Этот процесс называется Layout или Reflow.
- Layout происходит при первом построении Render Tree, а также при изменении размеров окна браузера, добавлении/удалении элементов, изменении их стилей (например, размеров, отступов).
-
Рисование (Painting / Repaint):
- Браузер отрисовывает каждый элемент на экране, используя информацию из Render Tree и результаты шага Layout.
- Painting также может происходить при изменении видимых свойств элемента, таких как цвет, фон, прозрачность, без изменения его геометрии (это называется Repaint).
-
Композиция (Compositing):
- Рисуемые элементы могут быть объединены на разных слоях для оптимизации отрисовки и анимации.
- Эти слои затем объединяются для отображения окончательной страницы на экране.
-
Выполнение скриптов:
- Когда парсер HTML достигает тега
<script>, выполнение парсинга HTML приостанавливается (по умолчанию), и браузер скачивает, парсит и выполняет JavaScript-код.
- JavaScript может изменять DOM и CSSOM, что может вызвать повторные шаги Layout и Painting.
- Атрибуты
async и defer для тега <script> влияют на порядок и время выполнения скриптов, позволяя продолжить парсинг HTML.
Вот примерная визуализация потока:
plaintext
Выполнение JavaScript может вклиниваться на разных этапах, вызывая повторные шаги:
plaintext
Понимание этого процесса важно для оптимизации производительности веб-страниц.