Переносим подключение 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 - онлайн фото с вебкамеры с эффектами
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 блог для бизнеса