Частые вопросы
Общее
Чем ECSS отличается от CSS Modules или styled-components?
Логика «какой стиль применить» живёт в
.ecss-файле (в условиях@if), а не в компоненте, и полностью типизирована. В браузер попадает статический CSS — без генерации стилей в рантайме. Подробнее — Сравнение.
Нужно ли отказываться от обычного CSS?
Нет. ECSS — надмножество CSS: любой валидный CSS остаётся валидным ECSS. Директивы добавляются по мере необходимости.
Сколько JavaScript попадает в бандл?
Минимум: статический CSS плюс крошечный хелпер, который проставляет класс и
data-атрибуты. Никакого вычисления стилей в браузере — см. Как ECSS компилируется.
Поддерживается ли SSR?
Да. Стили — это статический CSS, поэтому SSR работает из коробки. Адаптер Astro рендерит вообще без клиентского JS.
Обязателен ли TypeScript?
Нет, ECSS работает и в JS-проектах. Но в TypeScript вы получаете автодополнение и проверку параметров — см. Интеграция с TypeScript.
Стили и синтаксис
Поддерживаются ли вложенность (&), @media и var()?
Да. CSS-вложенность и нативные at-правила (
@media,@supports,@container, …) работают как обычно;var()и кастомные свойства — тоже.
Можно ли использовать синтаксис Sass/SCSS внутри ECSS?
Нет. ECSS — надмножество обычного CSS, а не SCSS: переменные
$var,@mixin/@include,@function, циклы@each/@forи подобные конструкции не поддерживаются — многие из них усложняют стили. Часть привычных задач решается средствами ECSS: вложенность (нативный CSS), токены через@const, условия через@if. В будущем планируется аналог миксинов и функций.
Чем @enum отличается от @const?
@enum— список допустимых значений (тип для@param);@const— переиспользуемое значение (токен). См. Перечисления и константы.
Чем extends отличается от @external?
extends— наследование: блок вбирает стили родителя.@external— контекстная стилизация чужого блока внутри текущего, без наследования. См. Наследование.
Компоненты и фреймворки
Почему мой <EButton> рендерится как <div>?
По умолчанию корневой тег компонента —
<div>. Укажите нужный через пропas:<EButton as="button">. См. Компоненты и адаптеры.
Можно ли задать HTML-тег прямо в .ecss (как styled.button)?
Нет, и это намеренно. Философия ECSS — описывать только стили и управление их состоянием; всё, что касается разметки, решается на уровне компонента. Поэтому тег задаётся при использовании через проп
as:<EButton as="button">,<ECard as="section">.
Как передать обычные атрибуты и обработчики (id, onClick, aria-*)?
Любые пропы, кроме
paramsиas, прокидываются на корневой элемент как есть.
Работает ли ECSS без фреймворка?
Да — адаптер Vanilla JS (DOM) даёт компоненты на чистом DOM API.
Можно ли использовать ECSS в Angular?
Пока нет. Отдельного адаптера для Angular нет (готовые адаптеры — React, Vue, Svelte, SolidJS, Astro и чистый DOM), а интеграция со сборкой сейчас работает только через Vite, который не входит в стандартный тулчейн Angular. Ситуация может измениться с появлением плагинов для webpack и rspack.
Можно ли использовать несколько фреймворков в одном проекте?
Да: зарегистрируйте несколько адаптеров и выбирайте нужный суффиксом
?<id>при импорте. См. Несколько адаптеров.
Можно ли изменить префикс E в имени компонента?
Да, опцией
componentNamePrefixу адаптера — см. обзор адаптеров.
Сборка и интеграция
Какие сборщики поддерживаются?
На текущий момент (версия 0.2) — только Vite (
@ecss/vite-plugin). Конфигурация (@ecss/config) не привязана к сборщику; в дальнейшем планируется поддержка webpack и rspack.
ECSS компилируется в современный CSS — как быть со старыми браузерами?
ECSS не занимается даунлевелингом: на выходе — обычный современный CSS. Поддержку старых браузеров (вендорные префиксы, полифилы новых возможностей) обеспечивает отдельный шаг постобработки CSS на уровне сборщика — например, Lightning CSS (опционально поддерживается Vite) или PostCSS с Autoprefixer / postcss-preset-env, настроенные через Browserslist.
Есть ли отдельный CLI?
Нет. ECSS работает как плагин сборщика.
Нужно ли коммитить каталог .ecss/?
Нет — он пересоздаётся при каждой сборке. Добавьте
.ecssв.gitignore.
Почему ESLint ругается на файлы в папке .ecss/?
.ecss/— это сгенерированный код (компоненты и типы), а не ваши исходники. Рекомендуется добавить каталог в игнор линтера и форматера, как и в.gitignore: например,ignores: ['.ecss/**']во flat-конфиге ESLint (или строка.ecssв.eslintignore/.prettierignore).
Есть ли поддержка ECSS в Stylelint?
Нет. Stylelint не понимает директивы ECSS (
@block,@param,@ifи др.). Ошибки в.ecssуже ловятся на этапе компиляции, а в будущем планируется собственный встроенный линтинг ECSS — без привязки к Stylelint.
Почему импорт .ecss не типизирован?
Скорее всего, не настроен
rootDirsвtsconfig. См. Интеграция с TypeScript.