Ускорение Битрикс: отключение лишнего JS ядра и стилей
Материал по мотивам заметки Естрина об отключении ядра: на типовой витрине не всегда нужен полный набор kernel_main.js и сопутствующих стилей — лишние килобайты ухудшают метрики. Ниже — осмысленные шаги и крайний вариант через буфер, плюс на что смотреть в консоли. Долгосрочная альтернатива без BX — ванильный JavaScript в шаблонах.
Сначала безопасные настройки
В компонентах, где параметр поддерживается, отключайте автоподключение JS ядра внутри компонента:
'DISABLE_INIT_JS_IN_COMPONENT' => 'Y',
В настройках главного модуля (вкладка «Авторизация») снимите лишние галочки продления сессии и уведомления об окончании сессии, если бизнесу это не нужно — меньше фоновой активности на каждой странице. После изменений сбросьте кеш: список подключаемых скриптов в компонентах тоже кешируется.
Счётчик монитора производительности
Чтобы не подключался bx_stat, в /bitrix/.settings.php можно отключить внутренний счётчик (монитор перестанет собирать статистику теми же запросами):
'analytics_counter' => [
'value' => [
'enabled' => false,
],
],
Диагностика: кто дергает CJSCore::Init
Временно, только на копии сайта, в /bitrix/modules/main/tools.php внутри логики CJSCore::Init можно залогировать расширения и стек — увидеть, какой код тянет ядро, и сразу убрать вставку после проверки:
@define('LOG_FILENAME', $_SERVER['DOCUMENT_ROOT'] . '/jscore.txt');
AddMessage2Log(
print_r($arExt, true) . "\n\n" . print_r(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS), true)
);
Крайний вариант: вырезать теги из HTML
Автор предупреждает: цепочка обработчиков OnEndBufferContent, которые вырезают kernel_main.css и родственные link, — «тяжёлая артиллерия». На публичной части для неавторизованных можно попробовать убрать только CSS по заранее согласованным шаблонам; для JS-паттернов массив регулярных выражений в примечании изначально пуст — без явных паттернов preg_replace ничего не удалит. Оставляем идею как диагностический эксперимент, а не как обязательный стандарт:
AddEventHandler('main', 'OnEndBufferContent', 'deleteKernelJs', 1);
AddEventHandler('main', 'OnEndBufferContent', 'deleteKernelCss', 2);
function deleteKernelJs(&$content)
{
global $USER, $APPLICATION;
if ((is_object($USER) && $USER->IsAuthorized()) || strpos($APPLICATION->GetCurDir(), '/bitrix/') !== false) {
return;
}
if ($APPLICATION->GetProperty('save_kernel') == 'Y') {
return;
}
$arPatternsToRemove = [];
$content = preg_replace($arPatternsToRemove, '', $content);
$content = preg_replace("/\n{2,}/", "\n\n", $content);
}
function deleteKernelCss(&$content)
{
global $USER, $APPLICATION;
if ((is_object($USER) && $USER->IsAuthorized()) || strpos($APPLICATION->GetCurDir(), '/bitrix/') !== false) {
return;
}
if ($APPLICATION->GetProperty('save_kernel') == 'Y') {
return;
}
$arPatternsToRemove = [
'/<link.+?href=".+?kernel_main\/kernel_main\.css\?\d+"[^>]+>/',
'/<link.+?href=".+?bitrix\/js\/main\/core\/css\/core[^"]+"[^>]+>/',
'/<link.+?href=".+?bitrix\/panel\/main\/popup\.min\.css\?\d+"[^>]+>/',
'/<link.+?href=".+?bitrix\/templates\/[\w\d_-]+\/styles\.css[^"]+"[^>]+>/',
'/<link.+?href=".+?bitrix\/templates\/[\w\d_-]+\/template_styles\.css[^"]+"[^>]+>/',
];
$content = preg_replace($arPatternsToRemove, '', $content);
$content = preg_replace("/\n{2,}/", "\n\n", $content);
}
Для страниц, где ядро всё же нужно, можно выставить свойство страницы save_kernel = Y, как в примере.
После отключений
Смотрите консоль: ошибки вида BX is not defined показывают, где фронт всё ещё ждёт библиотеку. Упростить миграцию с BX на jQuery помогают замены в духе BX(id) → $('#' + id).get(0), BX.ready → $().ready, делегирование кликов и простые обёртки над AJAX — полный список в исходной статье; тяжёлые сценарии иногда дешевле переписать под чистый JS.
Не хотите копаться сами?
Починю за 1-3 дня. Без предоплаты — оплата по результату.
15+ лет опыта с 1С-Битрикс · Без предоплаты · 7 дней гарантии