@segfaultBut, но я не знаю, ошибаетесь ли вы, но чтобы получить ответ на этот вопрос, вы говорите: «но кажется, что для выполнения кода JavaScript необязательно, чтобы он выполнялся полностью» (пример синхронная среда) Что вы имеете в виду именно под "разбором". Какой парсер? Анализатор HTML?
с о следующем коде:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Test</title>
</head>
<body>
One line of HTML code
<script>
// Synchronous delay of 5 seconds
var timeWhile = new Date().getTime();
while( new Date().getTime() - timeWhile < 5000 );
</script>
</body>
Я протестировал его в Firefox и Chrome, и они показывают (рендеринг): «Одна строка HTML-кода» через 5 секунд, а не в течение 5 секунд. Почему браузер делает это?
Я понимаю, почему браузер должен останавливать рендеринг при выполнении JavaScript, потому что вы можете изменить стиль элементов с помощью JavaScript (в качестве примера). Это создаст проблемы, если браузер будет показывать и изменять контент в одно и то же время. Вот почему браузер блокирует рендеринг при выполнении JavaScript.
В приведенном выше примере при запуске с JavaScript «одна строка HTML-кода» уже анализируется «HTML-парсером». Это необходимо, потому что JavaScript может содержать, например, document.write, поэтому добавленная строка должна идти после предыдущего HTML. Очевидно, между «разбором HTML» и отображением / рендерингом того же HTML существует некоторое время, потому что в противном случае браузер в этом примере уже показал бы что-то в течение 5 секунд, но это не так.
Когда вы заменяете «Одну строку HTML-кода» большим количеством HTML-кода, браузер уже будет показывать некоторый контент в течение 5 секунд, поэтому в принципе возможно показывать уже некоторый контент.
Если бы я был браузером, я бы сделал:
Разбор "Одна строка HTML-кода"Видя какой-то блок JavaScriptЗакончите рендеринг HTML, предшествующего «блоку JavaScript», чтобы браузер отобразил на этом этапе: «Одна строка HTML-кода»Теперь приостановите рендеринг и выполните код JavaScript.После выполнения кода JavaScript снова начните рендеринг.В примере, подобном этому, браузер может показывать некоторый контент на 5 секунд раньше. Это большой выигрыш в скорости рендеринга.
Может быть, это то, что браузеры могут улучшить, но, возможно, есть другая причина. Может быть, кто-то знает об этом больше и может мне это объяснить.