Riot.js — это легковесный фреймворк для построения компонентного интерфейса на JavaScript. Одной из ключевых особенностей современного подхода к разработке компонентов является инкапсуляция стилей. CSS-модули обеспечивают изоляцию стилей на уровне компонента, что позволяет избежать конфликтов глобальных классов и упрощает поддержку больших приложений.
CSS-модули представляют собой обычные CSS-файлы, но с локальной областью видимости классов. При импорте модуля каждый класс автоматически получает уникальный хэш, предотвращая случайное переопределение стилей:
/* button.module.css */
.button {
background-color: #3498db;
color: white;
padding: 10px 20px;
border-radius: 4px;
cursor: pointer;
}
Импорт и использование в Jav * aScript:
import styles from './button.module.css';
const button = document.createElement('button');
button.className = styles.button;
button.textContent = 'Нажми меня';
document.body.appendChild(button);
В контексте Riot.js это интегрируется на уровне компонентов, где каждый компонент имеет собственный файл стилей и шаблон.
Riot.js использует синтаксис .riot файлов, где внутри
файла можно определять шаблон, скрипт и стили. Для использования
CSS-модулей рекомендуется подключать их через импорт и назначать классы
динамически.
Пример структуры компонента:
MyButton.riot
MyButton.module.css
Файл стилей (MyButton.module.css):
.button {
background-color: #2ecc71;
color: white;
padding: 12px 24px;
border: none;
border-radius: 5px;
font-size: 16px;
cursor: pointer;
transition: background-color 0.3s ease;
}
.button:hover {
background-color: #27ae60;
}
Файл компонента (MyButton.riot):
import styles from './MyButton.module.css';
<my-button>
<button class={styles.button} oncl ick={handleClick}>
<slot></slot>
</button>
<script>
export default {
handleClick() {
console.log('Кнопка нажата');
}
}
</script>
</my-button>
Ключевой момент — класс назначается через объект styles,
что гарантирует уникальность и предотвращает утечку стилей за пределы
компонента.
Riot.js поддерживает реактивные свойства, что позволяет динамически изменять классы компонентов на основе состояния:
<my-toggle>
<button class={isActive ? styles.active : styles.inactive} oncl ick={toggle}>
{isActive ? 'Включено' : 'Выключено'}
</button>
<script>
import styles from './MyToggle.module.css';
export default {
isActive: false,
toggle() {
this.isActive = !this.isActive;
}
}
</script>
</my-toggle>
Стили для состояния:
/* MyToggle.module.css */
.active {
background-color: #e74c3c;
color: white;
}
.inactive {
background-color: #bdc3c7;
color: #2c3e50;
}
Иногда необходимо комбинировать локальные и глобальные стили. Riot.js позволяет использовать глобальные классы параллельно с CSS-модулями:
<button class={`${styles.button} global-button`}>Кнопка</button>
Такой подход позволяет применять общий стиль для нескольких компонентов, сохраняя при этом локальную уникальность классов.
При использовании современных сборщиков (Webpack, Vite) CSS-модули
обрабатываются автоматически. Классы получают уникальные хэши, а
ненужные стили могут быть удалены при tree-shaking. В конфигурации
сборщика важно включить поддержку .module.css и убедиться,
что они обрабатываются через css-loader с опцией
modules: true.
Использование CSS-модулей в Riot.js повышает модульность и предсказуемость интерфейсов, особенно в крупных проектах с большим количеством компонентов и сложной структурой стилей.