QCon 演讲火热征集中,快来分享技术实践与洞见! 了解详情
写点什么

避坑指南:如何在基于组件的应用中使用 CSS 架构

  • 2020-01-12
  • 本文字数:1233 字

    阅读完需:约 4 分钟

避坑指南:如何在基于组件的应用中使用CSS架构

CSS 架构是一个常被开发人员忽视的复杂问题。为简化开发人员的工作,可对每个组件封装(Encapsulate)CSS,由此避免许多 CSS 相关的坑,但这种“变通”做法是以降低可重用性和可扩展性为代价的。


一旦开发人员定义了一个 CSS 类,该类将自动作用于整个应用的范围之内,会修改所有相关元素及其子元素。对于那些结果可预测的简单应用,这种做法非常适用。但是随着应用和团队规模的增长,该做法立刻会出现问题,将导致一些不可预料的问题。


上述问题的最初解决方案是BEM(Block Element Modifier)规范。作为一种方法和命名规范,BEM 为开发人员清晰标识了每个类的行为,有助于避免产生冲突。例如,form__submit–disabled 指示开发人员正在表单内设置一个提交按钮的状态为禁用。


但作为命名规范,难以强制开发人员去遵守 BEM。此后,JavaScript 推出了一些更易于实现的解决方案,包括CSS ModulesStyled Components,并得到了开发人员的采纳。这些方法采用不同的技术路线,在单个组件中添加 CSS,同样解决了许多 BEM 所针对的问题。


解决组件化设计中缺少跨应用架构的问题,涉及三个独立的方面:


  1. UI:包括主题和一般应用行为。

  2. 布局组件(Layout Components):也常被称为“容器”或“智能组件”。布局组件确定指定组件在特定场景中的行为,通常是不可重用的。

  3. 展示组件(Presentational Components):是增强应用功能的可重用代码片段。为增加展示组件的多样性,其中应尽可能避免包含逻辑。

UI

UI 会定义在作用于整个应用的全局 CSS 文件中。主要包括两个方面:


  1. 常量类(Constant):开发人员过去会使用所有主流浏览器都支持的自定义CSS属性,最近可使用 SCSS 或 LESS 变量,


CSS 自定义属性主要有两方面优点。第一,可在运行时做修改。对于转换主题或支持夜景模式,这是一种很好的解决方案。第二,支持在布局组件中修改,开发人员更易于实现小范围内的设计调整。


  1. UI 状态(State)定义通常可分解为三方面:

  2. 修饰符(Modifier)状态:确定各元素的规格(大/小)、设计(主/次)等的变化。

  3. 行为(Behavioral)状态:包括整个应用范围的状态。例如,在线/离线、正在加载等。

  4. 伪(Pseudo)状态:启用/禁用等临时状态,以及:hover 和:focus 等 CSS 状态。

布局组件

布局组件会按指定方式在页面上组织可重用的组件。布局组件的功能可分解为两个方面,一是以设定属性和设计对可重用组件做初始化,二是使用 CSS Grid、Flexbox 等功能将其所控制区域设定为特定的布局。

可重用组件

可重用组件中几乎不包含逻辑。它们从布局组件接收数据,当布局组件执行操作时会触发相关事件(或回调)。


为确保组件的可重用性,开发人员应尽量避免在组件中添加逻辑和设计。具体而言,通常应避免添加显示、宽度、留白等属性。


这并非易事,因为可重用组件常常需要处理比其最初设计更多的场景,例如,支持多行文本的按钮,支持显示更多文本内容的标题等。但可重用组件确保了组件真正的可重用性,无需在应用下次使用时进行重写。


原文链接:


CSS Architecture for Component-Based Applications


2020-01-12 09:152328

评论

发布
暂无评论
发现更多内容

开战在即!与全球伙伴一起打造你的数据应用,TiDB Future App Hackathon 2023 来啦!

PingCAP

数据库 hackathon TiDB

百度文心一格x京东618:打造电商行业首个AI线下广告,节省80%制作成本

飞桨PaddlePaddle

百度 飞桨 AIGC 京东618

洞察开源代码平台“创新力”|2023开放原子全球开源峰会开源协作平台分论坛成功举办

开放原子开源基金会

开源 开放原子全球开源峰会 开放原子 开源协作平台

C语言编程语法—排序算法

芯动大师

C语言 排序算法 6 月 优质更文活动

六大类型JavaScript题型

不叫猫先生

JavaScript 6 月 优质更文活动

当AI大模型遇见金融,这四大挑战不容忽视

索信达控股

全球化财务助力跨国业务的稳定增长和持续发展

用友BIP

基于Spark的大规模日志分析

华为云开发者联盟

开发 华为云 华为云开发者联盟 企业号 6 月 PK 榜

你一定要悄悄学会怎么把Vimeo视频保存到手机相册,然后惊艳所有人!

frank

人体分割识别图像技术的挑战和未来发展

来自四九城儿

把数字中国,建立在行业感知的底座上

脑极体

行业感知

C语言代码封装MQTT协议报文,了解MQTT协议通信过程

DS小龙哥

6 月 优质更文活动

开源教育决定未来|2023开放原子全球开源峰会开源教育与人才分论坛成功召开

开放原子开源基金会

开源 开放原子全球开源峰会 开放原子 开源教育与人才

人体分割识别图像技术的原理及应用

来自四九城儿

互联网行业-镭速文件传输系统方案

镭速

2023-06-15:说一说Redis的Key和Value的数据结构组织?

福大大架构师每日一题

redis 福大大架构师每日一题

微软增加100亿美元AI收入,Salesforce如何对垒?

B Impact

云计算架构设计原则

穿过生命散发芬芳

6 月 优质更文活动

华为云CodeArtBuild减负!云端编译构建,让你的开发省时省力!

华为云PaaS服务小智

云计算 代码 华为云 编译构建

Spring框架中的线程池

demo123567

spring 线程池

GOTC峰会Sermant发布1.1.0-beta版本,带来哪些提升?

华为云开源

#云原生 #开源 流量治理 #微服务

阿里云斩获 4 项年度云原生技术服务优秀案例

阿里巴巴云原生

阿里云 云原生

云小课|RDS for MySQL参数模板一键导入导出,参数配置轻松搞定

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号 6 月 PK 榜

HarmonyOS 极客马拉松2023 正式启动,诚邀极客们用键盘码出无限可能!

说山水

vivo 帐号服务稳定性建设之路-平台产品系列06

vivo互联网技术

帐号 服务稳定性 架构优化

Django笔记四十三之使用uWSGI部署Django系统

Hunter熊

Python django 部署 uwsgi

UI自动化的稳定性和效率

QE_LAB

自动化测试 UI自动化测试 appium

WeOpsV4.1重磅出击,日志监控功能横空出世!

嘉为蓝鲸

运维 日志 weops 嘉为蓝鲸

解析Spring内置作用域及其在实践中的应用

华为云开发者联盟

开发 华为云 华为云开发者联盟 企业号 6 月 PK 榜

TrafficRoute:一体化的DNS解析和流量调度套件

火山引擎边缘云

技术 流量 解析 火山引擎边缘云

视频与图片检索中的多模态语义匹配模型 ——原理、启示、应用与展望

百度Geek说

企业号 6 月 PK 榜 模态 视频模拟 图片模拟 6 月 优质更文活动

避坑指南:如何在基于组件的应用中使用CSS架构_大前端_Guy Nesher_InfoQ精选文章