Отложенное выполнение inline Javascript: проблема и решение

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Если хотите имитировать работу атрибута defer во встроенных скриптах, можно воспользоваться следующим подходом: встроить свой JavaScript-код в функцию и запустить её по событию DOMContentLoaded. Это обеспечит выполнение кода после полной загрузки иолного анализа DOM.

JS
Скопировать код
// Название вашей функции
function myInlineScript() {
  // Здесь ваши JavaScript-инструкции
}
// Запуск после полной загрузки DOM
document.addEventListener('DOMContentLoaded', myInlineScript);

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

Кинга Идем в IT: пошаговый план для смены профессии

Оптимальное размещение скриптов

Позиция скриптов имеет значение даже в контексте работы с JavaScript. Чтобы отложить выполнение, поместите <script> перед закрывающим тегом </body>. Это позволит браузеру сначала полностью сформировать DOM:

markup
Скопировать код
<body>
  <!-- HTML-разметка вашего сайта -->
  <script>
    // Ждем здесь, пока DOM будет готов
  </script>
</body>

Использование модульных скриптов в качестве альтернативы

Модульные скрипты с атрибутом type="module" обеспечивают автоматическое отложенное выполнение кода, как это делает defer:

JS
Скопировать код
<script type="module">
  // Я модуль, так что подожду свою очередь
</script>

Не торопитесь! Не запускайтесь сразу

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

Визуализация

Можно представить встроенный JavaScript, как повара в ресторане, который начинает готовить сразу. Отложенное выполнение позволяет сначала принять заказы, потом подготовить все ингредиенты и только потом приступить к приготовлению блюд. Важно, чтобы "загрузка" сайта была полностью завершена до начала "приготовления" скриптов.

Base64 URL для встраивания скриптов

Вы можете превратить ваш скрипт в Base64 URL и использовать его в модульном скрипте для инкапсуляции кода и отложенного выполнения:

JS
Скопировать код
<script type="module" src="data:text/javascript;base64,/* Ваш код, закодированный в Base64 */"></script>

Создание шаблонов с использованием шаблонизаторов

Фреймворки и библиотеки, такие как Handlebars или Angular, помогают структурировать отложенное выполнение скриптов, при этом обеспечивают четкость и последовательность при помощи встроенных шаблонов.

Тестирование выполнения встроенных скриптов

Как и каждый внимательный разработчик, обратите внимание на сетевую активность через инструменты разработчика браузера или используйте console.log, чтобы проверить момент, когда DOM становится доступным:

JS
Скопировать код
document.addEventListener('DOMContentLoaded', () => {
  console.log("Документ готов!");
});

Полезные материалы

  1. <script>: Элемент Script – HTML: HyperText Markup Language | MDN — информативный ресурс от MDN об использовании атрибута defer.
  2. Оптимизация загрузки сторонних JavaScript | Статьи | web.dev — подробное руководство, рассматривающее работу defer и async.
  3. Погружение в загрузку скриптов | Статьи | web.dev — подробное исследование процессов загрузки скриптов.
  4. Атрибут defer тега script — понятное пособие по использованию defer.
  5. Отложите загрузку не критичного CSS | Статьи | web.dev — рекомендации по оптимизации загрузки некритичных CSS-ресурсов.
  6. Эффективная загрузка JavaScript с помощью defer и async — детальное объяснение влияния defer и async на загрузку JavaScript.