css-modules
css模块化的常规方案,配置简单;
原理: 在打包css文件前,通过css-loader将css命名后缀随机生成的hash值,达到命名空间(及通过命名不同来保障唯一性)的效果;
// 源码 text.css.text{color:#333}// 源码 jsximport 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; }// 源码 jsximport 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的手段。
