[Перевод] Понимание процесса визуализации

Браузеру предстоит пройти много шагов, прежде чем HTML ответ от сервера будет преобразован в пиксели на экране. Последовательность этих шагов, необходимая для первого отображения страницы, называется «Процесс визуализации» (ориг. Critical Rendering Path).



Знание о CRP (Critical Rendering Path) невероятно полезно для понимания того, как улучшить производительность сайта.


Существует 6 этапов CRP:


  • построение DOM-дерева
  • построение CSSOM-дерева
  • запуск JavaScript
  • создание Render-дерева
  • генерация раскладки
  • отрисовка

CRP очередь

Построение DOM-дерева


DOM (объектная модель документа) дерево это объект, представляющий полностью разобранную HTML-страницу. Начиная с корневого элемента , узлы создаются для каждого элемента/текста на странице. Элементы, вложенные в другие элементы, представлены в виде дочерних узлов, и каждый узел содержит полный набор атрибутов для этого элемента. Например, элемент будет иметь атрибут href, связанный с узлом.
Возьмём для примера такой документ:


  
  
  Understanding the Critical Rendering Path
  
  
  
  

Understanding the Critical Rendering Path

Introduction

Lorem ipsum dolor sit amet

Copyright 2017

Из него будет построено такое DOM-дерево:


DOM-дерево

Хорошая новость, касательно HTML, заключается в том, что он может быть исполнен по частям. Документ не должен быть загружен полностью для того, чтобы контент начал появляться на странице. Однако, другие ресурсы, как CSS и JavaScript, могут блокировать отрисовку страницы.


Построение CSSOM-дерева


CSSOM (объектная модель CSS) это объект, представляющий стили, связанные с DOM. Он выглядит так же как DOM, но с соответствующими стилями для каждого узла. Не имеет значения были ли стили объявлены явно или наследуются.


В файле style.css, подключающемся в ранее упомянутом документе, мы имеем следующий набор стилей:


body { font-size: 18px; }

header { color: plum; }  
h1 { font-size: 28px; }

main { color: firebrick; }  
h2 { font-size: 20px; }

footer { display: none; }

С его помощью получится следующее CSSOM-дерево:


CSSOM-дерево

CSS считается «блокирующим обработку ресурсом». Это значит, что Render-дерево (см. ниже) не может быть построено без полного первоначального разбора CSS.
В отличии от HTML, CSS не может быть использован по частям в силу своей каскадной природы. Стили, описанные в документе ниже, могут переопределять и изменять стили, определённые ранее. Так что если мы начнём использовать CSS-стили до того, как будет разобрана таблица стилей, мы можем столкнуться с ситуацией, когда стили будут применяться неверно. Это означает, что для перехода к следующему шагу, необходимо полностью разобрать CSS.


CSS-файлы блокируют рендер только если они применяются. может принимать медиа-атрибут, в котором мы можем указать любое медиавыражение, к которому будут относиться вложенные внутрь стили. Если, например, мы имеем таблицу стилей с медиа-аттрибутом orientation:landscape, а мы просматриваем страницу в портретном режиме, то этот ресурс не будет считаться блокирующим обработку.


CSS также может являться «блокирующим скрипты», потому что JavaScript-файлы должны дождаться построения CSSOM, прежде чем начать исполняться.


Запуск JavaScript


JavaScript является блокирующим ресурсом для парсера. Это означает, что JavaScript блокирует разбор самого HTML-документа.


Когда парсер доходит до тега

Если мы посмотрим в Event Log для этой страницы, то увидим следующее:


Результат Event Log
  1. Send Request — GET-запрос, отправленный для index.html
  2. Parse HTML and Send Request — начать разбор HTML и построение DOM. Отправить GET запрос для style.css и main.js
  3. Parse Stylesheet — CSSOM, созданный для style.css
  4. Evaluate Script — оценка main.js
  5. Layout — генерация раскладки, основанной на значении метатега viewport
  6. Paint — отрисовка пикселей в документе

Опираясь на эту информацию, мы можем принимать решения, направленные на оптимизацию процесса визуализации. Я расскажу о некоторых таких техниках в дальнейших публикациях.

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

© Habrahabr.ru