css modules调研

css模块化解决方案

  • 抛弃css (Radium,jsxstyle,react-style)
  • 利用js来管理样式依赖(css Modules)

css模块化面临的问题

  • 全局污染
  • 命名混乱
  • 依赖管理不彻底
  • 无法共享变量
  • 代码压缩不彻底

启用CSS Modules,webpack配置

...
{
test: /\.css$/,
use: [
{
loader: 'style-loader'
},
{
loader: 'css-loader?modules&localIdentName=[name]-[hash:base64:5]'
}
]
},
...

在项目当中使用

Test.jsx

import React, { Component } from 'react';
// 将样式文件当成模块引入
import styles from "./test.css"; export default class Test extends Component {
render() {
return (
<div>
<div className={styles.test}>测试</div>
</div>
)
}
}

test.css

.test {
color: red;
}

以上就是CSS Modules的基本用法

用法进阶

全局样式和局部样式

开启CSS Modules之后默认的样式都为局部样式

// css 样式
(:global)(.test1) {
color: blue;
}
或者如下(定义多个全局样式)
:global {
.test1 {
color: blue;
}
.test2 {
color: red;
}
} // 全局样式写法和之前一样
import React, { Component } from 'react';
import styles from "./test.css";
export default class Test extends Component {
render() {
return (
<div>
<div className="test1">测试</div>
</div>
)
}
}

Compose 组合样式

// 样式文件
.base {
font-size: 20px;
} .normal {
composes: base;
color: #333;
} .disabled {
composes: base;
color: #ddd;
}
// 组件中
import React, { Component } from 'react';
import styles from "./test.css";
export default class Test extends Component {
render() {
return (
<div>
<div className="normal">测试</div>
</div>
)
}
}
// 编译后的html文件
<d class="div--base-daf62 div--normal-abc53">测试</div>
// 由于在 .normal 中 composes 了 .base,编译后会 normal 会变成两个 class。

CSS Modules 使用技巧

  • 不使用选择器,只使用class名来定义样式
  • 不叠加多个class
  • 所有样式通过composes组合来实现复用
  • 不嵌套

CSS Modules React 项目实践

import classNames from 'classnames';
import styles from './dialog.css'; export default class Dialog extends React.Component {
render() {
const cx = classNames({
[styles.confirm]: !this.state.disabled,
[styles.disabledConfirm]: this.state.disabled
}); return <div className={styles.root}>
<a className={cx}>Confirm</a>
...
</div>
}
}

关于样式覆盖问题

因为CSS Modules 不会覆盖属性选择器,所以可以利用属性选择器来解决这个问题

// 组件中
...
return (
<div data-role='test'>
测试
</div>
)
...
// 样式
[data-role="test"] {
color: red;
}

如何与全局样式共存

import Component from './view/Component'
// 全局样式
import './styles/app.scss';
// 以下为组件相关样式(局部样式)
import './Component.scss';

SASS与CSS Modules配合使用

module: {
loaders: [{
test: /\.jsx?$/,
loader: 'babel'
}, {
test: /\.scss$/,
exclude: path.resolve(__dirname, 'src/styles'),
loader: 'style-loader!css-loader?modules&localIdentName=[name]__[local]!sass?sourceMap=true'
}, {
test: /\.scss$/,
include: path.resolve(__dirname, 'src/styles'),
loader: 'style-loader!css-loader!sass-loader?sourceMap=true'
}]
}

CSS Modules使用方法的更多相关文章

  1. 在React中使用CSS Modules设置样式

    最近,一直在看React...那真的是一个一直在学的过程啊,从配置环境webpack,到基础知识jsx,babel,es6,没有一个不是之前没有接触的.其实,我内心是兴奋的啊,毕竟,活着就是要接触一些 ...

  2. CSS Modules 解决 react 项目 css 样式互相影响的问题

    1. CSS Modules引入目的 写过CSS的人,应该都对一大长串选择器选中一个元素不陌生吧,这种方式,其实定义的就是全局样式,我们时常会因为选择器权重问题,没有把我们想要的样式加上去. 另外,每 ...

  3. 在Angular1.X中使用CSS Modules

    在Angular1.5中,增加了一个Component方法,并且定义了组件的若干生命周期hook,在代码规范中也是推崇组件化开发,但是很遗憾的是,CSS模块化组件化的问题并没有得到解决,大部分项目的打 ...

  4. 在vue中使用css modules替代scroped

    前面的话 css modules是一种流行的模块化和组合CSS的系统. vue-loader提供了与css modules的集成,作为scope CSS的替代方案.本文将详细介绍css modules ...

  5. css模块化及CSS Modules使用详解

    什么是css模块化? 为了理解css模块化思想,我们首先了解下,什么是模块化,在百度百科上的解释是,在系统的结构中,模块是可组合.分解和更换的单元.模块化是一种处理复杂系统分解成为更好的可管理模块的方 ...

  6. CSS Modules 与 scoped 的不一样

    What ? css 的作用域表现. Css modules 是一个CSS文件,其中所有类名和动画名称默认为局部作用域. 使用JS编译原生的CSS文件,使其具备模块化的能力,该文件需要import使用 ...

  7. CSS Modules入门教程

    为什么引入CSS Modules 或者可以这么说,CSS Modules为我们解决了什么痛点.针对以往我写网页样式的经验,具体来说可以归纳为以下几点: 全局样式冲突 过程是这样的:你现在有两个模块,分 ...

  8. 转 : CSS Modules详解及React中实践

    https://zhuanlan.zhihu.com/p/20495964 CSS 是前端领域中进化最慢的一块.由于 ES2015/2016 的快速普及和 Babel/Webpack 等工具的迅猛发展 ...

  9. CSS Modules入门及React中实践(内附webpack4配置)

    本篇文章以整理为主,自己进行了部分修改,如有侵权,请告知 CSS Modules介绍 CSS Modules是什么东西呢?首先,让我们从官方文档入手:GitHub – css-modules/css- ...

随机推荐

  1. Vue项目中遇到的一些问题总结

    一.开发环境使用Ajax请求,报错  网上查的资料,在config中的index.js这样设置 proxyTable:{ '/api':{ target:'', //此处为你的API接口地址 chan ...

  2. Uva 组装电脑 12124 - Assemble

    主要运用二分法查找最优解 #include<iostream> #include<string> #include<vector> #include<map& ...

  3. html下拉菜单栏代码

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  4. Python9-From-CSS-day48

    1.form表单相关内容前后端有数据交互的时候用form表单form表单提交数据的几个注意事项: 1.所有获取用户输入的标签都必须放在form表单里面 2.action 控制着往哪里提交 3.inpu ...

  5. linux-最最最最最常用的操作

    去除两个文件中相同的内容 比如我想把file1中不含文件file2的内容保留下来:(这个在抠一些内容的时候挺好用的) awk '{print $0}' file1 file2 |sort|uniq - ...

  6. 【转】iPhone通讯录AddressBook.framework和AddressBookUI.framework的应用

    通讯录中联系人相关的应用iPhone提供了两个框架:AddressBook.framework和AddressBookUI.framework,使用这两个框架我们可以在程序中访问并显示iPhone数据 ...

  7. MySQL和PostgreSQL比较

    1.MySQL相对来说比较年轻,首度出现在1994年.它声称自己是最流行的开源数据库.MySQL就是LAMP(用于Web开发的软件包,包括 Linux.Apache及Perl/PHP/Python)中 ...

  8. Failed to find provider info for com.tencent.mm.sdk.plugin.provider

    微信启动的时候可以调用,微信没启动,调用支付报这个错误. 我的问题是 微信发开着的jar包不是最新的,去官方网站下一个最新的就可以成功了.

  9. 大数据面试(HR电话了解)

    1什么是HA集群? 所谓HA,即高可用(7*24小时不中断服务) HA集群是hadoop高可用集群,即有两个namenode,一个active,一个stanby,active的name挂掉之后,sta ...

  10. mysql插入、修改、删除

    联合查询: union:合并.联合,将多次查询结果合并成一个结果 语法: 查询语句1: union[all] 查询语句2: union [all] ... 意义 1.将一条比较复杂的查询语句可拆分成多 ...