Оптимизация CSS сайта (critical CSS, purge unused CSS)

Наша компания занимается разработкой, поддержкой и обслуживанием сайтов любой сложности. От простых одностраничных сайтов до масштабных кластерных систем построенных на микро сервисах. Опыт разработчиков подтвержден сертификатами от вендоров.
Разработка и обслуживание любых видов сайтов:
Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Предлагаемые услуги
Показано 1 из 1 услугВсе 2065 услуг
Оптимизация CSS сайта (critical CSS, purge unused CSS)
Средняя
от 1 рабочего дня до 3 рабочих дней
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1214
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1161
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    852
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1041
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    823
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    815

Оптимизация CSS: critical CSS и purge неиспользуемых стилей

Неиспользуемый CSS увеличивает размер файла и замедляет FCP. Bootstrap с несколькими компонентами занимает 140 кБ — после purge остаётся 5–15 кБ. Tailwind с полным набором классов — 3.5 МБ; после purge — 5–50 кБ.

Tailwind CSS: автоматический purge

Tailwind 3+ удаляет неиспользуемые классы при production-сборке автоматически на основе анализа контента:

// 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`} /> // text-red-500 будет удалён

// Хорошо — полные имена классов
const colorMap = {
    red: 'text-red-500',
    blue: 'text-blue-500',
};
<div className={colorMap[color]} />

PurgeCSS для Bootstrap/кастомного CSS

// postcss.config.js
import purgecss from '@fullhuman/postcss-purgecss';

export default {
    plugins: [
        purgecss({
            content: [
                './resources/views/**/*.blade.php',
                './resources/js/**/*.tsx',
                './public/**/*.html',
            ],
            safelist: {
                // Классы добавляемые JS/Livewire/Alpine
                standard: ['modal-open', 'show', 'active', 'fade'],
                deep: [/^modal/, /^alert/, /^toast/],
                greedy: [/swiper/],
            },
            defaultExtractor: content =>
                content.match(/[\w-/:]+(?<!:)/g) || [],
        }),
    ],
};

Critical CSS — inline стили для первого экрана

Идея: стили, нужные для рендеринга above-the-fold контента, вставлять inline в <head>. Остальное — загружать асинхронно.

Автоматически через Vite (critters):

// vite.config.ts
import { defineConfig } from 'vite';
import { critters } from 'critters';

export default defineConfig({
    plugins: [
        critters({
            preload: 'media',     // async load для некритичных
            pruneSource: true,    // убрать из внешнего CSS то что уже inline
            logLevel: 'silent',
        })
    ]
});

Вручную для Laravel:

// Blade: inline critical CSS, async для остального
<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>

Генерация critical CSS — critical npm-пакет или penthouse:

npx critical https://example.ru/ --inline --minify > critical.css

CSS-in-JS — проблемы производительности

Styled-components, Emotion генерируют CSS в runtime — дополнительная нагрузка на JS. Для production предпочтительнее статический CSS:

  • Tailwind CSS — утилитарные классы, нет runtime overhead
  • CSS Modules — локальные классы, компилируются в статический CSS
  • Vanilla Extract — typed CSS, zero-runtime
// CSS Modules в React
import styles from './ProductCard.module.css';

function ProductCard({ product }) {
    return (
        <div className={styles.card}>
            <img className={styles.image} src={product.image} alt={product.name} />
            <h3 className={styles.title}>{product.name}</h3>
        </div>
    );
}

Минификация и сжатие

// vite.config.ts — LightningCSS для быстрой минификации
export default defineConfig({
    css: {
        transformer: 'lightningcss',
        lightningcss: {
            targets: browserslistToTargets(browserslist('>= 0.5%')),
            drafts: { customMedia: true },
        }
    },
    build: {
        cssMinify: 'lightningcss',
    }
});

LightningCSS также автоматически добавляет вендорные префиксы и полифиллы под настроенный browserslist.

Метрики

Цели после оптимизации:

Метрика До Цель
CSS bundle (gzip) 50–140 кБ < 20 кБ
Tailwind после purge 3.5 МБ 5–50 кБ
Render-blocking CSS Есть Нет (critical inline)
Покрытие CSS (Coverage) 10–30% > 80%

DevTools → Coverage → перезагрузить страницу → посмотреть % неиспользуемого CSS.

Срок оптимизации: 4–8 часов для настройки purge + critical CSS в сборке.