初探CSS Modules

CSS Modules 介绍



CSS Modules到底是个什么东西,不妨先看看其官方解释CSS Modules

通过其官方的解释我们可以了解到,CSS Modules既不是官方标准,也不是浏览器标准,而是在构建步骤中对css 类名选择器做作用域限定的一种方式(通过hash实现类似命名空间的方法)

CSS模块化



JS都已经全面实现的模块化,只有CSS的模块化还处于探索阶段,那麽为什么需要做CSS的模块化呢,主要有一下几个因素

CSS全局作用域问题

CSS规则都是全局的,任何一个组件的样式规则,对整个页面是有效的,随着项目规模和复杂度的提高,很容易出现样式冲突的问题,一旦出现样式冲突,问题的排查也会很麻烦。我们为了避免样式冲突问题通常会通过下面这几种方法来避免

  • class命名复杂一点,减少重复概率
  • 加父元素选择器,限制选择器class作用范围
  • 遵循BEM命名规范

以上方法虽然能够一定程度上减少全局样式冲突的概率,但是并没有从根本上解决全局样式冲突的问题,而且实现方式不够优雅,增加了项目的复杂程度和冗余

对CSS模块化的期待

  • 面向组件化开发: 处理复杂UI的最佳实践就是将复杂的组件拆分成更小的UI组件,所以需要有一个CSS架构来匹配
  • 沙箱化: 如果一个组件的样式会对其他的组件产生不必要或者是意想不到的影响,那么组件的拆分就没有任何作用,CSS全局作用域仍会给项目带来负面的作用
  • 开发方便

方案

CSS模块化的方案有很多,主要有三种

CSS命名约定

规范化CSS的模块化解决方案(BEM等)

弊端
  • 复杂的命名
  • 仍然没有打通CSS和JS之间的选择器和变量

CSS in JS

彻底抛弃 CSS,用 JavaScript 写 CSS 规则,并 内联样式styled-components 就是其中代表

弊端
  • 样式不能复用
  • 不能使用CSS预处理器(或者后处理器)

使用JS来管理样式模块

使用JS来编译原生的CSS文件,使其具备模块化的能力,代表是CSS Module

CSS Module还是JS与CSS分离的写法,不会改变开发者的书写习惯,使用CSS Modules可以让组件className控制权转交给JS,我们不会去关心命名冲突污染等问题,同时可以灵活控制生成的命名,样式代码不用修改即可让使用CSS语法的旧项目零成本接入

CSS Modules 能最大化地结合现有 CSS 生态(预处理器/后处理器等)和 JS 模块化能力,几乎零学习成本。只要你使用 Webpack,可以在任何项目中使用。是目前最好的 CSS 模块化解决方案。

使用

CSS Module具体的使用可以参考阮一峰老师的CSS Modules 用法教程

原文地址:https://www.cnblogs.com/changlon/p/9742473.html

时间: 2024-08-29 00:34:53

初探CSS Modules的相关文章

CSS Modules如何使用?

本文和大家分享的主要是CSS Modules的相关内容,一起来看看吧,希望对大家学习css有所帮助. 什么是css模块化? 为了理解css模块化思想,我们首先了解下,什么是模块化,在百度百科上的解释是,在系统的结构中,模块是可组合.分解和更换的单元.模块化是一种处理复杂系统分解成为更好的可管理模块的方式.它可以通过在不同组件设定不同的功能,把一个问题分解成多个小的独立.互相作用的组件,来处理复杂.大型的软件.看完模块化,是不是有种拼图的即视感,可以把大图分成各个小图,然后把小图拼成大图,分与合的

精通CSS+DIV网页样式与布局--初探CSS

CSS英文名Cascading Style Sheet,中文名字叫层叠样式表,是用于控制页面样式并允许将样式信息与网页内容分离的一种标记性语言,DIV+CSS是WEB设计标准,它是一种网页的布局方法.与传统中通过表格(table)布局定位的方式不同,它可以实现网页页面内容与表现相分离.提起DIV+CSS组合,还要从XHTML说起.XHTML是一种在HTML(标准通用标记语言的子集)基础上优化和改进的新语言,目的是基于XML应用与强大的数据转换能力,适应未来网络应用更多的需求."DIV+CSS&q

CSS modules 与 React中实践

最近一直在学习React,看上去蛮简单的内容,其实学习曲线还是比较高的. 目前学到css绑定的问题,看到有一篇好的文章,就转过来了. CSS 模块化的解决方案有很多,但主要有两类.一类是彻底抛弃 CSS,使用 JS 或 JSON 来写样式.Radium, jsxstyle ,react-style 属于这一类.优点是能给 CSS 提供 JS 同样强大的模块化能力:缺点是不能利用成熟的 CSS 预处理器(或后处理器) Sass/Less/PostCSS, :hover 和 :active 伪类处理

在Angular1.X中使用CSS Modules

在Angular1.5中,增加了一个Component方法,并且定义了组件的若干生命周期hook,在代码规范中也是推崇组件化开发,但是很遗憾的是,CSS模块化组件化的问题并没有得到解决,大部分项目的打包方式还是将所有CSS打包成一个完整的CSS文件,然后插入到html中,这样做的坏处显而易见,如果团队没有良好的CSS代码规范,很容易引起CSS的冲突,本文使用CSS Modules来解决Angular1.X中存在的CSS 冲突问题. 为了便于读者查看并动手操作,我将所有的代码打包成了一个库,首先在

[Webpack + React] Import CSS Modules with TypeScript and webpack

If you try to use CSS Modules in TypeScript the same way you would use them in JavaScript, with webpack’s css-loader, you’ll see an error: ”TS2307: Cannot find module './styles.css'”. typings-for-css-modules-loader is a drop-in replacement for css-lo

在vue中使用css modules替代scroped

前面的话 css modules是一种流行的模块化和组合CSS的系统. vue-loader提供了与css modules的集成,作为scope CSS的替代方案.本文将详细介绍css modules 引入 最开始使用Vue的时候,提倡并大量使用的是scoped这种技术 <style scoped> @media (min-width: 250px) { .list-container:hover { background: orange; } } </style> 这个可选 sc

[Vue]Scoped Css与Css Modules的区别

均为解决CSS全局作用域问题(样式冲突(污染))的一个解决方案. 1.Scoped CSS 当 <style> 标签有 scoped 属性时,相当于在元素中添加了一个唯一属性用来区分. <style scoped> .example { color: red; } </style> <template> <div class="example">hi</div> </template> 它通过使用 Po

CSS Modules入门教程

为什么引入CSS Modules 或者可以这么说,CSS Modules为我们解决了什么痛点.针对以往我写网页样式的经验,具体来说可以归纳为以下几点: 全局样式冲突 过程是这样的:你现在有两个模块,分别为A.B,你可能会单独针对这两个模块编写自己的样式,例如a.css.b.css,看一下代码 // A.js import './a.css' const html = '<h1 class="text">module A</h1>' // B.js import

webpack4 css modules

demo 代码点此,webpack4 中通过 css-loader 开启 css 模块化, 开始前先做点准备工作. 不了解 css 模块化的,可以前往查看github_css_modules. ## 准备工作 安装 webpack: npm init -y npm i -D webpack webpack-cli css-loader 创建 webpack.config.js 进行配置: const path = require('path'); const MiniCssExtractPlug