Переносим подключение JS-скриптов в конец страницы — чтобы не блокировать отрисовку
Хочу себе такие же кнопкиПереносим подключение 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?> в шаблоне Битрикса |
Мини‑чек‑лист перед публикацией
- Все
<script>безasyncнаходятся в конце<body>. - Для скриптов в
<head>установленdefer. - Нет конфликтов порядка (проверьте консоль на ошибки
ReferenceError). - Тест в Chrome DevTools → Lighthouse: балл «Performance» вырос минимум на 5 пунктов.
- Кеш‑плюс: после изменений очистите кеш браузера и кеш Битрикса (
/bitrix/cache/).
Практика для закрепления
-
Анализ текущего шаблона
- Откройте любой шаблон вашего сайта на Битриксе (например,
header.phpиfooter.php). - Выпишите все теги
<script>и укажите, где они находятся и какие атрибуты имеют.
- Откройте любой шаблон вашего сайта на Битриксе (например,
-
Перенос с
defer- Перенесите один из скриптов из
<head>в конец<body>без изменения кода. - Проверьте, не появилось ли ошибок в консоли.
- Перенесите один из скриптов из
-
Сравнительный тест
- С помощью Chrome DevTools измерьте TTFP и FCP до и после переноса.
- Запишите разницу в миллисекундах и сделайте вывод, насколько ускорилась загрузка.
-
Эксперимент с
async- Добавьте небольшую аналитическую библиотеку (например,
https://www.googletagmanager.com/gtag/js?id=UA-XXXXX-Y) с атрибутомasync. - Убедитесь, что её загрузка не блокирует основной контент.
- Добавьте небольшую аналитическую библиотеку (например,
-
Оптимизация под Битрикс
- В шаблоне
footer.phpдобавьте вызовCJSCore::Init(array('jquery','fx'));после основной разметки. - Проверьте, что файлы
jquery.min.jsиfx.jsдействительно загружаются в конце страницы (проверьте порядок в Network‑таблице).
- В шаблоне
Подытожим
- Блокировка отрисовки происходит из‑за синхронных скриптов в
<head>. - Перенос в конец или использование
deferрешает проблему, позволяя браузеру отрисовать страницу сразу. asyncподходит только для независимых скриптов, а модули автоматически получаютdefer.- В проектах на 1с‑Битрикс особое внимание требуется к
CJSCore::Initи к правильному порядку загрузки ядра.
Применив эти простые правила, вы ускорите старт вашего сайта, улучшите пользовательский опыт и получите более высокие показатели в инструментах аудита. Удачной оптимизации!
Если вам нужен надёжный VDS‑хостинг для тестов и продакшена, обратите внимание на предложения VDSina VDSina.
Английский видеочат для путешествий
CamZamZam - онлайн фото с вебкамеры с эффектами
Чат рулетка 2026: Интерактивные элементы
Чат-рулетка: случайный собеседник в одно нажатие
Чат рулетка в 2026: будущие функции
Интерьер с использованием текстиля
Как настроить бэкапы для вашего сайта на хостинге Host.bg
Как настроить SSL-сертификат для сайта на Host.bg
Как обновить PHP на хостинге Host.bg
Как решить проблемы с загрузкой сайта на Host.bg
Какие бывают ЛОР болезни у детей
Калькулятор зарплаты SEO-оптимизатора
Кассовые терминалы с оплатой картами
Монетизация через платные услуги
Мск: ИП или ООО — лучший старт для бизнеса?
Общение в интернете без риска
Общение вживую через экран
Онлайн-связь
Оптимизация производительности баз данных на хостинге Host.bg
Ошибки при настройке хостинга и их решения
Проблемы с доменами и их решения на хостинге Host.bg
Сколько стоит биткоин
Сравнение ценовых диапазонов хостинга Host.bg
Сумки с бусинами
Техника для строительства загородных трасс
Трубная продукция для трубопроводных конструкций
Узбекские фильмы фэнтези
Видео рулетка 18+
Видеочат с случайным собеседником онлайн
Видеообщения по всему миру