Уроки

Группировка JavaScript файлов

Чтобы загрузить файл, браузер тратит время на служебные операции: установка соединения, отправка запроса, получение ответа, закрытие соединения. Это время постоянно и не зависит от скорости интернет соединения. Например, при очень быстром интернет соединении на загрузку содержимого файла уйдёт  1 миллисекунда, а на служебные операции до 100. Время выполнения служебных операций зависит от сетевой задержки — пинга, а не от скорости интернет соединения.

Чтобы ускорить сайт, программисты группируют множество маленьких JavaScript файлов в один большой. Существуют плагины, автоматически соединяющие файлы.

Для одной страницы, приемлемо использование не более 3 JavaScript файлов.

Почему включение группировки может сломать сайт

Причиной может послужить — изменение порядка подключения JavaScript файлов. Например, ваш скрипт зависит от jQuery. Но после включения группировки порядок файлов поменялся, и в итоговом объединённом файле сначала идёт ваш скрипт, а уже потом код библиотеки jQuery. Такую ситуацию можно легко определить, так как в консоли браузера появляются ошибки.

Почему не все файлы группируются

Самая частая причина — это подключение JavaScript файлов через HTML код, вместо использования API метода вашей системы управления сайтом.

Используют такой код:

<script src="/js/my_script.js"></script>

вместо такого:

// Для Битрикс
Asset::getInstance()->addJs(SITE_TEMPLATE_PATH . "/js/my_script.js");
// Для WordPress
wp_enqueue_script( 'my-script-handle', get_template_directory_uri() . '/js/my_script.js', array('tmp'), '1.0', true );

В каждой системе есть несколько способов подключать JavaScript код. Нужно использовать тот, что соответствует ситуации.

Ниже пример того, как группировка ускоряет загрузку страницы:

<?php
if(isset($_GET['big'])) {
    // Выводим сгруппированный, большой файл
    header('Content-Type: text/js');
    for($i = 0;$i < 100;$i++)
    echo file_get_contents('10-kb-js.js');
    die;
}
$mode = $_GET['mode'] ?? '';
?><!DOCTYPE html>
<html>
    <head>
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <style>
            .btn {
                color: #000;
                text-decoration: none;
                padding: 5px 10px;
                border: 1px solid #000;
                border-radius: 5px;
            }
            .btn:hover {
                background-color: #ddd;
            }
            .btn.active {
                background-color: #000;
                color: #fff;
            }

        </style>
        <script>
            window.addEventListener("load", (event) => {
                document.querySelector('#page-load').innerHTML = 'Страница загрузилась (событие window.onload) за <b>'+(performance.now()/1000)+'с</b>.';
            });
        </script>
    </head>
    <body style="font-family: sans-serif;">
        Режим: <a class="btn <?=$mode === '' ? 'active' : ''?>" href="./js_count.php">100 файлов по 10 КБ</a> <a class="btn <?=$mode === 'big' ? 'active' : ''?>" href="./js_count.php?mode=big">1 файл размером 1 МБ</a>
        <p id="page-load">Тут отобразится время загрузки страницы (вызова события window.onload)</p>
<?php
if($mode === 'big') {?>
        <script src="./js_count.php?big=1"></script>
<?php
} else {
    for($i = 0; $i < 100;++$i) { ?>
        <script src="./10-kb-js.js?t=<?=microtime(true).'.'.$i?>"/></script>
    <?php }
}?>
    </body>
</html>
<!DOCTYPE html>
<html>
    <head>
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <style>
            .btn {
                color: #000;
                text-decoration: none;
                padding: 5px 10px;
                border: 1px solid #000;
                border-radius: 5px;
            }
            .btn:hover {
                background-color: #ddd;
            }
            .btn.active {
                background-color: #000;
                color: #fff;
            }

        </style>
        <script>
            window.addEventListener("load", (event) => {
                document.querySelector('#page-load').innerHTML = 'Страница загрузилась (событие window.onload) за <b>'+(performance.now()/1000)+'с</b>.';
            });
        </script>
    </head>
    <body style="font-family: sans-serif;">
        Режим: <a class="btn active" href="./js_count.php">100 файлов по 10 КБ</a> <a class="btn " href="./js_count.php?mode=big">1 файл размером 1 МБ</a>
        <p id="page-load">Тут отобразится время загрузки страницы (вызова события window.onload)</p>
        <script src="./10-kb-js.js?t=1770055030.8092.0"/></script>
            <script src="./10-kb-js.js?t=1770055030.8092.1"/></script>
            <script src="./10-kb-js.js?t=1770055030.8092.2"/></script>
            <script src="./10-kb-js.js?t=1770055030.8092.3"/></script>
            <script src="./10-kb-js.js?t=1770055030.8092.4"/></script>
            <script src="./10-kb-js.js?t=1770055030.8092.5"/></script>
            <script src="./10-kb-js.js?t=1770055030.8092.6"/></script>
            <script src="./10-kb-js.js?t=1770055030.8092.7"/></script>
            <script src="./10-kb-js.js?t=1770055030.8092.8"/></script>
            <script src="./10-kb-js.js?t=1770055030.8092.9"/></script>
            <script src="./10-kb-js.js?t=1770055030.8092.10"/></script>
            <script src="./10-kb-js.js?t=1770055030.8092.11"/></script>
            <script src="./10-kb-js.js?t=1770055030.8092.12"/></script>
            <script src="./10-kb-js.js?t=1770055030.8092.13"/></script>
            <script src="./10-kb-js.js?t=1770055030.8092.14"/></script>
            <script src="./10-kb-js.js?t=1770055030.8092.15"/></script>
            <script src="./10-kb-js.js?t=1770055030.8092.16"/></script>
            <script src="./10-kb-js.js?t=1770055030.8092.17"/></script>
            <script src="./10-kb-js.js?t=1770055030.8092.18"/></script>
            <script src="./10-kb-js.js?t=1770055030.8092.19"/></script>
            <script src="./10-kb-js.js?t=1770055030.8092.20"/></script>
            <script src="./10-kb-js.js?t=1770055030.8092.21"/></script>
            <script src="./10-kb-js.js?t=1770055030.8092.22"/></script>
            <script src="./10-kb-js.js?t=1770055030.8092.23"/></script>
            <script src="./10-kb-js.js?t=1770055030.8092.24"/></script>
            <script src="./10-kb-js.js?t=1770055030.8092.25"/></script>
            <script src="./10-kb-js.js?t=1770055030.8092.26"/></script>
            <script src="./10-kb-js.js?t=1770055030.8092.27"/></script>
            <script src="./10-kb-js.js?t=1770055030.8092.28"/></script>
            <script src="./10-kb-js.js?t=1770055030.8092.29"/></script>
            <script src="./10-kb-js.js?t=1770055030.8092.30"/></script>
            <script src="./10-kb-js.js?t=1770055030.8092.31"/></script>
            <script src="./10-kb-js.js?t=1770055030.8092.32"/></script>
            <script src="./10-kb-js.js?t=1770055030.8092.33"/></script>
            <script src="./10-kb-js.js?t=1770055030.8092.34"/></script>
            <script src="./10-kb-js.js?t=1770055030.8092.35"/></script>
            <script src="./10-kb-js.js?t=1770055030.8092.36"/></script>
            <script src="./10-kb-js.js?t=1770055030.8092.37"/></script>
            <script src="./10-kb-js.js?t=1770055030.8092.38"/></script>
            <script src="./10-kb-js.js?t=1770055030.8092.39"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.40"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.41"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.42"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.43"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.44"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.45"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.46"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.47"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.48"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.49"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.50"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.51"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.52"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.53"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.54"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.55"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.56"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.57"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.58"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.59"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.60"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.61"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.62"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.63"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.64"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.65"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.66"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.67"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.68"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.69"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.70"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.71"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.72"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.73"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.74"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.75"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.76"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.77"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.78"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.79"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.80"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.81"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.82"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.83"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.84"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.85"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.86"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.87"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.88"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.89"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.90"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.91"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.92"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.93"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.94"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.95"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.96"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.97"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.98"/></script>
            <script src="./10-kb-js.js?t=1770055030.8093.99"/></script>
        </body>
</html>

ПРО подписка для работы с сервисом

Промо
Для подготовки коммерческого предложения.
190 ₽
50 страниц на 10 дней
  • 1 страница даёт 1 запуск инструмента Проверка страницы.
  • Покупается для определённого сайта
  • Ограничения на остальные инструменты остаются теми же
ПРО подписка
Для регулярной работы над сайтом или группой сайтов.
1 580 ₽
3500 страниц в неделю. Срок подписки — 1 месяц.
Кошелёк
Отдельный баланс страниц, дополняющий баланс ПРО подписки.
190 ₽
Количество страниц
  • Требуется активная ПРО подписка для использования баланса кошелька
Мы используем cookie. Продолжая пользоваться сайтом, вы соглашаетесь на обработку персональных данных в соответствии с политикой конфиденциальности. Соглашаюсь