CSS模块化的理解

说起css模块化,那么先来看看它的发展吧!

发展历程

从Web技术来讲

  1. Web 1.0:Web 起源于上世纪 90 年代,当时主要是静态页面,内容呈现形式单一,浏览器技术也比较简单。Web 1.0 的网站主要提供信息传递和查找功能,用户只能被动浏览。

  2. Web 2.0:Web 2.0 的出现标志着 Web 技术从单向传递信息向多向交互转变。用户可以自由发布信息和进行交互,网站呈现方式更为多样化,例如社交网络、在线协作工具等。Web 2.0 的技术特点包括 Ajax、富媒体应用程序、RESTful API 等。

  3. Web 3.0:Web 3.0 是指下一代 Web 技术,也称为“语义 Web”。它的主要目标是为机器人和人类用户提供更加智能化的 Web 体验,实现 Web 内容的智能化组织和查询。Web 3.0 的技术特点包括语义 Web 技术、人工智能、区块链等。

  4. Web 4.0:Web 4.0 是指未来 Web 技术的发展方向,目前还处于探索阶段。它的主要特点是将 Web 技术与真实世界相结合,实现一种更加深入的融合。Web 4.0 的技术特点包括增强现实、虚拟现实、智能物联网等。

总的来说,Web 技术经历了从静态页面到多向交互再到智能化 Web 的发展过程,不断提升着用户体验和应用场景。未来,随着技术的不断进步,Web 技术还将继续推动着数字世界的发展。

从书写css来讲

  1. 初始阶段:在 Web 发展的早期阶段,CSS 的应用比较有限,主要用于简单的样式设置,例如基本的文本样式、背景颜色等。这个阶段的 CSS 书写比较简单,主要是针对页面元素进行基本的样式设计。

  2. 表现与内容分离:随着 Web 标准的推广和浏览器的发展,人们开始意识到将内容与表现分离的重要性,这一概念也被称为“Web 2.0 时代”,CSS 的角色变得更加重要。开发者开始更注重语义化的 HTML 结构,将样式与内容分离,这样不仅提高了网站的可维护性,也使得页面结构更加清晰。

  3. 响应式设计与移动优先:随着移动设备的普及,响应式设计成为了一个重要的方向。开发者需要通过媒体查询等技术来实现不同屏幕尺寸下的布局和样式调整。同时,移动优先的理念也逐渐被提出,即首先针对移动设备进行设计和开发,然后再逐步扩展到桌面端。

  4. 模块化与预处理器:随着前端项目变得越来越复杂,CSS 的模块化成为了一个重要的趋势。开发者开始使用 CSS 预处理器(如 Sass、Less)来实现变量、混合、嵌套等功能,以便更好地组织和管理样式代码。同时,CSS 模块化的思想也逐渐被引入,例如 BEM(Block-Element-Modifier)命名规范等。

  5. 组件化与 CSS-in-JS:随着前端框架的发展,组件化成为了开发的主流模式。在这种情况下,CSS 也需要与组件一起进行模块化和组合。因此,出现了一些 CSS-in-JS 的解决方案(如 styled-components),将 CSS 与组件直接关联起来,实现更加灵活和独立的样式管理。

CSS 的书写经历了从简单的样式设置到内容与表现分离,再到响应式设计、模块化、组件化的发展过程。未来随着前端技术的不断演进,CSS 的书写方式可能会继续发生变化。

概念理解

CSS 模块化是一种将 CSS 代码划分为独立、可复用的模块的方法。它的目标是提高代码的可维护性、可扩展性和重用性。以下是对 CSS 模块化的理解:

  • 分离关注点:CSS 模块化通过将样式规则分解为独立的模块,每个模块都专注于自己的样式。这有助于降低代码的复杂度,提高代码的可读性和可维护性。

  • 组件化开发:CSS 模块化可以与组件化开发相结合,每个组件拥有自己的 CSS 模块,样式只应用于该组件内部,避免样式之间的冲突。这样可以更轻松地构建和管理大型应用程序,并促进团队合作。

  • 命名约定:CSS 模块化通常使用命名约定来避免全局样式的冲突。常用的命名约定包括 BEM(Block-Element-Modifier)、OOCSS(Object-Oriented CSS)和 SMACSS(Scalable and Modular Architecture for CSS)等。这些约定使得每个模块的样式具有唯一性,减少了样式冲突的可能性。

  • 可重用性:CSS 模块化鼓励编写可重用的样式模块。这些模块可以在不同的组件或页面中重复使用,从而减少代码的重复编写,并提高开发效率。

  • 构建工具支持:有许多构建工具可以帮助实现 CSS 模块化,例如使用 CSS 预处理器(如 Sass、Less)或 CSS-in-JS 解决方案(如 styled-components)。这些工具提供了模块化组织样式的功能,例如变量、混合、嵌套选择器等,以及自动化的构建和优化过程。

综上所述,CSS 模块化通过分离关注点、组件化开发、命名约定、可重用性和构建工具支持等方式,提高了 CSS 代码的可维护性和可扩展性。它是一种有助于管理和组织大型项目中复杂样式的有效方法。

实现方式

  1. 命名约定:使用一定的命名约定来实现 CSS 的模块化。例如,BEM(Block-Element-Modifier)命名规范将样式类名划分为块、元素和修饰符,通过命名的方式来表示各个组件或模块之间的关系。
//使用 BEM 命名规范
<div class="block">
  <div class="block__element">
    <span class="block__element--modifier">Hello, CSS Modules!</span>
  </div>
</div>

.block {
  /* 块级样式 */
}

.block__element {
  /* 元素级样式 */
}

.block__element--modifier {
  /* 修饰符样式 */
}
  1. 命名空间:使用命名空间来区分不同模块的样式。可以在样式类名前添加一个特定的前缀,以确保样式只应用于特定模块。这样可以避免样式冲突,并提供更好的可维护性。
<div class="moduleA">
  <span class="moduleA__text">Module A</span>
</div>

<div class="moduleB">
  <span class="moduleB__text">Module B</span>
</div>


.moduleA {
  /* Module A 样式 */
}

.moduleA__text {
  /* Module A 文本样式 */
}

.moduleB {
  /* Module B 样式 */
}

.moduleB__text {
  /* Module B 文本样式 */
}
  1. CSS 预处理器:使用 CSS 预处理器(如 Sass、Less)来实现 CSS 的模块化。预处理器提供了变量、混合、嵌套等功能,可以更好地组织和管理样式代码。通过将样式代码拆分为多个文件,并使用导入机制,可以实现模块化的样式管理。
//使用Sass
// _module.scss

.module {
  /* 模块样式 */
}

.module__item {
  /* 模块子元素样式 */
}

.module--highlight {
  /* 模块高亮样式 */
}


// main.scss

@import 'module';

.container {
  /* 容器样式 */
  
  .module {
    /* 使用模块样式 */
  }
}
  1. CSS-in-JS:使用 CSS-in-JS 解决方案(如 styled-components、Emotion)来实现 CSS 的模块化。这种方式将样式直接与组件关联起来,通过 JavaScript 的方式动态生成样式,从而实现更加灵活和独立的样式管理。
//使用 styled-components
import styled from 'styled-components';

const Module = styled.div`
  /* 模块样式 */
`;

const Item = styled.span`
  /* 子元素样式 */
`;

const HighlightedModule = styled(Module)`
  /* 高亮模块样式 */
`;
  1. CSS Modules:CSS Modules 是一种将 CSS 文件作为模块导入并进行隔离的方式。通过在 CSS 类名上添加哈希值,可以确保样式的唯一性,避免样式冲突。CSS Modules 还支持局部作用域和类似于变量的功能,使得样式的模块化更加直观。
import styles from './module.css';

function Component() {
  return (
    <div className={styles.module}>
      <span className={styles.item}>Module</span>
    </div>
  );
}

不同模块化的实现利弊也有所不同

命名约定:

优点:

  • 简单易懂,无需引入额外工具或语法。
  • 可读性好,通过类名可以直观地了解组件结构和关系。

缺点:

  • 类名较长,可能导致样式代码冗余。
  • 无法确保样式的唯一性,可能会出现命名冲突。

命名空间:

优点:

  • 可以避免样式冲突,更好地隔离模块之间的样式。
  • 提高了样式代码的可维护性和可读性。

缺点:

  • 需要手动管理命名空间,增加了工作量。
  • 类名仍可能存在冲突,需要谨慎选择命名。

CSS 预处理器:

优点:

  • 提供了变量、混合、嵌套等功能,提高了代码的复用性和可维护性。
  • 通过拆分样式文件,可以更好地组织和管理样式代码。

缺点:

  • 引入了预处理器,需要学习和配置相应的工具。
  • 预处理器语法可能与原生 CSS 有所不同,需要注意语法转换。

CSS-in-JS:

优点:

  • 样式与组件直接关联,提高了代码的可维护性和可读性。
  • 可以在样式中使用 JavaScript 的能力,使样式更加动态和灵活。

缺点:

  • 引入了额外的运行时成本,可能影响页面加载性能。
  • 某些开发者可能对在 JavaScript 中编写样式持保留态度。

CSS Modules:

优点:

  • 提供了局部作用域,避免了全局样式的冲突问题。
  • 通过哈希值确保样式的唯一性,避免了命名冲突。
  • 支持类似变量的功能,增加了样式代码的灵活性。

缺点:

  • 需要使用构建工具进行编译或转换,增加了开发环境的复杂性。
  • 对于初学者来说,可能需要学习新的概念和语法。

根据具体的项目需求和团队情况,可以选择最适合的 CSS 模块化实现方式。有些项目可能更适合简单的命名约定,而对于大型项目或团队协作,采用 CSS 预处理器CSS Modules 可能更合适。CSS-in-JS 则适用于那些更喜欢将样式与组件紧密耦合的开发者。

当然,不同模块化的实现使用场景也有所不同

需要根据项目的规模、团队的需求以及开发者个人偏好来选择合适的 css 模块化实现方式,有的情况下,也可以结合不同的方式来组合使用,来满足具体的需求。

  1. 命名约定
  • 适用于小型项目或个人项目,无需引入额外工具或语法。
  • 对于简单的组件结构和样式需求,命名约定可以提供一种简洁明了的方式来管理样式。
  1. 命名空间
  • 适用于中小型项目,需要更好地隔离模块之间的样式。
  • 当项目中存在多个模块或团队协作时,使用命名空间可以避免样式冲突,提高代码的可维护性和可读性。
  1. CSS 预处理器
  • 适用于中大型项目或对样式复用和维护性要求较高的项目。
  • 当需要使用变量、混合、嵌套等功能来提高样式代码的复用性和可维护性时,可以选择使用预处理器。
  1. CSS-in-JS
  • 适用于以组件为中心的开发模式,样式与组件紧密耦合。
  • 对于喜欢将样式与组件一起编写,并希望通过 JavaScript 来管理和操作样式的开发者来说,CSS-in-JS 是一个不错的选择。
  • 尤其在使用 React 或类似的组件化框架时,CSS-in-JS 可以更好地实现组件的封装和复用。
  1. CSS Modules
  • 适用于中大型项目或需要更好地管理样式作用域的项目。
  • 当项目需要避免全局样式冲突、确保样式唯一性,并且需要灵活地使用类似变量的功能时,可以选择使用 CSS Modules。
  • CSS Modules 还能提供局部作用域,使样式与组件紧密关联,提高代码的可维护性和可读性。

总结

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/215189.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java Web 学习之路(2) —— 概念、SpringBoot + MyBatis(controller+service+mapper)开发流程与过程梳理

文章目录 前言1. 常见的一些概念1.1 POJO&#xff08;Plain Ordinary Java Object 简单Java对象&#xff09;1.2 DAO和Mapper 2. Java的三层架构2.1 包的层级结构2.2 交互层 controller&#xff08;用户界面、网页&#xff09;jsp文件2.3 业务处理层 service2.4 Mapper层 3. 注…

认识DHT11温湿度传感器并制作温度报警器

Arduino UNO Arduino IDE开发环境 Arduino DHT11温湿度传感器 ​ 一、认识Arduino的DHT11温度湿度传感器 DHT传感器由电容式湿度传感器和热敏电阻两部分组成。除此之外&#xff0c;模块内部还有一些模拟信号到数字信号的转换&#xff0c;将温度湿度以数字信号的方式输…

[oeasy]python0002_终端_CLI_GUI_编程环境_游戏_真实_元宇宙

回忆 上次 了解了 python 语言的特点 历史悠久功能强大深受好评已成趋势 3大主流操作系统 macwindowslinux 我们 选择 linux 作为基础系统 为什么选择 黑乎乎的命令行界面呢&#xff1f;&#x1f914; GUI vs CLI 个人电脑 用图标和菜单组成 图形界面(GUI) Graphic User I…

电容、电感和电阻

一、电感 1&#xff09;图片 2&#xff09;作用 a&#xff09;储存容量 例如dcdc转换器的原理,将一个电压值转换成另外一个电压值 b&#xff09;选择信号 比如空气中弥漫着很多信号&#xff0c;我们应该怎么选取我们所需要的信号。 电感和电容可以看成一个电阻&#xff0c;当电…

基于springboot实现的垃圾分类管理系统

一、系统架构 前端&#xff1a;html | layer | jquery | css 后端&#xff1a;springboot | mybatis 环境&#xff1a;jdk1.8 | mysql | maven 二、 代码及数据库 三、功能介绍 01. 登录页 02. 系统设置-用户管理 03. 系统设置-页面管理 04. 系统设置-角色管…

015 OpenCV 霍夫变换(圆检测)

目录 一、环境 二、算法原理 三、完整代码 一、环境 本文使用环境为&#xff1a; Windows10Python 3.9.17opencv-python 4.8.0.74 二、算法原理 霍夫圆检测&#xff08;Hough Circle Detection&#xff09;是计算机视觉中一种常用的图像处理技术&#xff0c;主要用于检测…

fpga rom 初始化文件的一些心得

目录 可能遇到的问题 问题 解决方案 rom的初始化 用途 文件类型 如何生成初始化文件 示例 Altera Xilinx 可能遇到的问题 问题 altera FPGA的rom找不到初始化文件&#xff0c;编译过程会提示类似的问题 Error(127001): Cant find Memory Initialization File or He…

中通快递单号查询入口,并分析筛选出揽收中转延误件

批量查询中通快递单号的物流信息&#xff0c;并将其中的揽收中转延误件(从“揽收”至“到达转运中心”之间的时间差超过24小时的单号)分析筛选出来。 所需工具&#xff1a; 一个【快递批量查询高手】软件 中通快递单号若干 操作步骤&#xff1a; 步骤1&#xff1a;运行【快递…

【Docker实操】创建一个Nginx服务

一、不使用DockerFile 1、获取nginx官方镜像 docker pull nginx //拉取nginx官方镜像 docker image nginx //查看镜像2、创建项目目录 项目目录&#xff1a;/root/www2/nginx //如果当前目录在root mkdir www2 mkdir www2/nginx cd www2/nginx //进入项目目录3、创建源码文…

产品经理面试问题(四)

今天和大家免费分享产品经理常见的面试题目&#xff0c;含回答思路分析和回答事例。 【资源下载】 这个模板可以在 Axure高保真原型哦 小程序里免费下载 打开小程序后&#xff0c;在文档模板模块&#xff0c;搜索产品经理面试题目&#xff0c;获取下载地址 更多原型模板、视…

护眼灯什么光对眼睛好?适合考研党用的台灯推荐

如今&#xff0c;大多数人的日常工作和学习都离不开电子设备&#xff0c;长时间盯着屏幕容易造成眼睛疲劳和视力下降。全国近视率占多数的还是青少年&#xff0c;护眼台灯作为一种照明设备&#xff0c;具有调节光线亮度和色温的功能&#xff0c;可以有效减少眼睛的疲劳&#xf…

实时设计#N3期训练营DONE,ComfyUI中文社区@上海

作为主办方&#xff0c;我们非常高兴能够举办这次AIGC训练营&#xff0c;重点解决Comfyui的安装和入门。活动在下午1:30开始&#xff0c;在上海永兴仓库举行。 首先&#xff0c;我们向参与者介绍了本次活动的目的和安排&#xff0c;让大家对活动有一个清晰的认识。 接着&#x…

每周一算法:背包问题(三)多重背包

多重背包 有 N N N件物品和一个容量是 M M M的背包。第 i i i种物品最多有 s i s_i si​件&#xff0c;每件的体积是 v i v_i vi​&#xff0c;价值是 w i w_i wi​。 求解将哪些物品装入背包&#xff0c;可使这些物品的总体积不超过背包容量&#xff0c;且总价值最大。 输…

Qt 如何操作SQLite3数据库?数据库创建和表格的增删改查?

# 前言 项目源码下载 https://gitcode.com/m0_45463480/QSQLite3/tree/main # 第一步 项目配置 平台:windows10 Qt版本:Qt 5.14.2 在.pro添加 QT += sql 需要的头文件 #include <QSqlDatabase>#include <QSqlError>#include <QSqlQuery>#include &…

Dockerfile脚本编写流程及示例

学习dockerfile指令 Dockerfile 指令 说明 FROM 指定基础镜像 MAINTAINER 声明镜像的维护者 LABEL 添加元数据标签 RUN 在容器中执行命令 CMD 容器启动后默认执行的命令 EXPOSE 暴露容器的端口 ENV 设置环境变量 ADD 将文件、目录或远程文件添加到容器中 COP…

以用户为中心的前端性能

1. 简介 前端性能跟用户体验息息相关。举个栗子&#xff0c;当你打开乘车码扫码进站&#xff0c;网页白屏了很久才加载出来&#xff0c;延误了乘车时间&#xff1b;当你在微信抢红包时&#xff0c;点击按钮后延迟了一会才开始转圈圈&#xff0c;最终没抢到红包。当出现这样的情…

医疗器械设备模组的具体应用

直线模组是一种高精度、高速度的精密传动元件&#xff0c;目前被广泛应用在各种工业自动化领域&#xff1b;尤其是在激光加工、电子制造、医疗设备、物流设备和机器人等行业中&#xff0c;都发挥着重要作用&#xff0c;接下来我们看看医疗器械设备模组的具体应用吧&#xff01;…

echarts笔记-GeoJSON河北数据下并裁剪为冀北地图并使用echarts加载

首先找个网站把河北的GeoJSON数据下载下来&#xff0c;我用的是这个&#xff0c;理论上任意一个都可以 DataV.GeoAtlas地理小工具系列 将json数据下载后&#xff0c;进行裁剪&#xff0c;仅保留冀北数据。 如下&#xff0c;我裁剪的数据&#xff1a; {"type": &qu…

【备忘干货】c/c++ (wasm)和js互相调用记录

c/c&#xff08;wasm&#xff09;和js互相调用记录 废话 :)准备工作&#xff1a;安装Emscripten初探&#xff1a;C(wasm)之hello world进一步探究&#xff1a;接口调用1.js调用c&#xff0c;一些基本类型的传递&#xff08;char*&#xff0c;int&#xff0c;float&#xff09;以…

企业安全生产管理系统功能介绍

安全生产管理系统通过借助信息化手段和技术算法&#xff0c;建立了一个集安全风险监测预警、安全分区管理、隐患排查治理、特殊作业、人员定位管控于一体的“一张图”平台。平台可以实现企业安全生产管控的全面监管&#xff0c;推动公司生产安全业务的动态管理、集中管理和协同…