css-modules
css模块化的常规方案,配置简单;
原理: 在打包css文件前,通过css-loader将css命名后缀随机生成的hash值,达到命名空间(及通过命名不同来保障唯一性)的效果;
// 源码 text.css
.text{
color:#333
}
// 源码 jsx
import styles from './text.css';
<div className={styles.text}/>
// 对应的bundle
.text_htdu648s{
color:#333
}
<div class='text_htdu648s'>
配置简单,如:css-loader?modules&localIdentName=[name]_[hash:base64:8]’
module: {
rules:[
// ...others
{
test:/\.css$/,
use:['style-loader','css-loader?modules&localIdentName=[name]_[hash:base64:8]'],
exclude:/node_modules/
},
]
}
顺便插一句,在Vue的css模板里 加一个scoped的属性,就可以开启css模块化
// test.vue
<template>
<div class='box'><div>
</template>
<js>
new Vue({
// ...
})
</js>
<css scoped>
</css>
css in js
原理 : 所谓css in js 其实就是最终打入到 标签的style属性
<div style= {color: #ddd}>css in js</div>
当然,如果直接按上述方式写,可能有点累,所以我们期望是下面这个样子:
//源码 test.css
.text{
color:#ddd;
}
.box { height:80px; }
// 源码 jsx
import styles from './text.css'
function(props){
return <p style={styles.text} />
}
// 打包后的bundle
<p style='color:#ddd;'></p>
它的优点是 更符合组件化的思想(每一个标签都可以看作是一个独立的小组件,它的css应该是与其他小组件解耦的),并且绝对不会起css冲突(因为用的style);
而css-moudle这种加hash值来做命名空间的方式,则会有极小概率命名一致的现象(原css名字一致,随机生成的hash一致)。
postCss
postcss可以看作css的后处理——这么讲其实有失严谨,postCss就是一种处理css的手段。