为什么80%的码农都做不了架构师?>>>   

github·原文

CSS Modules 内部通过 ICSS 来解决样式导入和导出这两个问题。分别对应 :import 和 :export 两个新增的伪类。

:import("path/to/dep.css") {localAlias: keyFromDep;/* ... */
}
:export {exportedKey: exportedValue;/* ... */
}

webpack 配置

结合 Webpack 的 css-loader 后,就可以在 CSS 中定义样式,在 JS 中导入。加上 modules 即为启用,localIdentName 是设置生成样式的命名规则。

// webpack.config.js
css?modules&localIdentName=[name]__[local]-[hash:base64:5]

示例

css 样式

/* components/Button.css */
.normal { /* normal 相关的所有样式 */ }
.disabled { /* disabled 相关的所有样式 */ }

js 编写

/* components/Button.js */
import styles from './Button.css';console.log(styles);buttonElem.outerHTML = `<button class=${styles.normal}>Submit</button>`

生成的 html

<button class="button--normal-abc53">Submit</button>

注意到 button--normal-abc53 是 CSS Modules 按照 localIdentName 自动生成的 class 名。其中的 abc53 是按照给定算法生成的序列码。经过这样混淆处理后,class 名基本就是唯一的,大大降低了项目中样式覆盖的几率。同时在生产环境下修改规则,生成更短的 class 名,可以提高 CSS 的压缩率。

通过这些简单的处理,CSS Modules 实现了以下几点:

  • 所有样式都是 local 的,解决了命名冲突和全局污染问题
  • class 名生成规则配置灵活,可以此来压缩 class 名
  • 只需引用组件的 JS 就能搞定组件所有的 JS 和 CSS
  • 依然是 CSS,几乎 0 学习成本

样式默认局部

使用了 CSS Modules 后,就相当于给每个 class 名外加加了一个 :local,以此来实现样式的局部化,如果你想切换到全局模式,使用对应的 :global

.normal {color: green;
}/* 以上与下面等价 */
:local(.normal) {color: green;
}/* 定义全局样式 */
:global(.btn) {color: red;
}/* 定义多个全局样式 */
:global {.link {color: green;}.box {color: yellow;}
}

样式复用

可以使用 css-module自带的 composes 来组合样式

/* settings.css */
.primary-color {color: #f40;
}/* components/Button.css */
.base { /* 所有通用的样式 */ }.primary {composes: base;composes: primary-color from './settings.css';/* primary 其它样式 */
}

class 命名技巧

CSS Modules 的命名规范是从 BEM 扩展而来。BEM 把样式名分为 3 个级别,分别是:

  • Block:对应模块名,如 Dialog
  • Element:对应模块中的节点名 Confirm Button
  • Modifier:对应节点相关的状态,如 disabled、highlight

综上,BEM 最终得到的 class 名为 dialog__confirm-button--highlight。使用双符号 __ 和 -- 是为了和区块内单词间的分隔符区分开来。

CSS Modules 中 CSS 文件名恰好对应 Block 名,只需要再考虑 Element 和 Modifier。BEM 对应到 CSS Modules 的做法是:

/* .dialog.css */
.ConfirmButton--disabled {
}

你也可以不遵循完整的命名规范,使用 camelCase 的写法把 Block 和 Modifier 放到一起:

/* .dialog.css */
.disabledConfirmButton {
}

原则规范

CSS Modules 是对现有的 CSS 做减法。为了追求简单可控,作者建议遵循如下原则:

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

转载于:https://my.oschina.net/lemos/blog/1537216

css-modules 简介相关推荐

  1. CSS Modules

    css-loader 提供了一种叫做 CSS Modules 的方案,可以帮我们自动生成唯一的类名,不会和其他模块的命名出现冲突 要使用 CSS Modules 有几个步骤,首先需要在 webpack ...

  2. CSS Modules 用法教程

    学过网页开发就会知道,CSS 不能算编程语言,只是网页样式的一种描述方法. 为了让 CSS 也能适用软件工程方法,程序员想了各种办法,让它变得像一门编程语言.从最早的Less.SASS,到后来的 Po ...

  3. CSS Modules入门教程

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

  4. [Vue]Scoped Css与Css Modules的区别

    均为解决CSS全局作用域问题(样式冲突(污染))的一个解决方案. 1.Scoped CSS 当 <style> 标签有 scoped 属性时,相当于在元素中添加了一个唯一属性用来区分. & ...

  5. css-modules,可视化介绍CSS Modules是什么?

    你是否曾经为组件设计过样式,却只知道应用了不需要的CSS规则? 也许你会重新考虑CSS的另一个部分,所以规则不适用,或者你会添加!important规则,只是为了让它发挥作用. 这就是CSS Modu ...

  6. css-modules,CSS Modules 方案

    在讲CSS Modules之前,先想想什么是CSS Module? 在我眼中CSS Module是对css进行模块化的管理,更加深入的解释就是用来管理css样式的导入与导出.灵活按需导入以便复用代码, ...

  7. less和sass支持 css modules 一样的局部环境和使用方式,解决重名样式覆盖的问题

    安装 npm install --save-dev node-sass sass-loader css-loader: css-loader 会对 @import 和 url() 进行处理,就像 js ...

  8. 被尤雨溪diss的Native CSS Modules是什么

    前天早上正吃着早饭,唱着歌,开开心心摸鱼时,看到一条尤大的推文: 尤:老实说,我认为Native CSS Modules标准是仓促的,再次显示了参与该标准制定过程的人的傲慢 经常看尤大和其他大佬们交流 ...

  9. webpack 中实现自动识别 CSS Modules

    编者按:本文作者奇舞团前端开发工程师彭体奎 背景 在 React 项目中使用 CSS 时,如果不使用 CSS in JS 的方案,一般会直接在 JS 文件中导入一个 CSS 文件,比如 import ...

  10. 浅谈CSS Modules以及CSS Modules在Vue.js上的使用

    前言 在平常的开发或者学习中,我们可能会有意无意的接触到CSS Modules.那CSS Modules到底是什么呢?现在,我将带你走进CSS Modules,去了解它的始末.本文将从 什么是CSS ...

最新文章

  1. java中overload与override的区别
  2. 上证所Level-2在信息内容和传送方式方面的比较优势[逐笔数据与分笔数据的根本区别]...
  3. 执行SQL-获取缓存
  4. [Leetcode][第216题][JAVA][数组之和3][回溯]
  5. github和git@osc提交问题
  6. 学习笔记——逻辑斯蒂回归与最大熵模型
  7. 【动态规划】LIS最长上升子序列和LCS最长公共子序列
  8. 令人震惊的电子邮件归档调查
  9. 路由交换技术vlan、trunk、单臂路由、三层交换、链路聚合、STP
  10. SpringSecurity实战(三)-整合SpringSession-Redis
  11. EayRadius 于 2013-7-19 进行体验度更新,增加用户体验度
  12. tp5.1 系统常量
  13. 微信视频号100w播放收入1000+的变现方式
  14. 这四个原因会导致域名解析错误
  15. jquery在线扫雷
  16. 给vmware7虚拟机xp整理磁盘碎片
  17. PKI(公、私钥加密,数字签名、数字证书)技术理解
  18. 苦尽甘来 一个月学通JavaWeb(三十五 数据库)
  19. 高等数学 —— 无穷小与无穷大
  20. 状语从句到独立结构(absolute construction )

热门文章

  1. 泛亚凭借一粒薏米-农业大健康·田亚:对话农民丰收节交易会
  2. vscode 将本地项目上传到github、从github克隆项目以及删除github上的某个文件夹
  3. centos solr 部署到 tomcat 上
  4. JS实现表格Table动态添加删除行
  5. 【Python】学习笔记五:缩进与选择
  6. 在eclipse下配置maven插件
  7. Hdu 1384 Intervals
  8. SQL SERVER中架构的理解
  9. 为什么本地sqlservr.exe进程占用内存如此之大?
  10. 10个月产品演化之路-快速试错,快速反应,探索产品成功之道