07 Модуль - DOM. События -- 05 Процесс построения веб-страницы Flashcards
Когда браузер создает DOM, если он встречает тег script в HTML, он
должен выполнить его сразу.
По умолчанию, чтобы выполнить скрипт, построение DOM
приостанавливается, и возобновляется только после того, как JavaScript-движок выполнил скрипт.
Почему построение DOM приостановается?
Скрипты могут изменять как HTML, так и его продукт - DOM, добавляя узлы. Скрипты могут также запрашивать что-то о DOM, и если это происходит, когда DOM все еще строится, он может вернуть неожиданные результаты.
Когда синтаксический анализатор попадает в тег сценария, конструкция DOM не может продолжаться до тех пор, пока JavaScript не завершит выполнение, и JavaScript не будет выполнен до тех пор, пока
CSS не будет загружен, проанализирован и не будет доступен CSSOM.
Браузер показал беспорядочную страницу без CSS, а через несколько мгновений стилизованную, это называется
Flash of Unstyled Content.
Чтобы обойти эти проблемы, вы должны стремиться как можно быстрее доставить CSS. Помните правило «стили наверху, сценарии внизу»?
Синхронные скрипты блокирующие парсер, это проблема. И не все скрипты одинаково важны для пользователей, например, для отслеживания и аналитики. Решение?
Асинхронная загрузка этих менее важных скриптов.
defer и async - оба атрибута сообщают браузеру, что он может
продолжить разбор HTML при загрузке сценария в фоновом режиме, а затем выполнить скрипт после его загрузки. Таким образом, загрузка скриптов не блокирует конструкцию DOM и рендеринг страниц.
Выполнение defer скриптов начинается
после завершения парсинга, но перед событием DOMContentLoaded. Это гарантирует, что скрипты будут выполняться в том порядке, в котором они отображаются в HTML, и не будут блокировать синтаксический анализатор.
async выполняется
при первой возможности после завершения загрузки и перед событием загрузки окна. Это означает, что возможно скрипты не выполняются в том порядке, в котором они отображаются в HTML. Это также означает, что они могут прервать создание DOM.
Асинхронные скрипты загружаются с
низким приоритетом. Они часто загружаются после всех других скриптов, не блокируя создание DOM.
Атрибут defer загружается вместе с html DOM, но только фоном, и когда он загрузился, он ждет пока полностью загрузиться DOM и только после загрузки DOM’a он выполняется.
http://fecore.net.ua/books/m5ph3r-javascript/module-07/images/defer.png
Атрибут async загружается вместе с html DOM, но только фоном, и когда он загрузился, он не ждет полной загрузки DOM’а, он сразу начинает выполняется, и когда он выполняется он блокирует загрузку DOM, получается что DOM начинается грузиться только после выполнения async скрипта.
http://fecore.net.ua/books/m5ph3r-javascript/module-07/images/async.png