У меня есть несколько вопросов по поводу атрибутов async
и defer
для <script>
тега , который к моему пониманию работы только в HTML5 браузеров.
На одном из моих сайтов есть два внешних файла JavaScript, которые в данный момент находятся над </body>
тегом; во-первыхJQuery Источник от Google, а второй является локальным внешним скриптом.
С учетом скорости загрузки сайта
Есть ли какое-то преимущество в добавлении
async
к двум сценариям, которые у меня есть внизу страницы?Будет ли какое-то преимущество в добавлении
async
опции к двум сценариям и размещении их в верхней части страницы в<head>
?- Означает ли это, что они загружаются при загрузке страницы?
- Я предполагаю, что это вызовет задержки для браузеров HTML4, но ускорит ли это загрузку страниц для браузеров HTML5?
С помощью <script defer src=...
- Повлияет ли загрузка двух скриптов внутри
<head>
с атрибутом такdefer
же, как и ранее</body>
? - Еще раз я предполагаю, что это замедлит работу браузеров HTML4.
С помощью <script async src=...
Если у меня есть два сценария с async
включенным
- Будут ли они загружать в то же время?
- Или по одному с остальной частью страницы?
- Порядок сценариев становится проблемой? Например, один сценарий зависит от другого, поэтому, если один загружается быстрее, второй может выполняться некорректно и т. Д.
Наконец, лучше ли мне оставить все как есть до тех пор, пока HTML5 не станет более распространенным?
javascript
html
Адам
источник
источник
async
является новым (ish), ноdefer
был частью IE начиная с IE4.defer
был добавлен в другие браузеры гораздо позже, но старые версии этих браузеров, как правило, гораздо меньше.defer
это то же самое, что размещать скрипты в нижней части HTML, что было обычным явлением на протяжении многих лет.Ответы:
Сохраняйте свои сценарии прямо раньше
</body>
. Асинхронность может использоваться со сценариями, расположенными там, в нескольких случаях (см. Обсуждение ниже). Отсрочка не будет иметь большого значения для сценариев, расположенных там, потому что работа по анализу DOM в значительной степени уже выполнена в любом случае.Вот статья, которая объясняет разницу между async и defer: http://peter.sh/experiment/asynchronous-and-deferred-javascript-execution-explained/ .
Ваш HTML будет отображаться быстрее в старых браузерах, если вы сохраняете скрипты в конце тела прямо перед этим
</body>
. Таким образом, чтобы сохранить скорость загрузки в старых браузерах, не нужно размещать их где-либо еще.Если ваш второй скрипт зависит от первого скрипта (например, ваш второй скрипт использует jQuery, загруженный в первый скрипт), то вы не можете сделать их асинхронными без дополнительного кода для управления порядком выполнения, но вы можете сделать их отложенными, потому что отложенные скрипты будут по-прежнему выполняется по порядку, но только после анализа документа. Если у вас есть этот код и вам не нужны скрипты для запуска сразу, вы можете сделать их асинхронными или отложенными.
Вы можете поместить сценарии в
<head>
тег и установить их,defer
и загрузка сценариев будет отложена до тех пор, пока DOM не будет проанализирован, и это обеспечит быстрое отображение страницы в новых браузерах, которые поддерживают отложенное выполнение, но это совсем не поможет в старых браузерах это не так быстро, как просто поставить сценарии прямо перед тем,</body>
что работает во всех браузерах. Таким образом, вы можете понять, почему лучше всего их исправить</body>
.Асинхронизация более полезна, когда вам действительно все равно, когда загружается скрипт, и от загрузки этого скрипта ничего не зависит от пользователя. Наиболее часто цитируемый пример использования асинхронного сценария - это аналитический скрипт, такой как Google Analytics, который вам не нужно ждать, и запускать его не нужно срочно, он стоит один, поэтому от него ничего не зависит.
Обычно библиотека jQuery не является хорошим кандидатом на асинхронность, поскольку от нее зависят другие сценарии, и вы хотите установить обработчики событий, чтобы ваша страница могла начать реагировать на пользовательские события, и вам может потребоваться запустить некоторый код инициализации на основе jQuery, чтобы установить начальное состояние страницы. Он может использоваться как асинхронный, но другие сценарии должны быть закодированы, чтобы не выполняться, пока не будет загружен jQuery.
источник
head
и устанавливать ихdefer
не будет быстрее, чем ставить их раньше</body>
, но из того, что я прочитал, это неправильно. Подумайте об этом - если вы вставите сценарии<head>
, они начнут загружаться немедленно, тогда как, если они верны,</body>
то все остальные элементы загружаются первыми.Это изображение объясняет обычные теги сценария, асинхронные и отложенные
Асинхронные сценарии выполняются сразу после загрузки сценария, поэтому он не гарантирует порядок выполнения (сценарий, который вы включили в конце, может выполняться до первого файла сценария)
Отложенные сценарии гарантируют порядок выполнения, в котором они появляются на странице.
Ссылка на эту ссылку: http://www.growingwiththeweb.com/2014/02/async-vs-defer-attributes.html
источник
async
, победит. См. Stackoverflow.com/questions/13821151/…<script>
тега общая длина загрузки страницы увеличивается на время, необходимое для загрузки файла сценария.HTML5:
async
,defer
В HTML5 вы можете указать браузеру, когда запускать код JavaScript. Есть 3 варианта:
Без
async
илиdefer
, браузер немедленно запустит ваш сценарий, прежде чем отображать элементы, которые находятся ниже тега сценария.При
async
(асинхронном) браузер будет продолжать загружать HTML-страницу и отображать ее, пока браузер загружает и выполняет сценарий одновременно.С помощью
defer
браузера браузер запустит ваш скрипт, когда страница закончит анализ. (Не обязательно заканчивать загрузку всех файлов изображений. Это хорошо.)источник
async=""
до того, как он подтвердит и сохранит изменения шаблона.async
- Сценарии выполняются в момент их загрузки, без учета их порядка в файле HTML.Оба сценария
async
иdefer
сценарии начинают загружаться немедленно, не останавливая синтаксический анализатор, и оба поддерживают необязательныйonload
обработчик для решения общей необходимости выполнить инициализацию, которая зависит от сценария.Разница между
async
иdefer
вокруг, когда сценарий выполняется. Каждыйasync
скрипт выполняется при первой возможности после завершения загрузки и до события загрузки окна. Это означает, что возможно (и вероятно), чтоasync
сценарии не выполняются в том порядке, в котором они встречаются на странице. В то время какdefer
сценарии, с другой стороны, гарантированно выполняются в том порядке, в каком они встречаются на странице. Это выполнение начинается после того, как синтаксический анализ полностью завершен, но доDOMContentLoaded
события документа .Источник и дальнейшие подробности: здесь .
источник
Столкнулся с такой же проблемой и теперь ясно понял, как оба будут работать. Надеюсь, эта ссылка будет полезна ...
асинхронный
Когда вы добавите атрибут async в тег сценария, произойдет следующее.
Перенести
Отсрочка очень похожа на асинхронную с одним существенным отличием. Вот что происходит, когда браузер встречает скрипт с атрибутом defer.
Ссылка: разница между асинхронным и отложенным
источник
async
иdefer
загрузит файл во время анализа HTML. Оба не будут прерывать парсер.Скрипт с
async
атрибутом будет выполнен после его загрузки. Пока скрипт сdefer
атрибутом будет выполнен после завершения анализа DOM.Загруженные скрипты
async
не гарантируют какой-либо порядок. В то время как скрипты, загруженные сdefer
атрибутом, поддерживают порядок, в котором они появляются в DOM.Используйте,
<script async>
когда скрипт не полагается ни на что. когда сценарий зависит от использования.Лучшее решение было бы добавить в нижней части тела. Там не будет никаких проблем с блокировкой или рендерингом.
источник
Я думаю, что Джейк Арчибальд представил нам некоторые идеи еще в 2013 году, которые могут добавить еще больше позитива к теме:
https://www.html5rocks.com/en/tutorials/speed/script-loading/
Тем не менее, это может быть не самый быстрый способ загрузки скриптов:
источник
Кажется, что поведение defer и async зависит от браузера, по крайней мере, на этапе выполнения. ЗАМЕЧАНИЕ: отсрочка распространяется только на внешние скрипты. Я предполагаю, что async следует той же схеме.
В IE 11 и ниже порядок выглядит следующим образом:
В Edge, Webkit и т. Д. Атрибут async игнорируется или помещается в конец:
В более новых браузерах атрибут data-pagespeed-no-defer запускается перед любыми другими внешними сценариями. Это для сценариев, которые не зависят от DOM.
ПРИМЕЧАНИЕ. Используйте defer, если вам нужен явный порядок выполнения ваших внешних скриптов. Это говорит браузеру выполнить все отложенные сценарии в порядке размещения в файле.
В сторону: размер внешних javascript-скриптов имел значение при загрузке ... но не влиял на порядок выполнения.
Если вас беспокоит производительность ваших сценариев, вы можете рассмотреть возможность минимизации или простой их динамической загрузки с помощью XMLHttpRequest.
источник
data-pagespeed-no-defer
является атрибутом, используемым модулем PageSpeed на стороне сервера . Атрибут на это сам не имеет никакого эффекта в любом браузере.data-pagespeed-no-defer