Переносим подключение JS-скриптов в конец страницы — чтобы не блокировать отрисовку
Дата публикации: 24.06.2026

Переносим подключение JS-скриптов в конец страницы — чтобы не блокировать отрисовку

Хочу себе такие же кнопки
ccb9a536

Переносим подключение JS‑скриптов в конец страницы — чтобы не блокировать отрисовку

Что вы получите:

  • Поймёте, почему скрипты, размещённые в <head>, «заставляют» браузер ждать.
  • Научитесь правильно размещать теги <script> внини страницы, используя async, defer и атрибуты type="module".
  • Сможете измерить влияние изменения на Time‑to‑First‑Paint (TTFP) и First‑Contentful‑Paint (FCP) в реальном проекте на 1с‑Битрикс.

Почему скрипты блокируют отрисовку?

Позиция скрипта Что делает браузер Последствия для пользователя
В <head> без атрибутов Останавливает парсинг HTML, скачивает файл, исполняет его, затем продолжает разметку Пользователь видит пустой экран до тех пор, пока скрипт не загрузится
В конце <body> HTML уже полностью разобран, браузер может отрисовать страницу, а затем асинхронно загрузить скрипт Видимая часть страницы появляется сразу, а интерактивность подключится позже
С async Файл загружается параллельно, но исполняется сразу после загрузки, прерывая парсинг Возможны «прыжки» в разметке, если скрипт меняет DOM
С defer Файл загружается параллельно, исполняется после завершения парсинга, но перед DOMContentLoaded Наиболее безопасный способ для скриптов, которые требуют полного DOM

Аналогия: представьте, что браузер — это строитель, который читает чертеж (HTML) и сразу же, когда встречает «молоток» (тег <script>), останавливается, чтобы сначала собрать инструмент, а потом продолжить работу. Если молоток лежит в начале чертежа, работа откладывается надолго. Переместив молоток в конец, строитель успеет построить стену, а потом уже возьмёт инструмент, чтобы добавить детали.


Как правильно переносить скрипты в конец страницы

1. Базовый перенос без атрибутов

<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <title>Мой магазин</title>
    <link rel="stylesheet" href="/styles.css">
</head>
<body>
    <!-- контент страницы -->
    <header>…</header>
    <main>…</main>
    <footer>…</footer>

    <!-- Подключаем JS в самом конце -->
    <script src="/local/js/jquery.min.js"></script>
    <script src="/local/js/main.js"></script>
</body>
</html>

Почему это работает: к моменту выполнения скриптов HTML уже полностью построен, поэтому document.getElementById и прочие обращения к DOM находятся в «безопасной зоне».

2. Используем defer для скриптов в <head>

Если вы хотите оставить скрипты в <head> (например, чтобы они были видны в «View source»), добавьте атрибут defer:

<head>
    …
    <script src="/local/js/jquery.min.js" defer></script>
    <script src="/local/js/main.js" defer></script>
</head>

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

3. Когда стоит использовать async

async подходит только для скриптов, которые не зависят от DOM и не влияют на другие скрипты (например, аналитика, рекламные пиксели).

<script src="https://www.googletagmanager.com/gtag/js?id=UA-XXXXX-Y" async></script>

4. Модули ES6 (type="module")

Модули автоматически получают поведение defer. Если ваш проект уже использует ES‑модули, просто укажите тип:

<script type="module" src="/js/app.js"></script>

5. Особенности 1с‑Битрикс

  • /bitrix/js/main/core/core.js и /bitrix/js/main/core/core.css обычно подключаются в <head> через CJSCore::Init.
  • Чтобы перенести их, можно добавить в шаблон footer.php вызов CJSCore::Init после основной разметки, либо использовать CJSCore::AddInitScript с атрибутом defer.
<?php
// В footer.php, сразу перед </body>
CJSCore::Init(array('jquery', 'fx'));
?>
<script defer src="/bitrix/js/main/core/core.js"></script>

Важно: проверяйте, что в шаблоне нет вызовов CJSCore::Init в <head> без defer. Иначе браузер всё равно будет ждать.


Как измерить эффект?

Метрика Как измерить Что искать
TTFP (Time‑to‑First‑Paint) Chrome DevTools → Performance → Paint Timing Сокращение на 200‑500 мс после переноса
FCP (First‑Contentful‑Paint) Chrome DevTools → Lighthouse Увеличение балла «Performance»
Total Blocking Time (TBT) Chrome DevTools → Lighthouse Снижение TBT → меньше «залипания» UI
Largest Contentful Paint (LCP) Chrome DevTools → Performance При правильном переносе LCP часто падает ниже 2,5 с

Пример сравнения:

  • До переноса: TTFP = 1.8 с, FCP = 2.3 с.
  • После переноса: TTFP = 0.9 с, FCP = 1.2 с.

Частые ошибки и как их избежать

Ошибка Почему происходит Как исправить
Скрипт, который меняет DOM, оставлен в <head> без defer Браузер останавливается, пока скрипт не выполнится, а DOM ещё не готов Добавьте defer или перенесите в конец
async у скрипта, который зависит от jQuery jQuery может ещё не загрузиться, а ваш код уже выполнится Замените async на defer или укажите правильный порядок загрузки
Дублирование подключений При переносе в footer.php забыли удалить прежний вызов в header.php Удалите один из вызовов, оставив только один
Неправильный путь к файлу после переноса Путь рассчитывается относительно текущего URL, а не корня сайта Используйте абсолютный путь (/local/js/...) или <?=SITE_TEMPLATE_PATH?> в шаблоне Битрикса

Мини‑чек‑лист перед публикацией

  1. Все <script> без async находятся в конце <body>.
  2. Для скриптов в <head> установлен defer.
  3. Нет конфликтов порядка (проверьте консоль на ошибки ReferenceError).
  4. Тест в Chrome DevTools → Lighthouse: балл «Performance» вырос минимум на 5 пунктов.
  5. Кеш‑плюс: после изменений очистите кеш браузера и кеш Битрикса (/bitrix/cache/).

Практика для закрепления

  1. Анализ текущего шаблона

    • Откройте любой шаблон вашего сайта на Битриксе (например, header.php и footer.php).
    • Выпишите все теги <script> и укажите, где они находятся и какие атрибуты имеют.
  2. Перенос с defer

    • Перенесите один из скриптов из <head> в конец <body> без изменения кода.
    • Проверьте, не появилось ли ошибок в консоли.
  3. Сравнительный тест

    • С помощью Chrome DevTools измерьте TTFP и FCP до и после переноса.
    • Запишите разницу в миллисекундах и сделайте вывод, насколько ускорилась загрузка.
  4. Эксперимент с async

    • Добавьте небольшую аналитическую библиотеку (например, https://www.googletagmanager.com/gtag/js?id=UA-XXXXX-Y) с атрибутом async.
    • Убедитесь, что её загрузка не блокирует основной контент.
  5. Оптимизация под Битрикс

    • В шаблоне footer.php добавьте вызов CJSCore::Init(array('jquery','fx')); после основной разметки.
    • Проверьте, что файлы jquery.min.js и fx.js действительно загружаются в конце страницы (проверьте порядок в Network‑таблице).

Подытожим

  • Блокировка отрисовки происходит из‑за синхронных скриптов в <head>.
  • Перенос в конец или использование defer решает проблему, позволяя браузеру отрисовать страницу сразу.
  • async подходит только для независимых скриптов, а модули автоматически получают defer.
  • В проектах на 1с‑Битрикс особое внимание требуется к CJSCore::Init и к правильному порядку загрузки ядра.

Применив эти простые правила, вы ускорите старт вашего сайта, улучшите пользовательский опыт и получите более высокие показатели в инструментах аудита. Удачной оптимизации!


Если вам нужен надёжный VDS‑хостинг для тестов и продакшена, обратите внимание на предложения VDSina VDSina.


CamZamZam - онлайн фото с вебкамеры с эффектами
Cartoon Network: игры с персонажами
Чат рулетка в 2026: будущие функции
Эксперт по доменным стратегическим решениям
Хостинг для e-commerce проектов
Как играть в слоты
Как настроить CDN для сайта на хостинге Host.bg
Как настроить SSL-сертификат для сайта на Host.bg
Как оптимизировать производительность сайта с хостингом Host.bg
Как выбрать правильный хостинг для вашего сайта
Какие бывают ЛОР болезни у детей
Кассовые терминалы с оплатой картами
LOL куклы витрина детская
Лучшие видеорегистраторы для водителей
Онлайн QR-код сканер
Онлайн-связь
Оптимизация производительности баз данных на хостинге Host.bg
Основы настройки веб-хостинга: что вам нужно знать
Партнёрская программа без блога: как получать трафик из Telegram
Профессиональные хитрости для пользователей хостинга Host.bg
Регистрация ИП в Москве для иностранных граждан
Сравнение хостинга Host.bg с другими провайдерами
Субтитры — нет, уши — включены: погружение в английский за 5 минут
Сумки с бусинами
Техника для строительства загородных трасс
ТОП-10 VPS для разработчика: рейтинг серверов под рабочие задачи
WordPress блог для бизнеса
рейтинг хостингов 2026 Быстрые VDS серверы