Я сделал несколько веб-проектов, но я не слишком много думаю о последовательности загрузки и выполнения обычной веб-страницы. Но теперь мне нужно знать детали. Трудно найти ответы от Google или SO, поэтому я создал этот вопрос.
Пример страницы выглядит так:
<html>
<head>
<script src="jquery.js" type="text/javascript"></script>
<script src="abc.js" type="text/javascript">
</script>
<link rel="stylesheets" type="text/css" href="abc.css"></link>
<style>h2{font-wight:bold;}</style>
<script>
$(document).ready(function(){
$("#img").attr("src", "kkk.png");
});
</script>
</head>
<body>
<img id="img" src="abc.jpg" style="width:400px;height:300px;"/>
<script src="kkk.js" type="text/javascript"></script>
</body>
</html>
Итак, вот мои вопросы:
- Как загружается эта страница?
- Какова последовательность загрузки?
- Когда выполняется код JS? (встроенный и внешний)
- Когда выполняется CSS (применяется)?
- Когда исполняется $ (document) .ready?
- Будет ли загружен abc.jpg? Или это просто скачать kkk.png?
У меня есть следующее понимание:
- Браузер сначала загружает HTML (DOM).
- Браузер начинает загружать внешние ресурсы сверху вниз, строка за строкой.
- Если a
<script>
выполнено, загрузка будет заблокирована и дождется загрузки и выполнения файла JS, а затем продолжится. - Другие ресурсы (CSS / изображения) загружаются параллельно и выполняются при необходимости (например, CSS).
Или это так:
Браузер анализирует HTML (DOM) и получает внешние ресурсы в виде массива или структуры, подобной стеку. После загрузки HTML браузер начинает загружать внешние ресурсы в структуре параллельно и выполнять до тех пор, пока не будут загружены все ресурсы. Затем DOM будет изменен в соответствии с поведением пользователя в зависимости от JS.
Может ли кто-нибудь дать подробное объяснение того, что происходит, когда вы получите ответ HTML-страницы? Отличается ли это в разных браузерах? Любая ссылка на этот вопрос?
Спасибо.
РЕДАКТИРОВАТЬ:
Я провел эксперимент в Firefox с Firebug. И это показывает как следующее изображение:
источник
Ответы:
Согласно вашему образцу,
Примерно поток выполнения выглядит следующим образом:
<script src="jquery.js" ...
jquery.js
загружается и анализируется<script src="abc.js" ...
abc.js
загружается, анализируется и запускается<link href="abc.css" ...
abc.css
загружается и анализируется<style>...</style>
<script>...</script>
<img src="abc.jpg" ...
abc.jpg
загружается и отображается<script src="kkk.js" ...
kkk.js
загружается, анализируется и запускаетсяОбратите внимание, что загрузка может быть асинхронной и неблокируемой из-за поведения браузера. Например, в Firefox есть этот параметр, который ограничивает количество одновременных запросов на домен.
Также в зависимости от того, был ли компонент уже кэширован или нет, этот компонент может не запрашиваться снова в запросе ближайшего будущего. Если компонент был кэширован, он будет загружен из кеша вместо фактического URL.
Когда анализ завершен, а документ готов и загружен, запускаются события
onload
. Таким образом, когдаonload
уволен,$("#img").attr("src","kkk.png");
запускается. Так:$("#img").attr("src", "kkk.png");
kkk.png
загружается и загружается в#img
$(document).ready()
Событие на самом деле это событие срабатывает , когда все компоненты страницы загружаются и готовы. Подробнее об этом читайте: http://docs.jquery.com/Tutorials:Introduction_$ (документ) .ready ()Редактировать - эта часть более подробно описывает параллельную или нет:
По умолчанию и, насколько я понимаю, браузер обычно запускает каждую страницу тремя способами: анализатор HTML, Javascript / DOM и CSS.
Синтаксический анализатор HTML отвечает за синтаксический анализ и интерпретацию языка разметки и, следовательно, должен иметь возможность вызывать другие 2 компонента.
Например, когда парсер встречает эту строку:
Парсер сделает 3 вызова, два в Javascript и один в CSS. Во-первых, анализатор создаст этот элемент и зарегистрирует его в пространстве имен DOM вместе со всеми атрибутами, связанными с этим элементом. Во-вторых, будет вызван синтаксический анализатор, чтобы связать событие onclick с этим конкретным элементом. Наконец, он сделает еще один вызов в потоке CSS, чтобы применить стиль CSS к этому конкретному элементу.
Исполнение сверху вниз и однопоточное. Javascript может выглядеть многопоточным, но дело в том, что Javascript является однопоточным. Вот почему при загрузке внешнего файла JavaScript разбор основной HTML-страницы приостанавливается.
Тем не менее, файлы CSS могут быть загружены одновременно, потому что правила CSS всегда применяются, то есть элементы всегда перерисовываются с использованием самых новых определенных правил CSS, что делает его разблокированным.
Элемент будет доступен в DOM только после его анализа. Таким образом, при работе с конкретным элементом скрипт всегда помещается после или внутри события onload окна.
Такой скрипт вызовет ошибку (в jQuery):
Потому что, когда скрипт анализируется,
#mydiv
элемент все еще не определен. Вместо этого это будет работать:ИЛИ
источник
<script>
будет блокировать другие компоненты, верно? Любая ссылка о спецификации для каждого браузера?1) HTML загружен.
2) HTML анализируется постепенно. При получении запроса на актив браузер пытается загрузить ресурс. Конфигурация по умолчанию для большинства HTTP-серверов и большинства браузеров заключается в параллельной обработке только двух запросов. IE можно перенастроить, чтобы загружать неограниченное количество ресурсов параллельно. Стив Соудерс смог загрузить более 100 запросов параллельно в IE. Исключением является то, что запросы скриптов блокируют параллельные запросы ресурсов в IE. Вот почему настоятельно рекомендуется поместить весь JavaScript во внешние файлы JavaScript и поместить запрос непосредственно перед закрывающим тегом body в HTML.
3) После разбора HTML-кода DOM отображается. CSS отображается параллельно с отображением DOM почти во всех пользовательских агентах. В результате настоятельно рекомендуется поместить весь код CSS во внешние файлы CSS, которые запрашиваются как можно выше в разделе <head> </ head> документа. В противном случае страница обрабатывается до появления позиции запроса CSS в DOM, а затем рендеринг начинается сверху.
4) Только после полной визуализации DOM и разрешения всех ресурсов на странице либо по истечении времени ожидания JavaScript выполняется из события onload. IE7, и я не уверен насчет IE8, быстро не активирует ресурсы, если на запрос ресурса не получен HTTP-ответ. Это означает, что актив, запрашиваемый JavaScript, встроенным в страницу, то есть JavaScript, записанный в теги HTML, который не содержится в функции, может на несколько часов препятствовать выполнению события onload. Эта проблема может быть вызвана, если такой встроенный код существует на странице и не выполняется из-за столкновения пространства имен, которое вызывает сбой кода.
Из вышеперечисленных шагов наиболее ресурсоемким является анализ DOM / CSS. Если вы хотите, чтобы ваша страница обрабатывалась быстрее, напишите эффективный CSS, исключив избыточные инструкции и объединив инструкции CSS в наименьшее количество ссылок на элементы. Уменьшение количества узлов в вашем DOM-дереве также приведет к более быстрому рендерингу.
Имейте в виду, что каждый ресурс, который вы запрашиваете из вашего HTML или даже из ваших ресурсов CSS / JavaScript, запрашивается с отдельным заголовком HTTP. Это потребляет пропускную способность и требует обработки для каждого запроса. Если вы хотите, чтобы ваша страница загружалась как можно быстрее, уменьшите количество HTTP-запросов и уменьшите размер вашего HTML. Вы не оказываете никакой помощи пользователю, усредняя вес страницы в 180 Кб только из HTML. Многие разработчики соглашаются с ошибкой, заключающейся в том, что пользователь принимает решение о качестве контента на странице за 6 наносекунд, а затем удаляет DNS-запрос со своего сервера и записывает свой компьютер, если он недоволен, поэтому вместо этого они предоставляют самую красивую страницу на 250 тыс. HTML. Сделайте ваш HTML коротким и приятным, чтобы пользователь мог быстрее загружать ваши страницы.
источник
Откройте свою страницу в Firefox и получите аддон HTTPFox. Он расскажет вам все, что вам нужно.
Нашел это в архиве.incuito:
http://archivist.incutio.com/viewlist/css-discuss/76444
источник
Если вы спрашиваете об этом, потому что хотите ускорить свой веб-сайт, загляните на страницу Yahoo, посвященную рекомендациям по ускорению вашего веб-сайта . У этого есть много лучших методов для ускорения Вашего веб-сайта.
источник
AFAIK, браузер (по крайней мере, Firefox) запрашивает каждый ресурс, как только он его анализирует. Если он встречает тег img, он запросит это изображение, как только тег img будет проанализирован. И это может произойти даже до того, как он получит весь документ HTML ... то есть он все еще может загружать документ HTML, когда это произойдет.
Для Firefox существуют очереди браузера, которые применяются в зависимости от того, как они установлены в about: config. Например, он не будет пытаться загрузить более 8 файлов одновременно с одного сервера ... дополнительные запросы будут поставлены в очередь. Я думаю, что есть ограничения для каждого домена, для каждого прокси-сервера и другие вещи, которые описаны на веб-сайте Mozilla и могут быть установлены в about: config. Я где-то читал, что IE не имеет таких ограничений.
Событие jQuery ready запускается сразу после загрузки основного HTML-документа и его анализа в DOM. Затем событие загрузки запускается после загрузки и анализа всех связанных ресурсов (CSS, изображений и т. Д.). Это ясно показано в документации по jQuery.
Если вы хотите контролировать порядок загрузки всего этого, я считаю, что наиболее надежный способ сделать это - использовать JavaScript.
источник
Dynatrace AJAX Edition показывает точную последовательность загрузки, анализа и выполнения страницы.
источник
Выбранный ответ, похоже, не относится к современным браузерам, по крайней мере, в Firefox 52. Я заметил, что запросы на загрузку ресурсов, таких как css, javascript, передаются, например, до того, как HTML-анализатор достигает элемента
Что я обнаружил, что время начала запросов на загрузку ресурсов CSS и JavaScript не были заблокированы. Похоже, что Firefox сканирует HTML и идентифицирует ключевые ресурсы (ресурс img не включен) перед началом анализа HTML.
источник