【深度解析】CSS工程化全攻略(1)

在现代前端开发中,随着项目的规模越来越大,CSS 代码的管理和维护变得越来越重要。传统的 CSS 编写方式在大型项目中存在诸多问题,如类名冲突、重复样式、文件细分等。为了解决这些问题,社区提出了多种解决方案,包括命名约定、CSS-in-JS、CSS Modules 和预编译器等。本文将详细介绍这些解决方案,并探讨如何利用构建工具如 webpack 来解决 CSS 文件的细分问题。

1. CSS 的问题

1.1 类名冲突的问题

  • 过深的层级:不利于编写、阅读、压缩、复用。
  • 过浅的层级:容易导致类名冲突。

一旦样式多起来,类名冲突的问题会变得更加严重。归根结底,类名冲突不好解决。

1.2 重复样式

重复的样式值在 CSS 代码中随处可见,维护起来极其困难。例如,一个网站的颜色可能只有几种:

  • primary
  • info
  • warn
  • error
  • success

这些颜色会出现在背景、文字、边框等各种地方。一旦需要调整颜色,将是一个巨大的工程。

1.3 CSS 文件细分问题

在大型项目中,CSS 也需要更细的拆分,以便于代码的维护。例如,一个轮播图模块不仅需要依赖 JS 功能,还需要依赖 CSS 样式。不同的功能依赖不同的 CSS 样式,公共样式可以单独抽离,形成更细的文件结构。但在实际运行环境中,我们希望文件越少越好。

2. 解决方案

2.1 解决类名冲突

命名约定
  • BEM:Block Element Modifier,通过命名规范来避免类名冲突。
  • OOCSS:Object-Oriented CSS,通过抽象通用样式来减少重复代码。
  • AMCSS:Attribute Modules CSS,通过属性来定义样式。
  • SMACSS:Scalable and Modular Architecture for CSS,通过模块化来组织 CSS 代码。
  • 其他:如 ITCSS、Atomic CSS 等。
CSS-in-JS
  • 原理:用 JavaScript 对象来表示样式,然后将样式直接应用到元素的 style 属性中。
  • 优点
    • 通过函数返回样式对象。
    • 把公共样式提取到公共模块中返回。
    • 利用 JavaScript 的各种特性操作对象,如混合、提取、拆分等。
  • 缺点:对习惯写 CSS 的开发者来说,编写起来可能不太适应。
  • 应用:在 React Native 中广泛使用。
CSS Modules
  • 原理:每个 CSS 文件都被视为一个模块,类名在编译时被自动转换为唯一的标识符,避免类名冲突。
  • 优点
    • 编写简单。
    • 绝对不重名。
  • 缺点:生成的类名较长,可能影响性能。
  • 应用:广泛应用于现代前端项目中。

2.2 解决重复样式的问题

CSS-in-JS
  • 优点:利用 JavaScript 的变量和函数来管理重复样式。
  • 缺点:对习惯写 CSS 的开发者来说,编写起来可能不太适应。
预编译器
  • 原理:引入变量、函数、嵌套等高级语法,编译成普通的 CSS。
  • 常见预编译器
    • Less:使用 .less 文件,支持变量、嵌套、混合等。
    • Sass:使用 .scss.sass 文件,支持变量、嵌套、混合等。
  • 优点
    • 支持变量,便于管理重复样式。
    • 支持嵌套,提高代码可读性。
    • 支持混合,便于复用样式。
  • 缺点:需要额外的编译步骤。

2.3 解决 CSS 文件细分问题

构建工具(如 webpack)
  • Loader:用于处理和转换 CSS 文件。
    • css-loader:解析 CSS 文件中的 @importurl() 语句。
    • style-loader:将 CSS 插入到 DOM 中。
    • postcss-loader:使用 PostCSS 插件进行进一步处理。
  • Plugin:用于打包、合并、压缩 CSS 文件。
    • MiniCssExtractPlugin:将 CSS 提取到单独的文件中。
    • OptimizeCSSAssetsPlugin:压缩 CSS 文件。

示例

1. 使用 CSS Modules

// webpack.config.js
const path = require('path');module.exports = {module: {rules: [{test: /\.css$/,use: ['style-loader',{loader: 'css-loader',options: {modules: true,importLoaders: 1,localIdentName: '[local]_[hash:base64:5]'}}]}]}
};// src/App.js
import React from 'react';
import styles from './App.module.css';function App() {return (<div className={styles.app}><h1 className={styles.title}>Hello, World!</h1></div>);
}export default App;// src/App.module.css
.app {background-color: #f0f0f0;padding: 20px;
}.title {color: #333;font-size: 24px;
}

2. 使用 Less

// webpack.config.js
const path = require('path');module.exports = {module: {rules: [{test: /\.less$/,use: ['style-loader','css-loader','less-loader']}]}
};// src/App.less
@primary-color: #333;.app {background-color: #f0f0f0;padding: 20px;.title {color: @primary-color;font-size: 24px;}
}// src/App.js
import React from 'react';
import './App.less';function App() {return (<div className="app"><h1 className="title">Hello, World!</h1></div>);
}export default App;

总结

通过本课程,你已经了解了 CSS 工程化中的常见问题及解决方案。这些解决方案包括命名约定、CSS-in-JS、CSS Modules 和预编译器等。合理使用这些工具和技术,可以有效解决 CSS 代码的管理和维护问题,提高开发效率和代码质量。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 网络编程(一)—— UDP数据报套接字编程

概念 在网络编程中主要的对象有两个&#xff1a;客户端和服务器。客户端是提供请求的&#xff0c;归用户使用&#xff0c;发送的请求会被服务器接收&#xff0c;服务器根据请求做出响应&#xff0c;然后再将响应的数据包返回给客户端。 作为程序员&#xff0c;我们主要关心应…

【MySQL】数据库表连接简明解释

未经许可,不得转载。 文章目录 表连接表连接的类型内连接与外连接结合 WHERE 条件交叉连接(cross join)表连接 在关系型数据库中,建模是数据组织的核心难点。数据库建模需要将数据关系理清,构建出适合存储和查询的结构。 所谓“模型”包括实体(entity) 和关系(relati…

SpringBoot(八)使用AES库对字符串进行加密解密

博客的文章详情页面传递参数是使用AES加密过得&#xff0c;如下图所示&#xff1a; 这个AES加密是通用的加密方式&#xff0c;使用同一套算法&#xff0c;前端和后端都可以对加密之后的字符串进行加密解密操作。 目前线上正在使用的是前端javascript进行加密操作&#xff0c;将…

拦截器实现http请求访问本地图片

本文来记录下拦截器实现http请求访问本地图片 文章目录 概述代码实现本文小结 概述 如下图&#xff0c;本机(服务器)存储的图片想要在浏览器上通过Url地址访问&#xff1a; 浏览器直接访问 代码实现 烂机器实现文件真实地址和物理地址之间的映射 Slf4j Configuration public cl…

gpu-V100显卡相关知识

一、定义 RuntimeError: FlashAttention only supports Ampere GPUs or newer.torch attention注意力接口学习V100 架构是什么&#xff1f; 二、实现 RuntimeError: FlashAttention only supports Ampere GPUs or newer. 报错原因分析&#xff1a; GPU机器配置低&#xff0c;…

C++初阶——list

一、什么是list list是一个可以在序列的任意位置进行插入和删除的容器&#xff0c;并且可以进行双向迭代。list的底层是一个双向链表&#xff0c;双向链表可以将它们包含的每个元素存储在不同且不相关的存储位置。通过将每个元素与前一个元素的链接和后一个元素的链接关联起来&…

《DiffusionDet: Diffusion Model for Object Detection》ICCV2023

摘要 本文提出了一种新的框架DiffusionDet&#xff0c;它将目标检测任务表述为从带噪声的边界框到目标边界框的去噪扩散过程&#xff08;如图一所示&#xff09;。在训练阶段&#xff0c;目标边界框逐渐扩散到随机分布&#xff0c;模型学习逆转这一加噪过程。在推理阶段&#…

词嵌入方法(Word Embedding)

词嵌入方法&#xff08;Word Embedding&#xff09; Word Embedding是NLP中的一种技术&#xff0c;通过将单词映射到一个空间向量来表示每个单词 ✨️常见的词嵌入方法&#xff1a; &#x1f31f;Word2Vec&#xff1a;由谷歌提出的方法&#xff0c;分为CBOW&#xff08;conti…

Mit6.S081-实验环境搭建

Mit6.S081-实验环境搭建 注&#xff1a;大家每次做一些操作的时候觉得不太保险就先把虚拟机克隆一份 前言 qemu&#xff08;quick emulator&#xff09;&#xff1a;这是一个模拟硬件环境的软件&#xff0c;利用它可以运行我们编译好的操作系统。 准备一个Linux系统&#xf…

qt QVideoWidget详解

1. 概述 QVideoWidget是Qt框架中用于视频播放的控件。它继承自QWidget&#xff0c;并提供了与QMediaPlayer等多媒体播放类集成的功能。QVideoWidget可以嵌入到Qt应用程序的用户界面中&#xff0c;用于显示视频内容。它支持多种视频格式&#xff0c;并提供了基本的视频播放控制…

10款PDF合并工具的使用体验与推荐!!!

在如今的信息洪流中&#xff0c;我们几乎每个人都被淹没在大量的数字文档之中。无论是学生、教师还是职场人士&#xff0c;我们都需要高效地管理和处理这些文档。而PDF文件&#xff0c;凭借其跨平台的稳定性和通用性&#xff0c;成了最常用的文档格式之一。我们经常需要处理、编…

【AI大模型】ELMo模型介绍:深度理解语言模型的嵌入艺术

学习目标 了解什么是ELMo.掌握ELMo的架构.掌握ELMo的预训练任务.了解ELMo的效果和成绩.了解ELMo的优缺点. 目录 &#x1f354; ELMo简介 &#x1f354; ELMo的架构 2.1 总体架构 2.2 Embedding模块 2.3 两部分的双层LSTM模块 2.4 词向量表征模块 &#x1f354; ELMo的预…

Gurobi学术版+Anaconda安装步骤

注意&#xff1a;在anaconda虚拟环境中安装gurobi库是不需要在本地下载gurobi这个软件的&#xff0c;只需要conda install gurobi即可&#xff0c;或者指定版本的安装conda install -c gurobi gurobi11.0.3。 step0&#xff1a;安装ananconda step1&#xff1a;获得学术许可&a…

【C++】类与对象的基础概念

目录&#xff1a; 一、inline 二、类与对象基础 &#xff08;一&#xff09;类的定义 &#xff08;二&#xff09;访问限定符 &#xff08;三&#xff09;类域 &#xff08;四&#xff09;实例化概念 正文 一、inline 在C语言的学习过程中&#xff0c;大家肯定了解过宏这个概…

解决表格出现滚动条样式错乱问题

自定义表格出现滚动条时&#xff0c;会因为宽度不对等导致样式错乱&#xff1b; 解决思路&#xff1a; 监听表格数据的变化&#xff0c;当表格出现滚动条时&#xff0c;再调用更新宽度的方法updateWidth&#xff0c;去改变表格头部的宽度&#xff0c;最终保持表格头部和内容对…

天才的懈怠 : 平衡二叉树

力扣110&#xff1a;平衡二叉树 描述&#xff1a; 二叉树的每一个节点的左右子树高度差不超过1&#xff0c;即为平衡二叉树 递归 树&#xff1a;还是用递归&#xff0c;从最深的节点开始向上判断&#xff0c;保证每个节点的左右子树高度差不大于1&#xff0c;大于1的用 -1 做标…

使用@react-three/fiber,@mkkellogg/gaussian-splats-3d加载.splat,.ply,.ksplat文件

前言 假设您正在现有项目中集成这些包&#xff0c;而该项目的构建工具为 Webpack 或 Vite。同时&#xff0c;您对 Three.js 和 React 有一定的了解。如果您发现有任何错误或有更好的方法&#xff0c;请随时留言。 安装 npm install three types/three react-three/fiber rea…

MySQL:CRUD

MySQL表的增删改查&#xff08;操作的是表中的记录&#xff09; CRUD(增删改查) C-Create新增R-Retrieve检查&#xff0c;查询U-Update更新D-Delete删除 新增&#xff08;Create&#xff09; 语法&#xff1a; 单行数据全列插入 insert into 表名[字段一&#xff0c;字段…

DeBiFormer实战:使用DeBiFormer实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度&#xff0c;DP多卡&#xff0c;EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…

小面馆叫号取餐流程 佳易王面馆米线店点餐叫号管理系统操作教程

一、概述 【软件资源文件下载在文章最后】 小面馆叫号取餐流程 佳易王面馆米线店点餐叫号管理系统操作教程 点餐软件以其实用的功能和简便的操作&#xff0c;为小型餐饮店提供了高效的点餐管理解决方案&#xff0c;提高了工作效率和服务质量 ‌点餐管理‌&#xff1a;支持电…