Yandex Metrika
sanches.free

Ускорение Битрикс: отключение лишнего 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 дней гарантии