Содержание
Для большинства новых проектов удобны два подхода: Tailwind — утилитарные классы прямо в разметке, связанные с дизайн-токенами, — и CSS-модули — обычный CSS с автоматической изоляцией имён для каждого компонента. Tailwind быстрее в разработке типового интерфейса и не даёт стилям разрастаться, CSS-модули привычнее и удобнее для сложных нестандартных компонентов. CSS-in-JS с генерацией во время работы сейчас выбирают реже из-за влияния на производительность.
Разберём, какие проблемы возникают со стилями, чем отличаются подходы и как выбрать.
Какие проблемы бывают со стилями в больших проектах?
В небольшом проекте подойдёт любой способ писать CSS. Проблемы появляются, когда над интерфейсом работают несколько человек, а проекту несколько лет: стили конфликтуют, никто не решается удалить старый CSS, а одинаковые отступы и цвета записаны десятками разных значений.
- конфликты имён — новый класс случайно меняет вид другой страницы;
- мёртвый CSS — стили остаются после удаления компонентов, файл растёт;
- несогласованность — двадцать оттенков серого и отступы «на глаз»;
- специфичность — борьба
!importantи вложенных селекторов; - страх изменений — непонятно, что сломается, если поправить общий стиль.
Чем отличаются подходы к стилям?
Основные подходы различаются тем, где живут стили, как они изолируются и как попадают в браузер.
| Подход | Как устроен | Плюсы | Минусы |
|---|---|---|---|
| Tailwind | Утилитарные классы в разметке | Быстро, согласованно, CSS не растёт | Длинные списки классов, нужна привычка |
| CSS-модули | CSS-файл рядом с компонентом, имена изолированы | Обычный CSS, изоляция, гибкость | Значения нужно брать из переменных вручную |
| BEM | Соглашение об именах классов | Без инструментов | Изоляция держится на дисциплине |
| CSS-in-JS во время работы | Стили генерируются JavaScript | Динамика, всё в одном файле | Лишний JavaScript, проблемы с SSR |
| CSS-in-JS при сборке | Стили извлекаются в CSS при сборке | Типизация и изоляция без затрат | Меньше экосистема |
Фото: Unsplash
Как работает Tailwind?
Tailwind даёт набор маленьких классов, каждый из которых делает одно: задаёт отступ, цвет, размер шрифта. Значения берутся из конфигурации, которая и есть дизайн-токены проекта, а в итоговый CSS попадают только реально использованные классы.
<button class="rounded-lg bg-brand-600 px-4 py-2 text-sm font-semibold text-white
hover:bg-brand-700 focus-visible:outline-2 disabled:opacity-50">
Оформить заказ
</button>
Сильные стороны:
- Нельзя случайно сломать соседний компонент — стили привязаны к элементу.
- Отступы и цвета берутся из ограниченной шкалы — интерфейс остаётся согласованным.
- При удалении компонента его стили исчезают вместе с ним.
- Адаптивность и состояния — прямо в разметке:
md:,hover:,dark:.
Повторяющиеся сочетания классов выносят не в CSS, а в компоненты: кнопку, карточку, поле ввода.
Когда лучше CSS-модули?
CSS-модули удобнее, когда команда хорошо знает CSS, компоненты сложные и нестандартные — анимации, сложные сетки, иллюстрации, — или проект уже написан на обычном CSS и SCSS. Имена классов автоматически становятся уникальными, так что конфликты исключены, а писать можно на привычном CSS.
- держите значения в CSS-переменных — это ваши дизайн-токены;
- один модуль на компонент, без глобальных стилей внутри;
- общие стили — только сброс, типографика и переменные;
- используйте линтер для стилей, чтобы ловить захардкоженные цвета и отступы.
Что выбрать команде?
Выбор зависит не столько от технологии, сколько от наличия дизайн-системы и опыта команды. Важнее любого инструмента — единые токены: цвета, шрифты, отступы и радиусы, которые используют и дизайнеры, и разработчики.
- новый продукт с типовым интерфейсом и дизайн-системой — Tailwind;
- сложная анимированная вёрстка, сильные верстальщики — CSS-модули;
- большой существующий проект на SCSS — CSS-модули и постепенное введение токенов;
- не смешивайте больше двух подходов в одном проекте.
Подробнее о дизайн-системах — статья дизайн-система: когда нужна, а о скорости фронтенда — Core Web Vitals. О доступности интерфейса — статья доступность сайта.
Коротко
- Проблемы стилей — конфликты имён, мёртвый CSS и несогласованные значения.
- Tailwind — утилиты в разметке, согласованность и небольшой итоговый CSS.
- CSS-модули — обычный CSS с изоляцией, удобны для сложных компонентов.
- CSS-in-JS во время работы добавляет JavaScript и выбирается всё реже.
- Важнее инструмента — общие дизайн-токены и единые договорённости в команде.
Частые вопросы
Tailwind не делает разметку нечитаемой?
Длинные списки классов действительно выглядят непривычно. Проблему решают небольшие компоненты, автоматическая сортировка классов и вынос повторяющихся комбинаций в компоненты, а не в отдельные CSS-классы.
Можно ли совмещать Tailwind и CSS-модули?
Можно: утилиты для типовой вёрстки, модули — для сложных анимаций и нестандартных компонентов. Главное — договориться, когда что используется, иначе в проекте появятся два стиля.
Влияет ли выбор на скорость сайта?
Да. Tailwind и CSS-модули дают статический CSS, который хорошо кешируется. CSS-in-JS с генерацией стилей во время работы добавляет JavaScript и замедляет отрисовку, особенно на слабых устройствах.



