@ermolaev_nikita

Попытки ускорить загрузку страниц в BX, что скажите?

Всем привет! В попытках добиться максимальной скорости загрузки сайта перебираю различные практики и пытаюсь их применить в своих проектах.
Сейчас мой интерес пал на отложенную загрузки скриптов, которую можно заметить на сайте Ламоды, вообще, там множество интересных решений, который позволяют загружать страницу с невероятной скоростью. Например картинки обжимаются в webp. Но сейчас меня интересуют отложенная загрузка скриптов. По сути реализовать этот механизм не составит никаких трудов, достаточно использовать пару строк JS:

var script = document.createElement('script');
script.src = src;
document.body.appendChild(script);


Если поискать различные антипримеры загрузки страниц, то можно привести в пример сайт Эльдорада.

В попытках реализовать что-то подобное как у ламоды, я попытался набросать следующий код, и хотелось бы узнать ваше мнение

// Вешаем обработчик события и получаем код страницы
$eventManager->addEventHandler("main", "OnEndBufferContent", "deferredLoading");

// Наш обработчик
function deferredLoading(&$content){
    // Паттерн который будет отделять названия файла
    $getPattern = '/src=".*.js.*"/';

    // Список паттернов по которым будем искать нужные нам скрипты, в данном примере ищем core_db.js и loadext.js
    $arScripts = [
        ["del" => '/<script.+?src=".+?bitrix\/js\/main\/core\/core_db[^"]+"><\/script\>/'],
        ["del" => '/<script.+?src=".+?bitrix\/js\/main\/loadext\/loadext[^"]+"><\/script\>/']
    ];
    // Ищем и находим
    foreach ($arScripts as &$script){
        preg_match($script["del"], $content, $res);
        if($res[0]) {
            preg_match($getPattern, $res[0], $res);
            $res = str_replace("src=", "", $res);
            $content = preg_replace($script["del"], "", $content);
            $script["script"] = $res[0];
        }
    }
    unset($script);

    // Добавляем найденные скрипты
    $strScr = '';
    for($i = 0; $i < count($arScripts); $i++) {
        $strScr .= ($i < count($arScripts)-1) ? "".$arScripts[$i]['script'].",\n " : "".$arScripts[$i]['script']."";
    }
    
    // JS Скрипт, который будет подключать все это дело 
    $string = "
    <script>
    function fastLoad() {
        var scripts = [
           $strScr
        ];

        load = function (src) {
            var script = document.createElement('script');
            script.src = src;
            document.body.appendChild(script);
        };
        for (var i = 0; i < scripts.length; i++) {
            load(scripts[i]);
        }
    }
    fastLoad();
    </script>";
    // Ставим в нужном месте в шаблоне тег, вместо которого вставится наш JS код
    $content = str_replace("<!-- add_js -->",$string, $content);
}


Ну вот и все, таким образом можно перетащить все Битриксовские скрипты, и не только их, в самый низ, позволив сначала прогрузиться фотографиям в каталоге, а уж затем им.
Осталось только понять какие скрипты стоит переносить, а какие - нет.
  • Вопрос задан
  • 493 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы