Перейти к содержанию
Innovialabs

Sass, CSS Modules или CSS-in-JS: как стилизовать приложение

Практика3 мин

Коротко

Sass — препроцессор для удобного написания CSS, CSS Modules изолируют классы на уровне файла, а CSS-in-JS описывает стили в JavaScript. Для большинства React-приложений с SSR надёжный выбор — CSS Modules (при желании вместе с Sass) или CSS-in-JS без runtime.

Коротко о каждом подходе

  • Sass (SCSS) — препроцессор. Добавляет переменные, вложенность, миксины и функции, на выходе получается обычный CSS. Сам по себе не изолирует стили: классы остаются глобальными.
  • CSS Modules — обычные .css или .scss файлы, в которых сборщик делает имена классов уникальными. Стили изолированы на уровне файла, а результат — статический CSS.
  • CSS-in-JS — стили описываются в JavaScript рядом с компонентом. Есть две ветки: runtime (стили генерируются в браузере при рендере) и zero-runtime (стили извлекаются в CSS-файлы при сборке).

Эти подходы можно сочетать: Sass часто используют внутри CSS Modules.

Сравнение по главным критериям

КритерийSass (глобально)CSS ModulesCSS-in-JS runtimeCSS-in-JS zero-runtime
Изоляциявручную, через БЭМавтоматическиавтоматическиавтоматически
Работа в браузеретолько CSSтолько CSSJS генерирует стилитолько CSS
Динамика от propsчерез классы и CSS-переменныечерез классы и CSS-переменныенапрямуюограниченно, через переменные
SSR и серверные компонентыбез проблембез проблемнужна настройка, есть ограниченияобычно без проблем
Типизациянетможно сгенерироватьестьесть
Порог входанизкийнизкийсреднийсредний

Изоляция стилей

Главная проблема большого CSS — конфликты имён: класс .title из одного компонента ломает другой. Варианты решения:

  • Sass + методология БЭМ: договорённость об именах .card__title--active. Работает, но держится на дисциплине команды.
  • CSS Modules: styles.title превращается в уникальное имя автоматически. Конфликты исключены без договорённостей.
  • CSS-in-JS: стили привязаны к компоненту, глобальные правила выносятся явно.

Производительность

  • Статический CSS (Sass, CSS Modules, zero-runtime) загружается и кэшируется браузером отдельно от JS и не требует вычислений при рендере.
  • Runtime CSS-in-JS увеличивает размер JS-бандла и выполняет работу при каждом рендере: сериализует стили и вставляет их в документ. На простых страницах это незаметно, на сложных интерфейсах с частыми перерисовками может ощущаться.

Если важны скорость загрузки и Core Web Vitals, предпочтительнее подходы, которые отдают готовый CSS.

SSR и серверные компоненты

В современных React-фреймворках с серверным рендерингом и серверными компонентами runtime CSS-in-JS требует дополнительной настройки для сбора стилей на сервере, а в серверных компонентах такие библиотеки, как правило, не работают. Проверяйте документацию фреймворка и библиотеки перед выбором. CSS Modules и Sass поддерживаются большинством фреймворков из коробки.

Удобство разработки (DX)

  • Sass привычен большинству верстальщиков, но глобальное пространство имён требует аккуратности.
  • CSS Modules — тот же CSS, просто импортируемый как объект. Минус: динамические стили приходится делать через комбинации классов или CSS-переменные.
  • CSS-in-JS удобен, когда стили сильно зависят от состояния и props, и хорошо типизируется с TypeScript. Минус — смешение логики и стилей в одном файле, что нравится не всем.

Матрица выбора

Тип проектаРекомендация
Лендинг или многостраничный сайт без фреймворкаSass + БЭМ
React/Next.js-приложение с SSRCSS Modules (можно с Sass) или zero-runtime CSS-in-JS
SPA без SSR с богатой динамикой темыCSS-in-JS, runtime допустим
Дизайн-система для нескольких продуктовzero-runtime CSS-in-JS или CSS Modules + CSS-переменные для токенов
Легаси-проект на глобальном CSSпостепенный переход на CSS Modules по компонентам

Отдельный вариант — utility-first фреймворки вроде Tailwind CSS: это другой подход, который решает изоляцию за счёт отказа от собственных классов.

Частые ошибки

  • Смешивать три подхода в одном проекте без правил — стили становится трудно искать.
  • Вычислять в runtime то, что можно описать CSS-переменной: цвет темы, отступы, размеры.
  • Не выносить токены (цвета, шрифты, отступы) в одно место — при любом подходе они должны жить централизованно.

Частые вопросы

Всё реже. Нативные CSS-переменные и вложенность закрывают большую часть задач. Sass остаётся полезен ради миксинов, функций и циклов, а также в проектах, где он уже используется.

Поможем с этим

Если хотите не разбираться самим, а получить результат — этим мы занимаемся каждый день.

Обсудить проект

Читайте также

Есть идея или задача? Расскажите нам

Ответим в течение рабочего дня и предложим решение. Консультация бесплатная.