8.9 KiB
sidebar_position
| sidebar_position |
|---|
| 4 |
Critical render path
Критический путь рендеринга (Critical Rendering Path, CRP) — это последовательность шагов, которые браузер выполняет для преобразования HTML, CSS и JavaScript в пиксели на экране. Оптимизация критического пути рендеринга важна для ускорения загрузки и отображения веб-страниц, что напрямую влияет на пользовательский опыт.
Основные этапы критического пути рендеринга:
- Загрузка и парсинг HTML:
- Браузер загружает HTML-документ и начинает его парсить.
- Во время парсинга браузер встречает ссылки на внешние ресурсы (CSS, JavaScript, изображения) и начинает их загружать.
При встрече с тегом <link> (CSS) или <script> (JS) — загрузка может приостанавливаться:
- CSS — блокирует рендеринг (нельзя построить layout без стилей).
- JS — может блокировать парсинг HTML, если не имеет async или defer.
- Браузер преобразует HTML в дерево DOM.
- Каждый HTML-элемент становится узлом в DOM.
- Загрузка и парсинг CSS:
- Когда браузер встречает CSS-файлы, он их загружает и строит CSSOM (CSS Object Model)..
- CSSOM представляет собой дерево стилей, где каждый узел соответствует CSS-правилу.
- CSSOM используется для определения стилей элементов.
- Создание дерева рендеринга (Render Tree):
- Браузер объединяет DOM и CSSOM в дерево рендеринга.
- Дерево рендеринга содержит только видимые элементы (например, элементы с
display: noneне включаются). - Каждому видимому узлу назначаются стили (цвет, размер, шрифт и т.д.).
- Компоновка (Layout):
- Браузер рассчитывает положение и размеры каждого элемента на странице.
- Этот процесс также называется рефлоу (reflow).
- Результат —
layout treeс точными координатами.
- Отрисовка (Paint):
- Браузер отрисовывает пиксели на экране на основе данных из дерева рендеринга.
- Этот процесс включает в себя растеризацию (rasterization) и отрисовку слоев.
- Композиция (Composite):
- Браузер объединяет слои (например, элементы с
position: fixedили анимации) для финального отображения.
- Браузер объединяет слои (например, элементы с
🧠 Визуальное резюме
HTML → DOM
CSS → CSSOM
DOM + CSSOM → Render Tree
Render Tree → Layout
Layout → Paint → Composite → Screen
⚡ Что замедляет CRP
- Большие или блокирующие CSS/JS → откладывают построение render tree.
- Много вложенных или тяжёлых стилей → усложняют layout и paint.
- Синхронные JS-скрипты без async/defer.
- Шрифты с блокирующей загрузкой (@font-face без font-display).
Как оптимизировать критический путь рендеринга?
Оптимизация CRP направлена на ускорение загрузки и отображения контента, особенно "выше сгиба" (above the fold). Основные подходы:
- Минимизация размера файлов:
- Сжимайте HTML, CSS и JavaScript (например, с помощью Gzip или Brotli).
- Удаляйте лишние пробелы, комментарии и неиспользуемый код.
- Уменьшение количества ресурсов:
- Объединяйте CSS и JavaScript-файлы.
- Используйте встроенные стили для критического CSS (Critical CSS).
- Оптимизация загрузки CSS:
- Разделяйте CSS на критический и некритический.
- Используйте
media-атрибуты для загрузки только необходимых стилей:
- Оптимизация загрузки JavaScript:
- Используйте атрибуты async или defer для загрузки скриптов без блокировки рендеринга:
- Переносите скрипты в конец документа (перед закрывающим тегом
</body>).
- Приоритизация загрузки ресурсов:
- Используйте
<link rel="preload">для приоритетной загрузки критических ресурсов:
- Используйте
- Оптимизация изображений:
- Используйте современные форматы (WebP, AVIF).
- Сжимайте изображения и используйте
srcsetдля адаптивной загрузки.
- Минимизация количества рефлоу и репинтов:
- Избегайте изменения стилей, которые вызывают рефлоу (например,
width,height,margin). - Используйте
transformиopacityдля анимаций, так как они не вызывают рефлоу.
- Избегайте изменения стилей, которые вызывают рефлоу (например,
- Использование кеширования:
- Настройте кеширование статических ресурсов (CSS, JS, изображения) на стороне сервера.
Пример оптимизации CRP:
- Критический CSS:
- Встраивайте стили, необходимые для отображения контента "выше", прямо в HTML
- Асинхронная загрузка скриптов:
- Используйте async или defer для загрузки JavaScript
- Предзагрузка шрифтов:
- Загружайте шрифты заранее, чтобы избежать задержек
🧩 Где выполняется JavaScript
JavaScript выполняется во время построения DOM, то есть ещё до этапа Render Tree, если скрипт найден в HTML. Это происходит до Layout и Paint, потому что браузер должен знать, как изменится структура страницы, прежде чем её рисовать.
🕹️ Подробно по этапам:
- HTML → DOM
- Когда парсер HTML встречает <script>:
-
Без
asyncиdefer— парсинг останавливается. Браузер загружает и выполняет JS, потом продолжает строить DOM. -
С
defer— выполнение откладывается до после построения DOM (но доDOMContentLoaded). -
С
async— выполняется сразу после загрузки, независимо от DOM.⚠️ Поэтому синхронный JS может блокировать CRP, т.к. пока он выполняется — DOM и CSSOM не достраиваются, а рендер не продолжается.
-
- После построения Render Tree
- Когда JS выполняется в runtime (например, после загрузки страницы), он может:
- Изменять DOM (через
document.createElement,innerHTML, и т.д.) - Изменять стили (через
element.styleили изменение классов)
- Изменять DOM (через
Эти изменения вызывают reflow (layout) и/или repaint, что частично повторяет CRP:
DOM update → Render Tree update → Layout → Paint → Composite
🚀 Источник: DeepSeek, ChatGPT
🚀 Источник: https://www.youtube.com/watch?v=Ff_IZrs4GcY
