Как браузер рендерит веб-страницу
Для фронтенд-разработчиков очень важно знать, как происходит отрисовка веб-страницы на всех этапах: от отправки запроса на сервер до отображения картинки, которую мы видим в браузере.
Чтобы быстро разобраться в основах можно почитать следующие 3 статьи:
Затем, чтобы погрузиться в детали — можно прочитать статью:
Статья достаточно большая, поэтому лучше её читать постепенно и не один раз. Я читал раза 3 с перерывами и выписал для себя основные моменты:
Браузер отправляет запрос на сервер и получает в ответ текстовый HTML файл с заголовком Content-Type: text/html; charset=UTF-8
Браузер парсит полученный файл и создаёт DOM (Document Object Model)
Браузер считывает CSS из всех ресурсов и строит CSSOM (CSS Object Model)
CSSOM не содержит не визуальные элементы: script, meta, title, …
Для построения CSSOM используются: стандартные стили браузера, авторские стили (которые и пишут разработчики), стандартные стили описанные в W3C CSS и правила каскадного наследования CSS
DOM Tree + CSSOM Tree = Render Tree
Содержит лишь видимые на экране элементы
Именно это дерево использует бразуер для отображения контента, который мы видим в браузере
Процесс отрисовки страницы
Элементы на странице могут перекрывать друг друга (z-index). Поэтому браузер располагает элементы на различных слоях.
Каждый слой может рендериться в отдельном потоке.
Композиция слоёв
Происходит объединение упомянутых выше слоёв
Слои разделены на тайлы, так как композиция слоёв будет происходить при изменении стилей или размеров окна браузера
Все перечисленные выше операции представляют собой Critical Rendering Path (CRP) — последовательность операций, которые необходимо произвести браузеру для отображения страницы пользователю
Парсинг и сторонние ресурсы
Браузер парсит HTML по мере скачивания (не ждёт скачивания всего документа)
Парсинг HTML происходит в основном потоке исполнения JavaScript
Parser Blocking Scripts
Это скрипты, которые приостанавливают парсинг HTML
Если парсер натыкается на тэг script — парсинг приостанавливается и происходит выполнение скрипта
Если скрипт находится в отдельном файле, браузер приостанавливает парсинг, скачивает файл, выполняет его (в главном потоке) и лишь потом продолжает построение DOM дерева
Браузер приостанавливает парсинг, так как мы можем изменять DOM с помощью JavaScript. Иначе мы бы столкнулись с race condition между JavaScript и парсером, ведь JavaScript может модифицировать DOM дерево
Можно использовать async атрибут тэга script, чтобы не блокировать парсер при скачивании js-файла, файл будет выполенен, как только загрузится.
Также можно использовать тэг defer, который работает также как async, но выполнение скрипта произойдёт только когда завершится парсинг
Render Blocking CSS
Построение CSSOM происходит в главном потоке
Построение CSSOM не происходит по мере скачивания (в отличии от построения DOM). CSSOM обновится, когда сторонний файл со стилями будет загружен целиком. Пока стили не загружены, Render Tree не будет обновлено. Поэтому CSS - render blocking ресурс.
В то же время, построение DOM дерева продолжается.
Если парсер натыкается на тэг script, то он будет скачан, но не будет выполнен до тех пор, пока не завершится загрузка файла со стилями. Это важно, так как мы можем манипулировать CSS свойствами через JavaScript. Такой CSS называется script-blocking.
Так как построение Render Tree приостановлено, следовательно и Critical Render Path застопорился, и контент не обновляется.
Чтобы не блокировать рендеринг, необходимо загружать стили как можно раньше, желательно в секции head
Какие статьи помогли вам понять, как браузер рендерит страницу?
Web-технологии
526 постов5.8K подписчик
Правила сообщества
1. Не оскорблять других пользователей
2. Не пытаться продвигать свои услуги под видом тематических постов
3. Не заниматься рекламой
4. Никакой табличной верстки
5. Тег сообщества(не обязателен) pikaweb