CSS модули представляют собой механизм локализации стилей, который позволяет изолировать CSS для конкретного компонента, предотвращая конфликты имен классов и упрощая поддержку больших приложений. В контексте Preact использование CSS модулей обеспечивает чистую архитектуру и строгую привязку стилей к компонентам.
Для работы с CSS модулями в Preact необходимо, чтобы сборщик
(например, Vite или Webpack) поддерживал соответствующую конфигурацию.
Обычно файлы модулей имеют расширение .module.css. Пример
структуры проекта:
src/
components/
Button/
Button.jsx
Button.module.css
В компоненте подключение осуществляется следующим образом:
import styles from './Button.module.css';
function Button({ label }) {
return <button className={styles.button}>{label}</button>;
}
export default Button;
В этом примере styles.button ссылается на уникальное имя
класса, которое генерируется сборщиком, предотвращая конфликты с другими
компонентами.
При использовании CSS модулей имена классов преобразуются в
уникальные строки. Например, button может превратиться в
Button_button__3XyZ1. Это обеспечивает:
CSS модули позволяют комбинировать несколько классов и применять их динамически:
import styles from './Button.module.css';
import classNames from 'classnames';
function Button({ primary, label }) {
const buttonClass = classNames(styles.button, {
[styles.primary]: primary,
});
return <button className={buttonClass}>{label}</button>;
}
Здесь библиотека classnames помогает аккуратно
комбинировать несколько стилей, включая условные классы.
CSS модули полностью поддерживают стандартные CSS-фичи, включая
псевдоклассы (:hover, :focus) и вложенность
через препроцессоры вроде Sass:
/* Button.module.css */
.button {
background-color: #007bff;
color: white;
border: none;
padding: 0.5rem 1rem;
cursor: pointer;
}
.button:hover {
background-color: #0056b3;
}
В случае использования Sass можно создавать вложенные правила:
/* Button.module.scss */
.button {
background-color: #007bff;
color: white;
&:hover {
background-color: #0056b3;
}
&__icon {
margin-right: 0.5rem;
}
}
Иногда требуется использовать глобальные стили внутри CSS модуля. Для
этого используется псевдокласс :global:
/* Button.module.css */
:global(body) {
margin: 0;
font-family: Arial, sans-serif;
}
.button {
padding: 1rem;
}
Селекторы, обернутые в :global, не проходят процесс
локализации и остаются глобальными.
Сборщики вроде Vite позволяют импортировать CSS модули напрямую в компоненты:
import styles from './App.module.css';
function App() {
return (
<div className={styles.container}>
<h1 className={styles.title}>Пример Preact с CSS модулями</h1>
</div>
);
}
Каждое имя класса будет преобразовано в уникальное значение, исключая конфликт с другими компонентами или библиотеками.
:global и
не изолированы автоматически.CSS модули в Preact обеспечивают надежный способ организации стилей, сочетая преимущества компонентного подхода с безопасной локализацией CSS. Они подходят для крупных приложений, где важно избежать конфликта классов и поддерживать чистую архитектуру кода.