Браузер отличается от рендеринга с различным расположением скрипта и тега ссылки
Я пытаюсь понять, когда именно HTML отображается на экране в браузере.
Я прочитал этот SO- ответ и попробовал несколько вариантов использования, и я заметил что-то, что не вписывается в модель, указанную в ссылке,
также я не могу найти последовательную модель ума для наблюдения.
Какой порядок рендеринга в браузере соответствует обсуждаемым случаям?
- Когда анализатор HTML достигает M1, отображается M1.
- Затем синтаксический анализатор достигает тега скрипта, ожидает загрузки файла js и анализирует его.
- Затем парсер достигает M3, отображается M3.
Случай A соответствует порядку, описанному в большинстве ответов. Huray!!! Давайте двигаться дальше.
- Анализатор HTML достигает M1, M1 не отображается, как в случае A
- HTML-парсер достигает тега ссылки, он ждет загрузки css и парсера.
- Отображаются M1 и M2, поэтому он ждал загрузки таблицы стилей перед рендерингом M1.
- Затем синтаксический анализатор достигает тега скрипта, ожидает загрузки файла js и анализирует его.
- Затем парсер достигает M3, отображается M3.
Так, Case-B показывает, что он не рендерил M1, он ждал загрузки CSS, прежде чем рендерить его.Поэтому, возможно, визуализатору необходимо знать CSS перед рендерингом.
Дело:C Изображение C
Таким образом, из случая B мы предположили, что может потребоваться знать CSS.
Давайте посмотрим на случай C:
- HTML-парсер достигает M1, отображается M1. Он не должен был отображаться, поскольку, как мы видели в случае B, он должен был ждать загрузки css.
- Теперь парсер достигает скрипта, он ждет загрузки js и парсера.
- M2, M3 отображаются
Изменить: Предлагаемая модель ума, которая объясняет вышеупомянутое поведение..(но требует пересмотра / уточнения)
Script
не является тегом блокировки рендерераlink
тег блокировки рендерера- Учитывая, что рендер и HTML-парсер являются двумя потоками.
- Синтаксический анализатор HTML может отправлять данные для рендеринга.
- Синтаксический анализатор HTML может отправлять сигнал блока рендереру..блоковому рендереру для рендеринга любого html, который не был обработан хотя бы один раз.
- HTML-парсер может отправлять сигнал разблокировки для рендерера... чтобы разблокировать рендерер от рендеринга любого HTML, который не был обработан один раз.
С помощью приведенной выше модели мы можем объяснить CASE B и CASE C:
СЛУЧАЙ B Объяснение:
- HTML-парсер достигает M1, M1 отправляется рендереру.
- HTML-парсер достигает тега Link, парсер посылает сигнал блокирования рендереру.
- Рендерер, прежде чем он может отрендерить M1, получил сигнал блокировки и, следовательно, M1 не отображается.
- Анализатор HTML завершает разбор (загрузку) тега ссылки и отправляет сигнал разблокировки для средства визуализации, после получения сигнала разблокировки он отображает M1.
- HTML-парсер достигает M2, M2 отправляется рендереру.
- HTML-синтаксический анализатор достигает тега Script, поскольку тег script не является тегом блокировки рендерера, рендер может рендерить html.
- Анализатор HTML завершает разбор тега скрипта (загрузка).
- HTML-парсер достигает M3, M3 отправляется рендереру.
Точно так же мы можем запустить CASE C в сухом режиме, и он отлично вписывается в модель выше.
Моя модель правильная или с ней что-то не так?
1 ответ
Вы почти правы. За исключением того, что это проще - рендерер пассивен и не получает "сигнал блокировки". Он не рендерится (обновляет отображение, чтобы отразить dom-дерево), пока кто-то не попросит об этом
Ваш HTML неверен - вы не можете поставить
<link rel=...>
в теле. (Живой HTML 4.2.4)Как вы уже поняли, таблица стилей является ресурсом, блокирующим рендеринг - она предотвращает рендеринг контента, в отличие от скрипта, который приостанавливает и рендерит проанализированный контент.
Вот как я это объясню:
Дело Б: M1 - stylesheet - M2 - script - M3
- Браузер получает HTML. M1 входит в дерево DOM. M1 еще не отображается, рендереру не было предложено работать.
- загружает таблицу стилей. (в действительности это предотвращает рендеринг M1)
- таблица стилей готова. М1 по-прежнему не отображается. (еще два шага)
- М2 входит в дерево DOM. М1 и М2 пока не отображаются.
- скрипт запускает рендеринг, отображая M1 и M2, а затем загружает.
- Сценарий выполнен. Ничего не изменится (как бы это ни касалось дела).
- M3 входит в дерево DOM, пока не отображается.
- Документ готов, страница отрисована, поэтому отображается M3.
Эти поведения являются преднамеренными. Когда-то js работал медленно, а запуск сценариев занимал много времени, тогда как таблицы стилей были (и остаются) важны для скрытия элементов по умолчанию. Время могло измениться, но вряд ли это поведение изменится.
Дело С: M1 - script - M2 - link - M3
- Браузер получает HTML. M1 входит в дерево DOM. М1 пока не отображается.
- Скрипт запускает рендер, отображая M1, а затем загружается.
- Сценарий выполнен. Ничего не меняется.
- М2 входит в дерево DOM. Это еще не отображается.
- загружает таблицу стилей, фактически блокируя M2.
- таблица стилей готова. М2 по-прежнему не отображается.
- M3 входит в дерево DOM, пока не отображается.
- Документ готов, страница отображается, M2 и M3 выводятся на экран.
Фактический процесс отображения, с точки зрения потоков, очень сложен, и в некотором смысле сильно зависит от браузера. Например, DOM не является потокобезопасным. Подумай, что это значит.
Для простоты вы можете представить обработку браузера как данные и события, проходящие между различными модулями. Вот некоторые подсистемы рендеринга Firefox: