对 CSS 工程化的理解

news2025/1/20 16:32:03

CSS 工程化是为了解决以下问题:

  1. 宏观设计:CSS 代码如何组织、如何拆分、模块结构怎样设计?
  2. 编码优化:怎样写出更好的 CSS?
  3. 构建:如何处理我的 CSS,才能让它的打包结果最优?
  4. 可维护性:代码写完了,如何最小化它后续的变更成本?如何确保任何一个同事都能轻松接手?

以下三个方向都是时下比较流行的、普适性非常好的 CSS 工程化实践:

  • 预处理器:Less、 Sass 等;
  • 重要的工程化插件: PostCss;
  • Webpack loader 等 。

基于这三个方向,可以衍生出一些具有典型意义的子问题,这里我们逐个来看:

(1)预处理器:为什么要用预处理器?它的出现是为了解决什么问题?

预处理器,其实就是 CSS 世界的“轮子”。预处理器支持我们写一种类似 CSS、但实际并不是 CSS 的语言,然后把它编译成 CSS 代码:

那为什么写 CSS 代码写得好好的,偏偏要转去写“类 CSS”呢?这就和本来用 JS 也可以实现所有功能,但最后却写 React 的 jsx 或者 Vue 的模板语法一样。

随着前端业务复杂度的提高,前端工程中对 CSS 提出了以下的诉求:

  1. 宏观设计上:我们希望能优化 CSS 文件的目录结构,对现有的 CSS 文件实现复用;
  2. 编码优化上:我们希望能写出结构清晰、简明易懂的 CSS,需要它具有一目了然的嵌套层级关系,而不是无差别的一铺到底写法;我们希望它具有变量特征、计算能力、循环能力等等更强的可编程性,这样我们可以少写一些无用的代码;
  3. 可维护性上:更强的可编程性意味着更优质的代码结构,实现复用意味着更简单的目录结构和更强的拓展能力,这两点如果能做到,自然会带来更强的可维护性。

这三点是传统 CSS 所做不到的,也正是预处理器所解决掉的问题。预处理器普遍会具备这样的特性:

  • 嵌套代码的能力,通过嵌套来反映不同 css 属性之间的层级关系 ;
  • 支持定义 css 变量;
  • 提供计算函数;
  • 允许对代码片段进行 extend 和 mixin;
  • 支持循环语句的使用;
  • 支持将 CSS 文件模块化,实现复用。

(2)PostCss:PostCss 是如何工作的?我们在什么场景下会使用 PostCss?

它和预处理器的不同就在于,预处理器处理的是 类CSS,而 PostCss 处理的就是 CSS 本身。Babel 可以将高版本的 JS 代码转换为低版本的 JS 代码。PostCss 做的是类似的事情:它可以编译尚未被浏览器广泛支持的先进的 CSS 语法,还可以自动为一些需要额外兼容的语法增加前缀。更强的是,由于 PostCss 有着强大的插件机制,支持各种各样的扩展,极大地强化了 CSS 的能力。

PostCss 在业务中的使用场景非常多:

  • 提高 CSS 代码的可读性:PostCss 其实可以做类似预处理器能做的工作;
  • 当我们的 CSS 代码需要适配低版本浏览器时,PostCss 的 Autoprefixer 插件可以帮助我们自动增加浏览器前缀;
  • 允许我们编写面向未来的 CSS:PostCss 能够帮助我们编译 CSS next 代码;

(3)Webpack 能处理 CSS 吗?如何实现?

  • Webpack 在裸奔的状态下,是不能处理 CSS 的,Webpack 本身是一个面向 JavaScript 且只能处理 JavaScript 代码的模块化打包工具;
  • Webpack 在 loader 的辅助下,是可以处理 CSS 的。

如何用 Webpack 实现对 CSS 的处理:

  • Webpack 中操作 CSS 需要使用的两个关键的 loader:css-loader 和 style-loader
  • 注意,答出“用什么”有时候可能还不够,面试官会怀疑你是不是在背答案,所以你还需要了解每个 loader 都做了什么事情:
    • css-loader:导入 CSS 模块,对 CSS 代码进行编译处理;
    • style-loader:创建style标签,把 CSS 内容写入标签。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SQL基础——查询基础

查询基础前言整体思维导图列的查询语法2.1 基本的SELECT语句代码示例:从Product表中输出3列执行结果查询出所有的列语法2.2 查询全部的列代码示例2.2 输出Product表中全部的列执行结果为列设置别名代码示例2.3 为列设置别名执行结果代码示例2.4 设置中文别名执行结果…

Redis持久化没玩明白,你就会把缓存数据丢了

引言 我们都知道Redis是微服务架构中重要的基础数据库中间件,通过Redis可以将数据库中的数据缓存到内存中,当服务端有数据查询请求的时候,可以直接从内存中获取数据。如此,一方面服务端可以获得比较快的数据请求响应,…

透明质酸-嵌段共聚物 透明质酸修饰聚乳酸 HA-PLA/PCL/PLGA/PEI/PLL

品牌:为华生物 产地:广州 中文名称:透明质酸-聚乳酸 英文名称:HA-PLA 溶解度:溶于部分有机溶剂 保存时间:一年 PLA分子量:根据客户要求定制 HA分子量:3000--1500K 其他分子量可根据客…

鑫磊股份通过注册:年营收8.2亿 为钟仁志与蔡海红夫妻店

雷递网 雷建平 12月15日鑫磊压缩机股份有限公司(简称:“鑫磊股份”)日前通过注册,准备在深交所创业板上市。鑫磊股份计划募资4.53亿元,其中,1.97亿元用于新增年产3万台螺杆式空压机技改项目,1.0…

Python+Selenium使用Page Object实现页面自动化测试

📌 博客主页: 程序员二黑 📌 专注于软件测试领域相关技术实践和思考,持续分享自动化软件测试开发干货知识! 📌 公号同名,欢迎加入我的测试交流群,我们一起交流学习! 目录…

03解锁源码分析-ReentrantReadWriteLock原理-AQS-并发编程(Java)

文章目录1 读锁解锁1.1 tryReleaseShared()1.2 doReleaseShared()1.3 unparkSuccessor()1.4 示意图2 写锁解锁2.1 tryRelease()2.2 尝试解锁成功2.3 setHeadAndPropagate()5 后记1 读锁解锁 查看下读锁的解锁相关源代码: public void unlock() {sync.releaseShare…

【实时数仓】在Hbase建立维度表、保存维度数据到Hbase、保存业务数据到kafka主题

文章目录一 分流Sink之建立维度表到HBase(Phoenix)1 拼接建表语句(1)定义配置常量类(2)引入依赖(3)hbase-site.xml(4)在phoenix中执行(5)增加代码a TableProc…

Docker安装简单命令

一、 Docker是什么? 要了解Docker,首先要了解什么是容器? 容器是一个软件的轻量级独立可执行软件包,包含运行它所需的一切:代码,运行时,系统工具,系统库,设置。不管环境如何&…

C++(第十二篇):多态(虚函数、抽象类、虚函数表、虚表指针、多继承下的多态)

📒博客主页:Morning_Yang丶 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 📌本文所属专栏: 【C拒绝从入门到跑路】 🙏作者水平有限,如果发现错误,敬请指正&…

13485-59-1,二肽Ala-Pro,H2N-AP-OH

Substrate for skin fibroblast prolidase.皮肤成纤维细胞prolida酶的底物。 编号: 199181中文名称: 二肽Ala-Pro英文名: Ala-ProCAS号: 13485-59-1单字母: H2N-AP-OH三字母: H2N-Ala-Pro-COOH氨基酸个数: 2分子式: C8H14N2O3平均分子量: 186.21精确分子量: 186.1等电点(PI): 6…

web前端期末大作业:红色主题中国文化网页设计与实现——基于HTML+CSS实现中国梦(20页)

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

电脑技巧:Win11系统新增的磁盘分区功能介绍

很多用户发现,新买的电脑中出厂自带的硬盘只有一个分区,目前只有少部分电脑机型出厂会有分多个分区的。 磁盘的单一分区往往不能满足我们的使用需要,Win7/8/10我们都知道可以在磁盘管理下通过压缩卷的方式来分区,Win11操作系统又新…

C# 程序的错误与调试

一 错误的zhongl 程序的错误通常可以分为三大类 ① 语法错误 ② 运行错误 ③ 逻辑错误 二 语法错误 1 常见的语法错误 ① 如括号不配对,多了或少了分号; ② 字母写错,变量未定义,控件命名写错; ③ 函数少了一个参数…

2022面试官常考的前端面试题

Ajax 它是一种异步通信的方法,通过直接由 js 脚本向服务器发起 http 通信,然后根据服务器返回的数据,更新网页的相应部分,而不用刷新整个页面的一种方法。 面试手写(原生): //1:创建…

大一学生《Web编程基础》期末网页制作 HTML+CSS鲜花网页设计实例

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

NLP学习笔记(二) LSTM基本介绍

大家好,我是半虹,这篇文章来讲长短期记忆网络 (Long Short-Term Memory, LSTM) 文章行文思路如下: 首先通过循环神经网络引出为啥需要长短期记忆网络然后介绍长短期记忆网络的核心思想与运作方式最后通过简短的代码深入理解长短期记忆网络的…

Java面试题总结-hashcode和equals

前段时间有朋友问我:“你重写过 hashcode 和 equals 么,为什么重写 equals 时必须重写 hashCode 方法?” 之前的学习中有深入了解过,后来很久没复习了,淡忘许多,回答的时候也有很多地方卡壳,干脆…

【数据结构Java版】Queue队列的活用

目录 一、队列的定义 二、队列的使用 (1)主要方法 (2)实例演示 ​(3)注意事项 三、队列的模拟实现 四、循环队列 (1)循环队列定义 ​(2)循环队列的表…

web前端期末大作业:美食文化网页设计与实现——美食餐厅三级(HTML+CSS+JavaScript)

👨‍🎓静态网站的编写主要是用HTML DIVCSS JS等来完成页面的排版设计👩‍🎓,常用的网页设计软件有Dreamweaver、EditPlus、HBuilderX、VScode 、Webstorm、Animate等等,用的最多的还是DW,当然不同软件写出的…

Cambridge IGCSE Mathematics真题讲解1

考试局:Cambridge Assessment International Education (CAIE)考试类别:Cambridge International General Certificate of Secondary Education (IGCSE)考试科目:Mathematics考试单元:Paper 2 (Extended)试卷代码:0580…