🎉 Первое видео: Интервью с разработчиком из Meta

Parsing Pipeline - от байтов до DOM и CSSOM

Parsing Pipeline — это процесс преобразования байтов HTML/CSS в структуры данных (DOM и CSSOM), с которыми может работать браузер. Понимание этого процесса критически важно для оптимизации производительности загрузки страниц.

HTML Parsing: от байтов до DOM

Этап 1: Byte Stream → Character Stream

Bytes:     3C 68 31 3E ...
           ↓ (Character Encoding)
Characters: <h1>Hello</h1>

Character Encoding Detection:

  1. BOM (Byte Order Mark)
  2. HTTP Content-Type header: charset=utf-8
  3. Meta tag: <meta charset="utf-8">
  4. Fallback: автоопределение

Этап 2: Tokenization (Лексический анализ)

HTML parser

преобразует символы в токены:

<div class="container">
  <h1>Title</h1>
  <p>Text</p>
</div>

Токены:

StartTag: div (attributes: class="container")
StartTag: h1
Character: Title
EndTag: h1
StartTag: p
Character: Text
EndTag: p
EndTag: div

Этап 3: Tree Construction

Токены преобразуются в DOM nodes и строится DOM tree:

Preload Scanner — Критическая оптимизация

Preload Scanner работает параллельно с HTML parser и предзагружает ресурсы:

<html>
<head>
  <!-- Parser здесь -->
  <link rel="stylesheet" href="style.css">
  <script src="app.js"></script>
</head>
<body>
  <img src="hero.jpg"> <!-- Preload Scanner уже нашёл это! -->

Что находит Preload Scanner:

  • <link rel="stylesheet">
  • <script src>
  • <img src>
  • <link rel="preload">

CSS Parsing: построение CSSOM

Этап 1: CSS Tokenization

body {
  color: blue;
  font-size: 16px;
}

Токены:

Selector: body
Property: color
Value: blue
Property: font-size
Value: 16px

Этап 2: CSSOM Construction

CSS Blocking

CSS блокирует рендеринг!

<head>
  <link rel="stylesheet" href="style.css"> <!-- Блокирует! -->
</head>
<body>
  <!-- Контент не отрисуется, пока CSS не загрузится -->

Решение — Media Queries:

<link rel="stylesheet" href="print.css" media="print"> <!-- Не блокирует экран -->
<link rel="stylesheet" href="mobile.css" media="(max-width: 600px)">

Построение Render Tree

DOM + CSSOM = Render Tree

<div style="display:none">Hidden</div>
<div class="visible">Visible</div>

Render Tree содержит только видимые элементы:

  • display: none — не в Render Tree
  • visibility: hidden — в Render Tree (занимает место)
  • <head>, <script>, <meta> — не в Render Tree

Speculative Parsing

Современные браузеры используют спекулятивный парсинг:

<script src="slow.js"></script> <!-- Блокирует парсинг -->
<img src="image1.jpg">
<img src="image2.jpg">

Без Speculative Parsing:

  1. Парсинг останавливается на <script>
  2. Ждём загрузки и выполнения
  3. Продолжаем парсинг

Со Speculative Parsing:

  1. Парсинг останавливается на <script>
  2. Но спекулятивный поток продолжает парсить
  3. Находит image1.jpg, image2.jpg и начинает загружать!

Performance Best Practices

1

Минимизируйте CSS

CSS блокирует рендеринг. Используйте critical CSS inline для первого экрана.

2

Используйте async/defer для скриптов

Не блокируйте парсинг. <script defer> не блокирует.

3

Помогите Preload Scanner

Используйте <link rel="preload"> для критических ресурсов.

4

Избегайте document.write()

Полностью ломает Speculative Parsing!

Итог:

Parsing Pipeline — сложный многоступенчатый процесс с множеством оптимизаций (Preload Scanner, Speculative Parsing). Понимание этого процесса помогает писать HTML/CSS, который загружается быстрее.

Связанные статьи