成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

CSS Modules

gecko23 / 1964人閱讀

摘要:為什么引入全局樣式?jīng)_突進(jìn)行打包時(shí),將所有文件導(dǎo)入到入口文件中,樣式也會(huì)統(tǒng)一加載到入口中,根據(jù)的規(guī)則,后面的樣式會(huì)覆蓋掉前面的樣式聲明,造成全局樣式的覆蓋問(wèn)題。

CSS Modules 為什么引入CSS Modules

(1)全局樣式?jīng)_突
webpack進(jìn)行打包時(shí),將所有js文件導(dǎo)入到入口App.js文件中,樣式也會(huì)統(tǒng)一加載到入口中,根據(jù)css的layout規(guī)則,后面的樣式會(huì)覆蓋掉前面的樣式聲明,造成全局樣式的覆蓋問(wèn)題。
(2)嵌套層次過(guò)深的選擇器
為了解決全局樣式的沖突問(wèn)題,不得不引入一些特地命名namespace來(lái)區(qū)分,但是往往有些namespace命名得不夠清晰,就會(huì)造成要想下一個(gè)樣式不會(huì)覆蓋,就要再加一個(gè)新的命名空間來(lái)進(jìn)行區(qū)分,最終可能一個(gè)元素的顯示樣式嵌套特別深。

嵌套特別深會(huì)造成的問(wèn)題:
- 根據(jù)CSS選擇器的解析規(guī)則可以知道,層級(jí)越深,比較的次數(shù)也就越多,影響整個(gè)頁(yè)面的渲染
- 增加了不必要的字節(jié)開(kāi)銷(xiāo)
- 語(yǔ)義混亂 可擴(kuò)展性不好,約束越多,擴(kuò)展性越差

(3)無(wú)法共享變量
復(fù)雜組件要使用 JS 和 CSS 來(lái)共同處理樣式

一些解決方案

(1)css預(yù)處理器(less/sass) 支持模塊引入

存在問(wèn)題:不能解決全局樣式?jīng)_突問(wèn)題

(2)BEM(Block Element Modifier)解決命名沖突以及更好的語(yǔ)義化

Block:邏輯和頁(yè)面功能都獨(dú)立的頁(yè)面組件,是一個(gè)可復(fù)用單元,特點(diǎn)如下:

可以隨意嵌套組合

可以放在任意頁(yè)面的任何位置,不影響功能和外觀

可復(fù)用,界面可以有任意多個(gè)相同Block的實(shí)例

Element:Block的組成部分,依賴(lài)Block存在(出了Block就不能用)

[可選]定義Block和Element的外觀及行為,就像HTML屬性一樣,能讓同一種Block看起來(lái)不一樣

存在問(wèn)題:對(duì)于嵌套過(guò)深的層次在命名上會(huì)給需要語(yǔ)義化體現(xiàn)的元素造成很大的困難 對(duì)于多人協(xié)作上,需要統(tǒng)一命名規(guī)范,這同樣也會(huì)造成額外的effort

CSS Modules

(1)什么是css modules

通過(guò)構(gòu)建工具來(lái)使指定class達(dá)到scope的過(guò)程

(2)css modules優(yōu)勢(shì)

解決全局命名沖突問(wèn)題 css modules只關(guān)心組件本身 命名唯一

模塊化 可以使用composes來(lái)引入自身模塊中的樣式以及另一個(gè)模塊的樣式

解決嵌套層次過(guò)深的問(wèn)題 使用扁平化的類(lèi)名

(3)css modules的用法

開(kāi)啟css modules功能
由于css modules對(duì)樣式的處理邏輯是放在loader中,所以在css-loader中開(kāi)啟css-loader

{
    test: /.css$/,
    use: [
      {
        loader: MiniCssExtractPlugin.loader,
        options: {
          publicPath: "./build/styles"
        }
      },
      { 
        loader: "css-loader",
        options: {
            importLoaders: 1,
            modules: true,
            localIdentName: "[name]__[local]___[hash:base64:5]"  // 為了生成類(lèi)名不是純隨機(jī)
        }
      }
    ]
}        

修改index.js文件中對(duì)樣式的引入方式

import styles from "./index.css"; // 導(dǎo)出對(duì)象的格式是鍵值對(duì) 

編譯之后的類(lèi)使用

//index.css
.color{
  color:blue;
}

// index.js
import styles from "./index.css"; // 導(dǎo)出對(duì)象的格式是鍵值對(duì) 

// jsx
使用轉(zhuǎn)化后的類(lèi)名
// 如果以下劃線(xiàn)給類(lèi)命名使用styles["color-style"]

(4)其他用法

局部變量和全局變量

:local 做localIdentName規(guī)則處理(類(lèi)名進(jìn)行編譯 默認(rèn)可以不寫(xiě))

:global 樣式編譯后不變

/*下面兩種進(jìn)行編譯*/
.normal {
 color: green;
 }
:local(.normal) {
  color: green; 
}

/*下面兩種不會(huì)進(jìn)行編譯*/
// 多個(gè)類(lèi)不編譯
:global {
  .link {
    color: green;
  }
  .box {
    color: yellow;
  }
}
// 單個(gè)類(lèi)不編譯
:global(.box){
  color:blue;
}

compose組合class(需要樣式復(fù)用,在 CSS Modules 中,一個(gè)選擇器可以繼承另一個(gè)選擇器的規(guī)則) 自身引入的聲明的優(yōu)先級(jí)會(huì)比較高

    /* 同一個(gè)css文件中復(fù)用類(lèi)*/
    .bg {
        background-color:blue;
        }
    
    .title {
        composes:bg;
        color:white;
        }
    
   // js中使用
    import styles from "./test.css";
    
css modules
// 生成的HTML
css modules
   /* 不同css文件中復(fù)用類(lèi)*/ 
    /* color.css */
     .red {
       color: red;
      }

    .blue {
      color: blue;
    }

    /* index.css */
    .red {
        color: red;
    }

    .header {
        font-size: 32px;
    }

    .title {
        color: green;
        composes: blue from "./color.css";
        border-bottom: 1px solid #ccc;
        padding-bottom: 20px;
    }    

CSS和JS變量共享(:export 關(guān)鍵字可以把 CSS 中的 變量輸出到 JS 中)

    /* index.scss */
    $primary-color: #f40;

    :export {
      primaryColor: $primary-color;
    }

    /* app.js */
    import style from "index.scss";

    // 會(huì)輸出 #F40
    console.log(style.primaryColor);

備注

項(xiàng)目中如果使用antd 需要將antd樣式不進(jìn)行編譯
使用exclude排除exclude中指定目錄的資源。在node-modules中關(guān)閉css-module,在我們自己寫(xiě)的src下的css開(kāi)啟css-module

  {
    test: /.css$/,
    exclude: /node_modules|antd.css/,
    use: [
      {
        loader: MiniCssExtractPlugin.loader,
        options: {
          publicPath: "./build/styles"
        }
      },
      { 
        loader: "css-loader",
        options: {
            importLoaders: 1,
            modules: true,
            localIdentName: "[name]__[local]___[hash:base64:5]"  // 為了生成類(lèi)名不是純隨機(jī)
        }
      }
    ]
}        

項(xiàng)目中使用stylelint進(jìn)行css檢查 需要在stylelint配置忽略css-modules的關(guān)鍵字

 module.exports = {
  rules: {
    "selector-pseudo-class-no-unknown": [
      true,
      {
        ignorePseudoClasses: [
          "export",
          "import",
          "global",
          "local",
          "external",
        ],
      },
    ],
    "selector-type-no-unknown": [
      true,
      {
        ignoreTypes: ["from"],
      },
    ],
    "property-no-unknown": [
      true,
      {
        ignoreProperties: ["composes", "compose-with"],
      },
    ],
    "at-rule-no-unknown": [
      true,
      {
        ignoreAtRules: ["value"],
      },
    ],
  },
};

推薦css解決方案文章:
React拾遺:從10種現(xiàn)在流行的 CSS 解決方案談?wù)勎业淖類(lèi)?ài) (上)
CSS Modules入門(mén)及React中實(shí)踐

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/114868.html

相關(guān)文章

  • 簡(jiǎn)單易懂的CSS Modules

    摘要:結(jié)果是選手獲勝,名為的元素,最終的值為。而合理的命名約定,的確是組織代碼的有效策略。它們會(huì)再由轉(zhuǎn)換為適當(dāng)?shù)慕M合。雖然本文為了嚴(yán)謹(jǐn),結(jié)果寫(xiě)了相當(dāng)長(zhǎng)的篇幅,但希望你讀過(guò)之后,還能覺(jué)得是簡(jiǎn)單易懂的。 不要誤會(huì),CSS Modules可不是在說(shuō)css模塊化這個(gè)好像在某些地方見(jiàn)過(guò)的詞,它其實(shí)是特指一種近期才出現(xiàn)的技術(shù)手段。 什么技術(shù)手段呢?請(qǐng)待后文說(shuō)明。 層疊樣式表 我們知道,css的全名叫做層...

    chunquedong 評(píng)論0 收藏0
  • CSS Modules實(shí)踐

    摘要:能最大化地結(jié)合現(xiàn)有生態(tài)預(yù)處理器后處理器等和模塊化能力,幾乎零學(xué)習(xí)成本。編碼相關(guān)的所有樣式上例中打印的結(jié)果是注意到是按照自動(dòng)生成的名。實(shí)踐手動(dòng)引用渲染結(jié)果使用可以實(shí)現(xiàn)使用屬性自動(dòng)加載模塊。 文章同步于Github Pines-Cheng/blog 隨著前端這幾年的風(fēng)生水起,CSS作為前端的三劍客之一,各種技術(shù)方案也是層出不窮。從CSS prepocessor(SASS、LESS、Styl...

    hankkin 評(píng)論0 收藏0
  • CSS Modules詳解及React中實(shí)踐

    摘要:上例中打印的結(jié)果是對(duì)中的名都做了處理,使用對(duì)象來(lái)保存原和混淆后的對(duì)應(yīng)關(guān)系。結(jié)合實(shí)踐在處直接使用中名即可。如因?yàn)橹粫?huì)轉(zhuǎn)變類(lèi)選擇器,所以這里的屬性選擇器不需要添加。 showImg(http://gtms01.alicdn.com/tps/i1/TB15w0HLpXXXXbdaXXXjhvsIVXX-600-364.png); CSS 是前端領(lǐng)域中進(jìn)化最慢的一塊。由于 ES2015/201...

    wemall 評(píng)論0 收藏0
  • CSS Modules

    摘要:為什么引入全局樣式?jīng)_突進(jìn)行打包時(shí),將所有文件導(dǎo)入到入口文件中,樣式也會(huì)統(tǒng)一加載到入口中,根據(jù)的規(guī)則,后面的樣式會(huì)覆蓋掉前面的樣式聲明,造成全局樣式的覆蓋問(wèn)題。 CSS Modules 為什么引入CSS Modules (1)全局樣式?jīng)_突 webpack進(jìn)行打包時(shí),將所有js文件導(dǎo)入到入口App.js文件中,樣式也會(huì)統(tǒng)一加載到入口中,根據(jù)css的layout規(guī)則,后面的樣式會(huì)覆蓋掉前...

    wangdai 評(píng)論0 收藏0
  • CSS module 入門(mén)

    摘要:示例庫(kù)通過(guò)記錄來(lái)查看定制類(lèi)名默認(rèn)的哈希算法是,從前面我們可以發(fā)現(xiàn)被編譯成了這樣的字符串。與上面不加等價(jià)顯式的局部作用域語(yǔ)法通過(guò)示例庫(kù)的記錄來(lái)查看下的樣式復(fù)用對(duì)于樣式復(fù)用,提供了組合的方式來(lái)處理。 showImg(https://segmentfault.com/img/bV9WfX?w=800&h=274);前端發(fā)展越來(lái)越快,這應(yīng)該是每個(gè)前端開(kāi)發(fā)者的切身感受,但是CSS 是前端領(lǐng)域中進(jìn)...

    warnerwu 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<