Ответ 1
Представьте, что на странице HTML есть два элемента <script src="...">
. Парсер видит первый. Он должен останавливать * синтаксический анализ во время его извлечения, а затем выполняет javascript, потому что он может содержать вызовы методов document.write()
, которые в корне меняют порядок обработки следующей разметки. Получение ресурсов через Интернет сравнительно медленнее, чем другие, что делает браузер, поэтому он сидит в ожидании, не имея ничего общего. В конце концов, JS прибывает, исполняется и парсер может двигаться дальше. Затем он видит второй тег <script src="...">
и должен пройти весь процесс ожидания повторного загрузки ресурса. Это последовательный процесс и блокировка парсера.
Ресурсы CSS разные. Когда синтаксический анализатор видит загружаемую таблицу стилей, он выдает запрос серверу и переходит к нему. Если есть другие ресурсы для загрузки, все они могут быть выбраны параллельно (с учетом некоторых ограничений HTTP). Но только когда ресурсы CSS загружены и готовы, страница может быть нарисована на экране. Это делает блокировку, и поскольку выборки параллельны, это менее серьезно замедляет работу.
* Блокировка Parser не так проста, как в некоторых современных браузерах. У них есть возможность предварительно проанализировать следующий HTML-код в надежде, что script, когда он загружается и выполняет, не делает ничего, чтобы испортить последующий синтаксический разбор или если это произойдет, что все же необходимы все те же ресурсы для загружаться. Но им все равно придется отменить работу, если script делает что-то неловкое.