Оптимізація CSS: critical CSS та purge невикористаних стилів
Повільне завантаження сторінки часто пов'язане з надлишковим CSS. Render-blocking CSS затримує перший контентний рендер (FCP) і збільшує Largest Contentful Paint (LCP). Bootstrap з коробки важить 140 кБ, але після видалення невикористаних класів залишається 5–15 кБ (зниження на 96%). Tailwind у development-режимі — 3.5 МБ; після purge — 5–50 кБ. Ми маємо 7+ років досвіду в оптимізації CSS та реалізували 50+ проєктів. На ринку з 2018 року (7+ років). Ми налаштовуємо critical CSS та purge для будь-якого стеку: від Laravel до Next.js, досягаючи FCP < 1 секунди. Результат — проходять Core Web Vitals без компромісів. За 2–3 дні впроваджуємо critical CSS та purge під ключ.
Чому оптимізація CSS критична для Core Web Vitals?
LCP (Largest Contentful Paint) — час рендерингу найбільшого елемента на екрані. Якщо CSS завантажується синхронно (render-blocking), браузер не малює контент до повного завантаження стилів. Inline critical CSS усуває цю затримку: стилі для above-the-fold контенту вставляються прямо в <head>, решта завантажується асинхронно. Critical CSS у поєднанні з purge прискорює LCP у 2-3 рази порівняно з традиційним завантаженням CSS.
Приклад: на сайті з Bootstrap у critical CSS потрапляють лише стилі для шапки, героя та кнопок — близько 5 кБ замість 140 кБ. LCP падає з 4 до 1.5 секунд (покращення на 62%). FCP знижується з 2.5 до 1.2 секунд.
Налаштування purge CSS
Purge видаляє класи, не знайдені в шаблонах. У Tailwind 3+ purge вбудовано через конфіг content:
// tailwind.config.ts import type { Config } from 'tailwindcss'; export default { content: [ './resources/views/**/*.blade.php', './resources/js/**/*.{ts,tsx}', './resources/js/**/*.json', // якщо класи генеруються динамічно ], theme: { extend: {} }, plugins: [], } satisfies Config; Динамічні класи (конкатенація рядків) — purge не знайде їх:
// Погано — purge не побачить const color = 'red'; <div className={`text-${color}-500`} /> // Добре — повні імена класів const colorMap = { red: 'text-red-500', blue: 'text-blue-500', }; <div className={colorMap[color]} /> Safelist: призначення та налаштування
Safelist — білий список класів, які purge не повинен видаляти. Іноді класи додаються через JavaScript, наприклад, Bootstrap модалки: modal-open, show. Якщо вони не зустрічаються в HTML-шаблонах, purge видалить їх — зламається функціональність. Налаштовуємо safelist у конфігу PurgeCSS:
// postcss.config.js import purgecss from '@fullhuman/postcss-purgecss'; export default { plugins: [ purgecss({ content: [ './resources/views/**/*.blade.php', './resources/js/**/*.tsx', './public/**/*.html', ], safelist: { standard: ['modal-open', 'show', 'active', 'fade'], deep: [/^modal/, /^alert/, /^toast/], greedy: [/swiper/], }, defaultExtractor: content => content.match(/[\w-/:]+(?<!:)/g) || [], }), ], }; Покрокове налаштування purge CSS
- Аудит поточного CSS. Використовуємо Coverage в DevTools, аналіз бандлів, виявлення render-blocking.
- Конфігурація purge. Налаштовуємо PurgeCSS або Tailwind JIT, вказуємо шляхи до шаблонів.
- Створення safelist. Додаємо класи, що використовуються динамічно (модалки, алерти, анімації).
- Тестування. Перевіряємо, що нічого не зламалося, візуальний регрес.
- Деплой. Інтегруємо purge у збірку (Vite, Webpack, Laravel Mix) і розгортаємо на production.
Вибір стратегії: runtime CSS vs статичний CSS
CSS-in-JS (styled-components, Emotion) генерують стилі в runtime — додаткове навантаження на JS. Для production переважніший статичний CSS. Tailwind JIT працює в 10 разів швидше за попередні версії PurgeCSS, а PurgeCSS робить CSS-файл у 10-20 разів меншим.
| Параметр | CSS-in-JS | Static CSS (Tailwind, CSS Modules) |
|---|---|---|
| Runtime overhead | Так | Ні |
| Розмір бандлу | +50–150 кБ (runtime) | 0 кБ |
| Tree-shaking | Складний | Простий |
| Підтримка SSR | Вимагає налаштування | З коробки |
| CSS Containment | Відсутня | Можливість використання |
Статичний CSS кращий для Core Web Vitals: він не блокує рендеринг (після critical inline) і менше навантажує CPU. Для динамічного контенту можна використовувати content-visibility: auto, а також CSS containment (contain: layout style paint) для ізоляції компонентів та покращення продуктивності ререндеру.
Для Vite critical CSS налаштовується через critters:
// vite.config.ts import { defineConfig } from 'vite'; import { critters } from 'critters'; export default defineConfig({ plugins: [ critters({ preload: 'media', pruneSource: true, logLevel: 'silent', }) ] }); У Laravel critical CSS вставляється вручну:
<style>{!! file_get_contents(public_path('css/critical.css')) !!}</style> <link rel="preload" href="{{ mix('css/app.css') }}" as="style" onload="this.onload=null;this.rel='stylesheet'"> <noscript> <link rel="stylesheet" href="{{ mix('css/app.css') }}"> </noscript> Мініфікація — виконується LightningCSS у Vite або cssnano. Попередня обробка за допомогою LightningCSS використовує modern CSS features (nesting, layers) та конвертує їх у поліфіли для старих браузерів. На виході: CSS bundle < 20 кБ, покриття > 80%.
Порівняння метрик до та після покращення
| Метрика | До оптимізації | Після |
|---|---|---|
| Розмір CSS (Bootstrap) | 140 кБ | 5 кБ |
| LCP | 4.0 с | 1.5 с |
| FCP | 2.5 с | 1.2 с |
| TTFB | 0.8 с | 0.6 с (без змін) |
Типові помилки при оптимізації CSS
- Ігнорування динамічних класів — purge видаляє їх, ламаючи інтерфейс.
- Неправильний safelist — модальні вікна, алерти перестають стилізуватися.
- Critical CSS не оновлюється при зміні контенту.
- Забувають про iframe та сторонні скрипти — їх CSS теж впливає на метрики.
- Переоптимізація: видалення класів, що використовуються в неочевидних місцях (архіви, статичні сторінки).
Що входить у роботу з прискорення CSS?
- Аудит поточного CSS: Coverage в DevTools, аналіз бандлів, виявлення render-blocking.
- Налаштування purge: конфігурація PurgeCSS або Tailwind JIT, створення safelist.
- Витяг critical CSS: автоматично через critters або вручну за допомогою
npx critical. - Мініфікація та стиснення: LightningCSS / esbuild, Gzip / Brotli.
- Інтеграція у збірку: Vite, Webpack, Laravel Mix, Next.js.
- Перевірка метрик: LCP, FCP, TBT до та після.
- Документація: опис налаштувань, рекомендації щодо підтримки.
Результат: проходження Core Web Vitals, CSS bundle мінімального розміру, збереження функціональності та стилів.
Ми використовуємо PurgeCSS, Tailwind JIT, critters та PostHTML залежно від стеку. Все налаштовується під вашу збірку. Гарантуємо покращення LCP на 40-60% або проведемо додаткову оптимізацію безкоштовно.
Вартість нашої роботи — від 5000 грн за проєкт, що окупається за місяць завдяки прискоренню сайту. Економія на трафіку після оптимізації може сягати 2000-5000 грн на місяць. Зв'яжіться з нами для детального аудиту вашого проєкту. Отримайте консультацію щодо відповідних інструментів. Оцінимо ваш CSS за 1 день. Замовте покращення CSS та прискорте ваш сайт.







