webpack css_module配置與使用

本文主要是基于webpack+es6+react關于css module腳手架的搭建》景希可以從css_module_demo下載相關案例无午,本文擬從4種可能的情形配置啟動css_module。

css_module

css module最簡單的情形暴备,只需要在css-loader啟動css module配置即可。

webpack css-loader

module: {
     rules: [{
         test:  [/\.js$/, /\.jsx$/, /\.es6$/],
         include: [
           path.resolve(__dirname, 'src'),
         ],
         use: {
           loader: "babel-loader"
         },
       }, {
         test: [/\.css/],
         exclude: path.resolve(__dirname, 'src/styles/global'),
         use: [
           'style-loader',
           {
             loader: 'css-loader',
             options: {
                 modules: true,
                 localIdentName: '[name]__[local]-[hash:base64:5]'
             }
           }
         ]
      }, {
        test: [/\.css/],
        include: path.resolve(__dirname, 'src/styles/global'),
        use: [
          'style-loader',
          'css-loader'
        ]
      }]
   },

一般項目中们豌,會有normalize.css或者global.css全局css樣式涯捻,此時若不需要處理,可以配置兩種css的管理方式望迎。具體的使用方法障癌,可參照css_module_demo demo1的配置。

css_module + less\scss

若需要配合less辩尊、scss編輯器涛浙,配置與css-loader類似,在css摄欲、less相關配置中設置如下即可.

  ...
    {
         test: [/\.css$/, /\.less$/],
         exclude: path.resolve(__dirname, 'src/styles/global'),
         use: [
           'style-loader',
           {
             loader: 'css-loader',
             options: {
                 modules: true,
                 localIdentName: '[name]__[local]-[hash:base64:5]'
             }
           },
           {
             loader: 'postcss-loader',
             options: {
               ident: 'postcss',
               plugins: (loader) => [
                 require('postcss-import')({ root: loader.resourcePath }),
                 require('postcss-cssnext')(),
                 require('autoprefixer')(),
                 require('cssnano')()
               ]
             }
           },
           'less-loader'
         ]
      }, {
        test: [/\.css$/, /\.less$/],
        include: path.resolve(__dirname, 'src/styles/global'),
        use: [
          'style-loader',
          'css-loader',
          {
            loader: 'postcss-loader',
            options: {
              ident: 'postcss',
              plugins: (loader) => [
                require('postcss-import')({ root: loader.resourcePath }),
                require('postcss-cssnext')(),
                require('autoprefixer')(),
                require('cssnano')()
              ]
            }
          },
          'less-loader'
        ]
      }
...

這樣我就可以使用less的功能了轿亮,如我們在app.less中

.global {
  text-align: left;
  font-size: 20px;
  composes: box from "../styles/views/layout.less";
  .title {
    font-size: 22px;
    color: red;
  }
  .title:before {
    content: 'before i come'
  }
  .title:hover {
    font-size: 40px;
  }
}

但是css module中,不能在子選擇器中使用compose胸墙,如我們在title中定義composes

.global {
  text-align: left;
  font-size: 20px;
  composes: box from "../styles/views/layout.less";
  .title {
    font-size: 22px;
    composes: heading from "../styles/views/typography.less";
    color: red;
  }
  .title:before {
    content: 'before i come'
  }
  .title:hover {
    font-size: 40px;
  }
}

會提示類似如下的錯誤

ERROR in ./node_modules/.0.28.7@css-loader?{"modules":true,"localIdentName":"[name]__[local]-[hash:base64:5]"}!./node_modules/.2.0.8@postcss-loader/lib?{"ident":"postcss"}!./node_modules/.4.0.5@less-loader/dist/cjs.js!./src/components/app.less
Module build failed: Error: composition is only allowed when selector is single :local class name not in ":local(.global) :local(.title)"

css module作者在issues/261中提到“Composition works differently to mixins. It does not mutates rules, just concatenates names.”

css_module + react-css-modules

在每個樣式中都是style.*中的形式比較麻煩哀托,可以使用react-css-modules解決這種問題。例如在app.js中

import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import CSSModules from 'react-css-modules';
import { Link } from 'react-router-dom';
import styles from './app.less'
class App extends Component {
    constructor(props) {
        super(props);
    }
    render() {
        return (
            <div styleName='global'>
                <h1 styleName='title'>css module test case</h1>
                <ul role="nav" styleName='nav'>
                    <li><Link to="/CompositionOverrides">CompositionOverrides</Link></li>
                    <li><Link to="/GlobalSelectors">GlobalSelectors</Link></li>
                    <li><Link to="/ScopedAnimations">ScopedAnimations</Link></li>
                    <li><Link to="/ScopedSelectors">ScopedSelectors</Link></li>
                    <li><Link to="/StyleVariantA">StyleVariantA</Link></li>
                </ul>
                {this.props.children}
            </div>
        );
    }
}
export default CSSModules(App, styles)

react-css-modules缺點是是需要運行時的依賴劳秋,而且需要在運行時才獲取className仓手,性能損耗大。在比較大的項目中玻淑,會導致較大的延遲嗽冒。那么這個問題怎么解決那,可以使用bable-plugins-react-css-modules 把className獲取前置到編譯階段补履。

css_module + bable-plugins-react-css-modules

bable-plugins-react-css-modules與react-css-modules是同一個作者開發(fā)的工具添坊,bable-plugins-react-css-modules相對于react-css-modules,在性能方面有了較大的提高箫锤。
bable-plugins-react-css-modules有兩種配置方式贬蛙,一是配置在webpack.config.js雨女,二是配置在.babelrc中,本文采取的方式是配置在webpack.config.js中阳准。

       ...
       {
       test:  [/\.js$/, /\.jsx$/, /\.es6$/],
         include: [
           path.resolve(__dirname, 'src'),
         ],
         use: {
           loader: "babel-loader",
           options: {
             cacheDirectory: true,
             plugins: [
               [ "react-css-modules", {
                 context: path.resolve(__dirname, "src"),
                 "generateScopedName": "[path][name]__[local]--[hash:base64:5]"
               }]
             ]
           }
         },
       }
      ...

總結

css module具有靈活性氛堕、易移植的優(yōu)點,可以配合less野蝇、scss等多種css編譯器使用讼稚。本文依賴于webpack css-loader,配置了css module绕沈、css module + less\scss锐想、css module+react-css-modules、css module + babel-plugin-react-css-modules等四種css_module使用方式乍狐。

參考文獻

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末赠摇,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子浅蚪,更是在濱河造成了極大的恐慌蝉稳,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掘鄙,死亡現(xiàn)場離奇詭異,居然都是意外死亡嗡髓,警方通過查閱死者的電腦和手機操漠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來饿这,“玉大人浊伙,你說我怎么就攤上這事〕づ酰” “怎么了嚣鄙?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長串结。 經常有香客問我哑子,道長,這世上最難降的妖魔是什么肌割? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任卧蜓,我火速辦了婚禮,結果婚禮上把敞,老公的妹妹穿的比我還像新娘弥奸。我一直安慰自己,他們只是感情好奋早,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布盛霎。 她就那樣靜靜地躺著赠橙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪愤炸。 梳的紋絲不亂的頭發(fā)上期揪,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天,我揣著相機與錄音摇幻,去河邊找鬼横侦。 笑死,一個胖子當著我的面吹牛绰姻,可吹牛的內容都是我干的枉侧。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼狂芋,長吁一口氣:“原來是場噩夢啊……” “哼榨馁!你這毒婦竟也來了?” 一聲冷哼從身側響起帜矾,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤翼虫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后屡萤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體珍剑,經...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年死陆,在試婚紗的時候發(fā)現(xiàn)自己被綠了招拙。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡措译,死狀恐怖别凤,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情领虹,我是刑警寧澤规哪,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站塌衰,受9級特大地震影響诉稍,放射性物質發(fā)生泄漏。R本人自食惡果不足惜最疆,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一均唉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧肚菠,春花似錦舔箭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽箫章。三九已至,卻和暖如春镜会,著一層夾襖步出監(jiān)牢的瞬間檬寂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工戳表, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留桶至,地道東北人。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓匾旭,卻偏偏與公主長得像镣屹,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子价涝,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內容

  • 無意中看到zhangwnag大佬分享的webpack教程感覺受益匪淺女蜈,特此分享以備自己日后查看,也希望更多的人看到...
    小小字符閱讀 8,164評論 7 35
  • GitChat技術雜談 前言 本文較長色瘩,為了節(jié)省你的閱讀時間伪窖,在文前列寫作思路如下: 什么是 webpack,它要...
    蕭玄辭閱讀 12,693評論 7 110
  • 學習流程 參考文檔:入門Webpack居兆,看這篇就夠了Webpack for React 一. 簡單使用webpac...
    Jason_Zeng閱讀 3,138評論 2 16
  • 衣服風格能反映一個人的生活態(tài)度泥栖,也能決定一個人的第一印象簇宽。毫無疑問,簡單淡雅的人一定不會穿有太多顏色的衣服聊倔,對...
    漁舟舟愛看花閱讀 493評論 2 5
  • 睜開明亮的雙眼,除去睡意的干擾生巡,舒展美麗的笑容耙蔑,擁抱快樂的一天,大家好孤荣,我是你們的老朋友“手抓餅”愿新的一天你們工...
    junlingyurui閱讀 303評論 2 2