CSS-модули в контексте Riot.js

Riot.js — это легковесный фреймворк для построения компонентного интерфейса на JavaScript. Одной из ключевых особенностей современного подхода к разработке компонентов является инкапсуляция стилей. CSS-модули обеспечивают изоляцию стилей на уровне компонента, что позволяет избежать конфликтов глобальных классов и упрощает поддержку больших приложений.

Основные принципы 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 это интегрируется на уровне компонентов, где каждый компонент имеет собственный файл стилей и шаблон.

Интеграция CSS-модулей с компонентами 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;
}

Совмещение CSS-модулей с глобальными стилями

Иногда необходимо комбинировать локальные и глобальные стили. Riot.js позволяет использовать глобальные классы параллельно с CSS-модулями:

<button class={`${styles.button} global-button`}>Кнопка</button>

Такой подход позволяет применять общий стиль для нескольких компонентов, сохраняя при этом локальную уникальность классов.

Автоматическая оптимизация и сборка

При использовании современных сборщиков (Webpack, Vite) CSS-модули обрабатываются автоматически. Классы получают уникальные хэши, а ненужные стили могут быть удалены при tree-shaking. В конфигурации сборщика важно включить поддержку .module.css и убедиться, что они обрабатываются через css-loader с опцией modules: true.

Преимущества использования CSS-модулей в Riot.js

  • Изоляция стилей: минимизация конфликтов между компонентами.
  • Удобство поддержки: каждый компонент хранит свои стили рядом с шаблоном и скриптом.
  • Динамическая реактивность: возможность применять разные стили в зависимости от состояния.
  • Совместимость с сборщиками: легкая интеграция с Webpack, Vite, Rollup.
  • Легкость рефакторинга: изменение стилей одного компонента не затрагивает остальные.

Использование CSS-модулей в Riot.js повышает модульность и предсказуемость интерфейсов, особенно в крупных проектах с большим количеством компонентов и сложной структурой стилей.