Ми часто беремо проєкти, які розвивалися роками, і виявляємо хаос із CSS і JS. Типовий випадок: на сторінці каталогу 60-120 запитів до стилів і скриптів. Навіть із HTTP/2 кожен новий запит витрачає час на DNS, TCP та TLS. На мобільних мережах це вбиває продуктивність. Наш досвід показує: об'єднання файлів може скоротити кількість запитів у 10-20 разів і прискорити завантаження на 40-70%.
Чому об'єднання CSS і JS прискорює сайт?
Браузер обмежує кількість одночасних з'єднань до одного домену (зазвичай 6). Якщо файлів багато, вони завантажуються послідовно. Об'єднання в один файл зменшує кількість запитів, що особливо помітно на мобільних мережах. Також знижується overhead на DNS, TCP і TLS для кожного запиту. Детальніше про HTTP/2.
Вбудований механізм об'єднання Бітрікс
Бітрікс пропонує два підходи: через API управління активами та через компонент bitrix:main.include. При включеній мініфікації (Налаштування → Продуктивність → Стиснення) всі зареєстровані CSS збираються у /bitrix/cache/css/<hash>.css, JS — у /bitrix/cache/js/<hash>.js. Однак є нюанс: об'єднуються лише файли, зареєстровані до ShowHead(). Прямі <link> у шаблонах ігноруються.
Які проблеми вирішуємо?
Порядок підключення. При об'єднанні каскад CSS часто ламається. Наприклад, скидання стилів має бути першим, а компонентні стилі — пізніше. Рішення — використовувати \Bitrix\Main\Page\Asset::addCss() із явним зазначенням залежності або розбивати на два бандли: базовий (grid, typography) та динамічний (віджети).
Inline-стилі та скрипти. Багато компонентів (наприклад, bitrix:news.list) видають рендер прямо в HTML. Це не об'єднується. Для кастомних рішень замінюємо echo '<style>' на $this->addExternalCSS() — тоді файл потрапляє в загальний бандл і кешується.
Дублі та конфлікти версій. На одному проєкті ми знайшли 12 однакових normalize.css і три версії jQuery (1.9, 2.1, 3.6) на одній сторінці. Аудит через перехоплення AddCSSLink() та логування допоміг уніфікувати бібліотеки. Tree shaking та code splitting — ваш наступний крок.
Як ми це робимо: Vite та Webpack
Для сучасних проєктів вбудовані засоби Бітрікс недостатні. Ми використовуємо Vite або Webpack.
Приклад структури з Vite:
local/templates/mytemplate/
├── src/
│ ├── css/
│ │ ├── main.scss
│ │ └── components/
│ ├── js/
│ │ ├── app.js
│ │ └── pages/
├── dist/ ← сюди збирає Vite
│ ├── app.[hash].css
│ └── app.[hash].js
├── header.php ← підключає dist/
└── vite.config.js
У header.php підключаємо бандли через CMain::AddCSSLink() — так вони кешуються Бітрікс. Vite забезпечує HMR під час розробки, tree shaking для продакшну.
Чому Vite кращий за вбудований механізм?
Vite підтримує SCSS, TypeScript, автоматичний code splitting. Вбудоване об'єднання Бітрікс цього не вміє. Ми на практиці домагаємося зменшення ваги бандлу на 30-50% за рахунок видалення мертвого коду. Порівняння:
| Характеристика | Вбудований механізм | Vite/Webpack |
|---|---|---|
| Підтримка SCSS | Ні | Так |
| Code splitting | Ні | Так |
| Tree shaking | Ні | Так |
| HMR | Ні | Так |
| Налаштування | Проста | Потребує конфігу |
Кейс: портал із трьома командами розробників
Один із наших клієнтів — B2B-портал, 5 років розробки, три команди змінилися. На сторінці каталогу: 47 CSS-запитів (сумарно 890 KB без стиснення), 68 JS-запитів (сумарно 1,4 MB). Аудит, проведений нами, показав: 12 CSS дублів, 8 JS-бібліотек у кількох версіях.
Що зробили:
- Аудит всіх підключень через перехоплення
CMain::AddCSSLink()таAddHeadScript()з логуванням. - Уніфікація бібліотек: jQuery єдина версія, видалення дублів.
- Перенесення всіх прямих
<link>в API Бітрікс. - Налаштування збірки через Vite для нового коду, упаковка legacy в єдиний бандл.
- Code splitting: критичний бандл + 4 сторінкових бандли.
Результат:
- 47 CSS-запитів → 3.
- 68 JS-запитів → 5.
- Сумарна вага CSS+JS (після gzip) знизилася з 850 KB до 210 KB за рахунок видалення дублів та tree shaking.
- Швидкість завантаження сторінки впала з 4.2 с до 1.1 с (за Lighthouse).
Процес роботи:
- Аналітика — збираємо логи всіх підключень, виявляємо дублі, конфлікти, невикористаний код.
- Проектування — визначаємо архітектуру бандлів: критичний, сторінкові, відкладені.
- Реалізація — переносимо підключення на API, налаштовуємо збірку (Vite/Webpack), пишемо конфіги.
- Тестування — перевіряємо кожну сторінку на коректність відображення та функціональність JS.
- Деплой — заливаємо на бойовий сервер, перевіряємо кешування.
Теговане кешування Бітрікс скидає кеш при зміні даних. При об'єднанні файлів важливо, щоб кеш CSS/JS інвалідувався коректно. Налаштовуємо через $arParams["CACHE_TAGS"].
Що входить у роботу:
- Повний аудит поточних підключень із звітом.
- Уніфікація бібліотек та видалення дублів.
- Налаштування збірника (Vite або Webpack) під ваш шаблон.
- Інтеграція з тегованим кешуванням Бітрікс.
- Документація про процес збірки та підключення.
- Навчання команди роботі з новою архітектурою.
- Пост-релізна підтримка тиждень.
Строки та вартість
| Тип проєкту | Зміст робіт | Строк |
|---|---|---|
| Простий сайт (1 шаблон, <30 компонентів) | Переведення підключень на API, включення мініфікації | 1–2 дні |
| Середній проєкт (кастомний фронтенд, кілька шаблонів) | Аудит + уніфікація бібліотек + налаштування збірки | 3–7 днів |
| Великий портал (безліч команд, legacy код) | Повний аудит, рефакторинг підключень, налаштування Webpack/Vite | 7–20 днів |
Вартість розраховується індивідуально після аудиту. Замовте консультацію — ми запропонуємо оптимальне рішення. Гарантуємо результат: прискорення завантаження щонайменше в 2 рази, підтверджене тестами. Зв'яжіться з нами для оцінки вашого проєкту.
Навантажувальне тестування після об'єднання обов'язкове — у рідкісних випадках порядок завантаження скриптів важливий, і його порушення призводить до JS-помилок на конкретних сторінках. Наш досвід дозволяє передбачити такі нюанси та уникнути їх на етапі проектування. Отримайте консультацію та план оптимізації.







