CSS Modules

React 项目一大特色就是组件化模块,但是css模块化之前一直没有接触过,google了一些资料,发现可以通过设置webpack.config.js来应用CSS Modules

简单的设置:

  module.exports = {
      devtool: 'eval-source-map',

      entry: ...,
      output: {...},

      module: {
        loaders: [
          ...,
          {
            test: /\.css$/,
            loader: 'style!css?modules'
          }
        ]
      },

      devServer: {...}
}

然后新建一个css文件(root.css)

.root {
  background-color: #eee;
  padding: 10px;
  border: 3px solid #ccc;
}

在js文件中引入css文件

import styles from './root.css';

class Greeter extends Component{
  render() {
    return (
      <div className={styles.root}>

      </div>
    );
  }
}

export default Greeter

就ok了~~


进阶

1.支持scss

  module.exports = {
      devtool: 'eval-source-map',

      entry: ...,
      output: {...},

      module: {
        loaders: [
          ...,
          {
            test: /\.scss$/,
            loader: 'style!css?modules!postcss!sass?sourceMap=true', 
          }
        ]
      },

      devServer: {...}
}

2.默认编译出来是hash值唯一引用名称,需要自定义clss名称(modules&localIdentName=xxx):

  module.exports = {
      devtool: 'eval-source-map',

      entry: ...,
      output: {...},

      module: {
        loaders: [
          ...,
          {
            test: /\.scss$/,
            loader: 'style!css?modules&localIdentName=[path][name]__[local]!postcss!sass?sourceMap=true', 
          }
        ]
      },

      devServer: {...}
}

3.局部作用域和全局作用域:
CSS的规则都是全局的,任何一个组件的样式规则,都对整个页面有效。
产生局部作用域的唯一方法,就是使用一个独一无二的class的名字,不会与其他选择器重名。这就是 CSS Modules 的做法。

CSS Modules 允许使用:global(.className)的语法,声明一个全局规则。凡是这样声明的class,都不会被编译成哈希字符串。

:global(.title) {
  color: green;
}

<h1 className="title">
      Hello World
</h1>

4.与全局样式共存(使用webpack配置):

            { 
                test: /\.scss$/, 
                loader: 'style!css?modules&localIdentName=[path][name]__[local]!postcss!sass?sourceMap=true', 
                exclude: [/node_modules/,/styles/] 
            },
            { 
                test: /\.scss$/, 
                loader: 'style!css!sass?sourceMap=true', 
                include: /styles/ 
            }

本文参考:
1.Appendix A: Webpack for React
2.CSS Modules 用法教程
3.CSS Modules 详解及 React 中实践

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值