Подтвердить что ты не робот

Использование тега script async> с Angular.js

Илья Григорик рекомендует, если возможно, использовать тег <script async>.

Существует ли чистый, предпочтительный способ загрузки приложения Angular.js с использованием тега без использования таких инструментов, как require.js или инструмент $script.js, рекомендованный angular -seed?

Очевидной проблемой является порядок выполнения. например предупреждения:

Uncaught ReferenceError: angular is not defined

https://www.igvita.com/2014/05/20/script-injected-async-scripts-considered-harmful/

4b9b3361

Ответ 1

Если есть что-то полезное, вы можете показать без angular (например, предварительно сгенерированный контент с помощью браузера без браузера) И ничего, кроме вашего script, зависит от него 1 тогда может быть решение:

  • load angular.js с помощью async
  • инкапсулировать код в тело функции
  • добавить проверку цикла, если angular определено
    • и спать в течение нескольких миллисекунд, если не
    • в противном случае выполнение кода и выход из цикла

Этот вид оживленного ожидания уродлив, но я не вижу, как получить обратный вызов, когда загрузка завершается. Это может работать или нет, я еще не пробовал.

Вполне возможно, что я не делаю ничего, кроме примитивной версии того, что делают фреймворки.

Если вам не нужно работать в всех браузерах, то есть тег defer. Для меня defer выглядит как async сделано правильно.


1 Итак, я думаю, пользователям angular-route.js или похожим не повезло. Это просто предположение, поскольку я никогда не пытался загрузить эти два порядка.

Ответ 2

Вы можете объединить все зависимые JS файлы в один, прежде чем использовать async. Для этого используйте Grunt, Gulp, брокколи или другую задачу.

Если script является модульным и не полагается на какие-либо скрипты, используйте async.

Источник: Рекомендации по производительности для веб-разработчиков.

Ответ 3

НЕ ИСПОЛЬЗУЙТЕ атрибут async с тегом Angular.js script.

Кажется, что использование атрибута async вредно. Без него выражения оцениваются в событии DOMContentLoaded, но с атрибутом async они оцениваются в событии загрузки окна, что намного позже. Протестировано для Angular.js 1.0 и 1.4 в последней версии Firefox, Chrome и IE11.

Ответ 4

В соответствии с этим ответом вы можете попробовать использовать defer вместо async, что приводит к тому, что браузер соблюдает порядок загрузки. Например:.

<script src="scripts/vendor-including-angular.js" defer></script>    
<script src="scripts/your-app.js" defer></script>