Maison  >  Article  >  interface Web  >  Parlons de pourquoi CSS doit être modularisé ? Comment mettre en œuvre la modularisation ?

Parlons de pourquoi CSS doit être modularisé ? Comment mettre en œuvre la modularisation ?

藏色散人
藏色散人avant
2021-10-25 16:37:581859parcourir

style CSS "local"

sass et résoudre moins partiellement le problème de la modularisation CSS via @import. @import ,部分解决的 css 模块化的问题。

由于 css 是全局的,在被引入的文件和当前文件出现重名的情况下,前者样式就会被后者覆盖。
在引入一些公用组件,或者多人协作开发同一页面的时候,就需要考虑样式会不会被覆盖,这很麻烦。

// file A
.name {
    color: red
}

// file B
@import "A.scss";
.name {
    color: green
}

css 全局样式的特点,导致 css 难以维护,所以需要一种 css “局部”样式的解决方案。
也就是彻底的 css 模块化,@import 进来的 css 模块,需要隐藏自己的内部作用域。

CSS Modules 原理

通过在每个 class 名后带一个独一无二 hash 值,这样就不有存在全局命名冲突的问题了。这样就相当于伪造了“局部”样式。

// 原始样式 styles.css
.title {
  color: red;
}

// 原始模板 demo.html
import styles from 'styles.css';

<h1 class={styles.title}>
  Hello World
</h1>


// 编译后的 styles.css
.title_3zyde {
  color: red;
}

// 编译后的 demo.html
<h1 class="title_3zyde">
  Hello World
</h1>

webpack 与 CSS Modules

webpack 自带的 css-loader 组件,自带了 CSS Modules,通过简单的配置即可使用。

{
    test: /\.css$/,
    loader: "css?modules&localIdentName=[name]__[local]--[hash:base64:5]"
}

命名规范是从 BEM 扩展而来。

  • Block: 对应模块名 [name]

  • Element: 对应节点名 [local]

  • Modifier: 对应节点状态 [hash:base64:5]

使用 __ 和 -- 是为了区块内单词的分割节点区分开来。
最终 class 名为 styles__title--3zyde

在生产环境中使用

在实际生产中,结合 sass 使用会更加便利。以下是结合 sass 使用的 webpack 的配置文件。

{
    test: /\.scss$/,
    loader: "style!css?modules&importLoaders=1&localIdentName=[name]__[local]--[hash:base64:5]!sass?sourceMap=true&sourceMapContents=true"
}

通常除了局部样式,还需要全局样式,比如 base.css 等基础文件。
将公用样式文件和组件样式文件分别放入到两个不同的目标下。如下。

.
├── app                      
│   ├── styles               # 公用样式
│   │     ├── app.scss       
│   │     └── base.scss      
│   │
│   └── components           # 组件
          ├── Component.jsx  # 组件模板
          └── Component.scss # 组件样式

然后通过 webpack 配置,将在 app/styles 文件夹的外的(exclude) scss 文件"局部"化。

{
    test: /\.scss$/,
    exclude: path.resolve(__dirname, 'app/styles'),
    loader: "style!css?modules&importLoaders=1&localIdentName=[name]__[local]--[hash:base64:5]!sass?sourceMap=true&sourceMapContents=true"
},
{
    test: /\.scss$/,
    include: path.resolve(__dirname, 'app/styles'),
    loader: "style!css?sass?sourceMap=true&sourceMapContents=true"
}

有时候,一个元素有多个 class 名,可以通过  join(" ")  或字符串模版的方式来给元素添加多个 class 名。

// join-react.jsx
<h1 className={[styles.title,styles.bold].join(" ")}>
  Hello World
</h1>

// stringTemp-react.jsx
<h1 className={`${styles.title} ${styles.bold}`}>
  Hello World
</h1>

如果只写一个 class 就能把样式定义好,那么最好把所有样式写在一个 class 中。
所以,如果我们使用了多个 class 定义样式,通常会带一些一些逻辑判断。这个时候写起来就会麻烦不少。

引入 classnames ,即可以解决给元素写多个 class 名的问题,也可以解决写逻辑判断的麻烦问题。

classNames('foo', 'bar'); // => 'foo bar'
classNames('foo', { bar: true }); // => 'foo bar'
classNames({ 'foo-bar': true }); // => 'foo-bar'
classNames({ 'foo-bar': false }); // => ''
classNames({ foo: true }, { bar: true }); // => 'foo bar'
classNames({ foo: true, bar: true }); // => 'foo bar'

// lots of arguments of various types
classNames('foo', { bar: true, duck: false }, 'baz', { quux: true }); // => 'foo bar baz quux'

// other falsy values are just ignored
classNames(null, false, 'bar', undefined, 0, 1, { baz: null }, ''); // => 'bar 1'

引入 CSS Modules 的样式模块,每个 class 每次都要写 styles.xxx 也是很麻烦,在《深入React技术栈》提到了 react-css-modules

Le CSS étant global, si le fichier importé et le fichier actuel portent le même nom, le premier style sera écrasé par le second.
Lors de l'introduction de certains composants publics, ou lorsque plusieurs personnes collaborent pour développer la même page, vous devez vous demander si le style sera écrasé, ce qui est très gênant.

rrreeeLes caractéristiques des styles CSS globaux rendent les CSS difficiles à maintenir, donc une solution aux styles CSS "locaux" est nécessaire.
C'est-à-dire une modularisation CSS complète. Le module CSS importé par @import doit cacher sa propre portée interne.

Le principe des modules CSS
🎜En ajoutant une valeur de hachage unique après chaque nom de classe, il n'y a pas de problème de conflit de nom global. Cela équivaut à se forger un style « local ». Le composant css-loader de 🎜rrreee🎜webpack et modules CSS🎜🎜webpack est livré avec des modules CSS, qui peuvent être utilisés via une configuration simple. 🎜rrreee🎜La convention de dénomination est étendue à partir de BEM. 🎜
  • 🎜Bloc : Nom du module correspondant [name]🎜
  • 🎜Élément : Nom du nœud correspondant [local]🎜 li>
  • 🎜Modificateur : Statut du nœud correspondant [hash:base64:5]🎜
🎜L'utilisation de __ et -- sert à diviser les nœuds des mots dans la différenciation des blocs .
Le nom final de la classe est styles__title--3zyde. 🎜🎜Utilisé dans un environnement de production🎜🎜En production réelle, il sera plus pratique de l'utiliser en combinaison avec sass. Ce qui suit est le fichier de configuration du webpack utilisé avec sass. 🎜rrreee🎜Habituellement, en plus des styles locaux, des styles globaux sont également nécessaires, tels que base.css et d'autres fichiers de base.
Placez les fichiers de style public et les fichiers de style de composant dans deux cibles différentes. comme suit. 🎜rrreee🎜Ensuite, utilisez la configuration du webpack pour "localiser" les fichiers scss en dehors du dossier app/styles. 🎜rrreee🎜Parfois, un élément a plusieurs noms de classe. Vous pouvez ajouter plusieurs noms de classe à l'élément via join(" ") ou un modèle de chaîne. 🎜rrreee🎜Si vous pouvez définir le style en écrivant une seule classe, alors il est préférable d'écrire tous les styles dans une seule classe.
Donc, si nous utilisons plusieurs classes pour définir des styles, nous avons généralement des jugements logiques. Ce sera beaucoup plus difficile d'écrire en ce moment. 🎜🎜L'introduction des noms de classe peut résoudre le problème de l'écriture de plusieurs noms de classe pour les éléments et le problème gênant de l'écriture de jugements logiques. 🎜rrreee🎜En présentant le module de style des modules CSS, il est également très difficile d'écrire styles.xxx pour chaque classe à chaque fois dans la "Pile technologique React en profondeur" mentionnée react-css. -bibliothèque modules pour réduire l'écriture de code. Les étudiants intéressés peuvent l'étudier. 🎜🎜Apprentissage recommandé : "🎜Tutoriel vidéo CSS🎜"🎜🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer