Я добавляю некоторые теги <script>
динамически в элемент head после загрузки страницы. Я понимаю, что скрипты загружаются асинхронно, но можно ли ожидать, что они будут проанализированы в порядке их добавления?
Я вижу ожидаемое поведение в Firefox, но не в Safari или Chrome. Глядя на документ в инструментах разработчика Chrome и Firebug, оба показывают следующее -
<html>
<head>
...
<script type="text/javascript" src="A.js"></script>
<script type="text/javascript" src="B.js"></script>
</head>
...
</html>
Однако, глядя на представление загрузки ресурсов, кажется, что chrome выполняет синтаксический анализ того, что возвращается с сервера первым, в то время как firebug всегда загружает их в том порядке, в котором были добавлены теги сценария, даже когда B возвращается с сервера первым.
Стоит ли ожидать, что Chrome / Safari проанализирует файлы в указанном порядке? Использование бета-версии Chrome 5.0.375.29 на OS X 10.6.3
РЕДАКТИРОВАТЬ (10/5/10): Когда я говорю "синтаксический анализ", я имею в виду выполнить - может увидеть много преимуществ агрессивного анализа - thx rikh
РЕДАКТИРОВАТЬ (11/5/10): Хорошо, так что я собрал тест по тому же принципу, что и Джандопазо ниже. Однако я добавил комбинацию вещей, в том числе
- Добавление элемента script к голове напрямую с помощью javascript. (Тесты A -> D)
- Добавление элемента script в заголовок с помощью метода append () jquery. (Тесты E -> H)
- 'Загрузка' скрипта с помощью метода getScript () jquery. (Тесты I -> L)
Я также попробовал все комбинации атрибутов 'async' и 'defer' в тегах сценария.
Вы можете получить доступ к тесту здесь - http://dyn -script-load.appspot.com / и просмотреть исходный код, чтобы увидеть, как он работает. Загруженные скрипты просто вызывают функцию update ().
Первое, на что нужно обратить внимание, - это то, что только 1-й и 3-й методы выше работают параллельно - 2-й выполняет запросы последовательно. Вы можете увидеть график этого здесь -
Изображение 1 - график жизненного цикла запроса
Запрос графика жизненного цикла http://dyn -script-load.appspot.com / images / dynScriptGraph.png
Также интересно, что подход jquery append () также блокирует вызовы getScript () - вы можете видеть, что ни один из них не выполняется до тех пор, пока все вызовы append () не будут завершены, а затем все они будут выполняться параллельно. В заключение отметим, что метод jQuery append (), по-видимому, удаляет теги сценария из заголовка документа после их выполнения. Только первый метод оставляет теги скрипта в документе.
Результаты Chrome
В результате Chrome всегда выполняет первый возвращаемый скрипт, независимо от теста. Это означает, что все тесты «провалились», кроме метода jQuery append ().
Изображение 2 - Результаты Chrome 5.0.375.29 beta
Результаты Chrome http://dyn -script-load.appspot.com / images / chromeDynScript.png
Результаты Firefox
Однако в Firefox, похоже, что если используется первый метод, а async имеет значение false (то есть не установлено), то сценарии будут надежно выполняться по порядку.
Изображение 3 - Результаты FF 3.6.3
Результаты FF http://dyn -script-load.appspot.com / images / ffDynScript.png
Обратите внимание, что Safari, похоже, дает различные результаты так же, как и Chrome, что имеет смысл.
Кроме того, у меня есть задержка в 500 мс для медленного сценария, просто чтобы уменьшить время начала и окончания. Возможно, вам придется обновить пару раз, чтобы Chrome и Safari перестали работать во всех случаях.
Мне кажется, что без способа сделать это мы не воспользуемся возможностью параллельного извлечения данных, и нет никаких причин, почему мы не должны этого делать (как показывает Firefox).