defer и async: ускоряем загрузку скриптов

Если ваш сайт тормозит, первые подозрения часто падают на тяжёлые JavaScript‑файлы. Правильная загрузка скриптов может решить проблему без пересмотра кода. Атрибуты defer и async в теге <script> позволяют браузеру работать быстрее, а пользователю – видеть контент сразу.

Что делают defer и async

async говорит браузеру: «Скачай файл сразу и выполни, как только он будет готов». Это удобно, когда скрипт не зависит от других и не меняет DOM до того, как страница отрисуется. В результате страница может отобразиться, а скрипт успеет выполниться независимо.

defer тоже скачивает файл параллельно, но откладывает его выполнение до конца парсинга HTML. Все скрипты с defer сохраняют порядок, как если бы они стояли в конце <body>. Это безопасный вариант, если скрипт работает с DOM‑элементами, которые появляются только после полной загрузки страницы.

Когда и как ставить атрибуты

1. **Скрипты аналитики, рекламные пиксели** – обычно их не требуется ждать. Поставьте async, чтобы они скачались быстро и не блокировали рендеринг.

2. **Библиотеки UI, которые меняют разметку** – лучше использовать defer. Так вы гарантируете, что HTML уже готов, а библиотека сможет безопасно работать с элементами.

3. **Кастомный код, зависящий от сторонних библиотек** – если порядок важен, ставьте defer для всех файлов. Браузер выполнит их в том порядке, в котором они объявлены.

Пример правильного подключения:

<script src="/js/analytics.js" async></script>
<script src="/js/vendor.js" defer></script>
<script src="/js/app.js" defer></script>

Обратите внимание, что атрибуты работают только с внешними файлами (src). Встроенный код (<script>…</script> без src) всегда исполняется сразу, и async или defer к нему не применимы.

Если вы уже используете сборщики (Webpack, Vite) – проверьте, не вставляют ли они defer автоматически. Иногда генераторы ставят атрибуты, а вы этого не замечаете, и результат оказывается не тем, что ожидали.

Неправильное применение может вызвать ошибки. Например, если скрипт, объявленный async, пытается обратиться к элементу, который ещё не существует, вы получите undefined ошибки в консоли. Проверяйте, нужен ли элемент до выполнения кода.

Чтобы убедиться, что всё работает, откройте Инструменты разработчика → Network и посмотрите, как загружаются файлы. Если они отмечены как «async» или «defer», вы увидите, что HTML разбирается без задержек.

В итоге, использование defer и async – простая, но мощная оптимизация. Подберите атрибут под каждую задачу, проверьте порядок и наслаждайтесь более быстрой страницей без лишних усилий.

От Данила Якушев, 8 сен, 2025 / JavaScript

Что такое JS в HTML: простое объяснение, тег script, defer/async и примеры

Понятно объясняю, что такое JS в HTML: как подключать скрипты, чем отличаются defer и async, где писать код, примеры, чек‑лист, FAQ и отладка в 2025.