CSS Modules в связке с esbuild представляют собой механизм локальной инкапсуляции CSS-классов, при котором имена стилей преобразуются в уникальные идентификаторы, а исходные названия экспортируются как значения модуля. Такой подход устраняет конфликты имён в глобальной области CSS и упрощает поддержку крупных интерфейсных приложений.
CSS Modules рассматривают каждый CSS-файл как модуль, в котором классы становятся локальными сущностями. При обработке файла сборщик:
В результате импорт CSS перестаёт быть побочным эффектом подключения стилей и превращается в структурированное взаимодействие через объект.
В esbuild поддержка CSS Modules реализуется на уровне обработки CSS-файлов и может активироваться разными способами в зависимости от конфигурации.
На практике используются два основных подхода:
Файлы с расширением вида:
styles.module.cssрассматриваются как CSS Modules автоматически. Такой подход основан на соглашении именования и позволяет разделять глобальные стили и модульные.
При использовании API esbuild возможно включение режима модулей через параметры обработки CSS. В зависимости от версии и окружения сборки применяется настройка, активирующая модульную интерпретацию CSS-файлов.
CSS Modules преобразуют классы в свойства экспортируемого объекта.
.button {
padding: 12px 16px;
background: #2b6cb0;
color: white;
}
.primary {
background: #1a202c;
}
import styles from "./button.module.css";
const el = document.createElement("button");
el.className = styles.button;
el.textContent = "OK";
document.body.appendChild(el);
После сборки styles.button будет заменён на
сгенерированную строку, например:
_button_button__a1b2c
Одной из ключевых задач CSS Modules является предотвращение конфликтов имён. esbuild генерирует хешированные идентификаторы на основе:
Итоговое имя класса становится локально уникальным в рамках проекта.
Это позволяет безопасно использовать одинаковые названия классов в разных файлах:
/* header.module.css */
.title { font-size: 20px; }
/* footer.module.css */
.title { font-size: 14px; }
В результате:
import header from "./header.module.css";
import footer from "./footer.module.css";
header.title !== footer.title;
CSS Modules изолируют селекторы внутри файла. По умолчанию:
Такой подход уменьшает необходимость использовать методологии типа BEM для предотвращения конфликтов.
Для управления областью видимости в CSS Modules применяются специальные псевдоклассы.
Позволяет явно указать глобальный селектор:
:global(.reset) {
margin: 0;
padding: 0;
}
Такой класс не будет преобразован и останется доступным глобально.
Является противоположностью и подчёркивает локальность:
:local(.wrapper) {
display: flex;
}
В большинстве случаев :local является поведением по
умолчанию, но его использование улучшает читаемость в смешанных
стилях.
CSS Modules поддерживают композицию стилей, при которой один класс наследует стили другого.
.base {
padding: 8px;
border-radius: 4px;
}
.success {
composes: base;
background: green;
}
После обработки класс success будет включать стили
base, но при этом сохранит собственный набор правил.
В Jav * aScript:
el.className = styles.success;
CSS Modules экспортируют все классы как свойства одного объекта:
.card { }
.title { }
.body { }
import card from "./card.module.css";
card.card;
card.title;
card.body;
Такой подход обеспечивает единый интерфейс доступа к стилям и упрощает масштабирование структуры UI.
Для комбинирования классов используются обычные строковые операции:
el.className = `${styles.button} ${styles.primary}`;
или более сложные условия:
el.className = [
styles.button,
isActive && styles.active
].filter(Boolean).join(" ");
При использовании esbuild CSS Modules обрабатываются на этапе сборки вместе с JavaScript-кодом. Это позволяет:
Результатом становится либо инлайн CSS в bundle, либо отдельный CSS-файл, в зависимости от настроек сборки.
В типизированных окружениях часто используется генерация деклараций:
declare const styles: {
readonly button: string;
readonly primary: string;
};
export default styles;
esbuild сам по себе не обязан генерировать .d.ts файлы
для CSS Modules, поэтому типизация обычно достигается через
дополнительные плагины или постобработку.
Базовая реализация CSS Modules в esbuild имеет ряд особенностей:
Несмотря на это, базовая модель остаётся стабильной: преобразование классов в локальные идентификаторы и экспорт через JavaScript-модуль.