Как браузеры строят дерево рендеринга до того, как тег появится в дереве DOM?

#javascript #dom #browser #rendering

#javascript #dom #браузер #рендеринг

Вопрос:

Я изучаю, как работают веб-браузеры.

Я понял, как показано ниже,

  • как только HTML-ресурс поступает, браузеры анализируют HTML и строят дерево DOM.
  • Когда он встречает link элемент для импорта CSS, он прекращает построение дерева DOM и создает дерево CSSOM.
  • после построения дерева CSSOM создается дерево DOM.
  • после их объединения создается дерево рендеринга.

Но поскольку построение DOM останавливается при встрече <script> , мы ставим <script> прямо перед </body> , чтобы завершить построение дерева рендеринга перед загрузкой JS.

Но не означает ли это, что </body> еще не находится в дереве DOM? Записи, которые я видел, объясняют мне, что мы можем завершить рендеринг, не дожидаясь того, что <script> делает. Я думаю, что если это правда, то дерево рендеринга создается без ожидания полного дерева DOM, а только дерева CSSOM. Потому что браузеры могут просматривать до </body> анализа.

Или он распознает, что единственным левым элементом является </body> , и просто игнорирует его?

Ответ №1:

Вы немного не понимаете, но я сосредоточусь на ключевом моменте.

Во-первых, DOM не содержит отдельных начальных и конечных элементов или тегов. Пара тегов {<body>,</body>} создает один элемент с именем body . Аналогично пара тегов {<span>,</span>} создает один элемент с именем span .

Как только синтаксический анализатор обнаруживает начальный тег, элемент создается и добавляется в DOM. Если синтаксический анализ останавливается, весь DOM, созданный до этого момента, может быть отображен — при условии, что в это время не выполняется выборка, блокирующая рендеринг.

Что касается конечных тегов, они в основном используются только для определения того, где заканчивается элемент, чтобы следующий элемент или текст в разметке не добавлялся как дочерний элемент элемента, который только что закончился.

Однако, </body> это немного особый случай. Если анализатор обнаруживает теги или текст после </body> тега, анализатор «исправит» DOM, поместив элементы и текст в качестве дочерних элементов элемента body. Это не означает, что анализатор полностью игнорирует </body> тег — если узел комментария сразу следует за </body> тегом, он будет добавлен как дочерний элемент html-элемента, а не элемента body.