Любая хорошая причина не использовать <script defer> СЕГОДНЯ?

Когда-то было много жарких дебатов <script> в <head> или <body>.

Многие сообщения SO уже указывали, что лучшей практикой/эмпирическим правилом является размещение <script> до конца <body> для того, чтобы не блокировать парсер html, что привело к ускорению первой экранной краски и более быстрого доступа DOM для клиента и таким образом, лучший UX.

Это должен быть дубликат╰ (`□ ') ╯

Подождите... <script> может быть deferred сейчас, на самом деле довольно долгое время!

Старые сообщения сказали

отсроченный script может привести к проблемам с JS-зависимостью

Нет, не будет. Он сохраняет заказ при выполнении сразу же после разбора DOM.

Он не работает с перекрестными поставщиками

Да, он когда-то был, но сегодня он почти поддерживается всеми основными поставщиками браузеров: http://caniuse.com/#search=defer, кроме того, может возникнуть проблема с IE &lt 10, как отмечают комментарии.

Однако преимущества, которые он предлагает, кажутся очевидными, по крайней мере для меня, поскольку он загружает script параллельно в предыдущее время (перед началом разбора DOM), поэтому нет необходимости запрашивать script позже и сокращать времени, которое требуется для обеспечения интерактивности всей страницы.

Короче говоря, этот вопрос похож на: Любая хорошая причина не использовать

<head>
...
<script src='cdn/to/jquery' defer>
<script src='cdn/to/bootstrap' defer>
<script src='script/depends/on/jqueryandbootstrap' defer>
</head>

вместо этого:

<body>
...
<script src='cdn/to/jquery'>
<script src='cdn/to/bootstrap'>
<script src='script/depends/on/jqueryandbootstrap'>
</body>

<суб > Примечание. Это может быть "древняя" тема с большим количеством обсуждений. Однако по мере того, как веб-технологии продвигаются очень быстро, разработчики браузеров лучше и более согласуются с новыми веб-спецификациями, многие старые ответы на stackoverflow могут не обновляться. Суб >

Ответ 1

Да, но только потому, что вы используете jQuery.

jQuery не работает с defer, поскольку он пытается запустить, как только страница станет интерактивной. Они не могут исправить это в ближайшее время (я поднял эту ошибку больше года назад), потому что изменение готового поведения для работы с defer приведет к разрыву множества компонентов, которые полагаются на запуск события jQuery ready на интерактивном (т.е. до того, как отложенные сценарии имеют готовая загрузка).

Если вы используете более современную структуру (React, Angular 2, Polymer, Vue или что-то еще), перейдите к ней или перейдите к следующему шагу и используйте <script type=module в новых браузерах и устаревший пакет в <script nomodule defer... для IE.