写点什么

避坑指南:如何在基于组件的应用中使用 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:152345

评论

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

另一视角看元宇宙:元宇宙文化正悄然改变世界

CECBC

关于数字货币的几点问题及回应

CECBC

java培训JVM内存模型和GC机制的解析

@零度

Java JVM GC

老旧项目二次开发指南

阿毛

重构 项目架构 二次开发

区块链如何助推著原创保护

CECBC

一文论述元宇宙、NFT及不可回避的Web3 时代

CECBC

Linux驱动开发-外部中断的注册使用(按键为例)

DS小龙哥

4月月更

upnp.exe进程

Sher10ck

日积月累

API对接之模板方法

Rubble

4月日更 4月月更

Docker 实战教程之从入门到提高 (七)

汪子熙

Docker 容器 docker image 容器镜像 4月月更

读《Software Engineering at Google》(08)

术子米德

架构师成长笔记

读《Software Engineering at Google》(10)

术子米德

架构师成长笔记

Go 入门很简单:Writer和Reader接口

宇宙之一粟

接口 Go 语言 4月月更

基于云效Codeup一键恢复删库保护数据资源,程序员删库跑路不复存在

阿里云云效

云计算 阿里云 程序员 代码安全 删库保护

一文读懂在OpenHarmony轻量设备开发应用

OpenHarmony开发者

OpenHarmony OpenHarmony应用开发 轻量设备

利用 Dio 完成数据删除操作

岛上码农

ios 跨平台 移动端开发 flutter开发 安卓开发

[Day19]-[动态规划]分割等和子集

方勇(gopher)

LeetCode 动态规划 数据结构和算法

高效压缩位图在推荐系统中的应用

vivo互联网技术

redis 推荐 存储

读《Software Engineering at Google》(09)

术子米德

架构师成长笔记

企业管理理念之人本善还是本恶

秋去冬来春未远

企业管理 人性本善 人性本恶 一念之差

Camtasia Studio2022汉化版

茶色酒

Camtasia2022

Web3.0 时代,我们的生活将产生什么变化?

CECBC

TASKCTL C/S客户端两种不同的登陆模式

敏捷调度TASKCTL

分布式 ETL 批量操作 自动化运维 调度任务

什么是知识库管理系统?如何搭建企业知识库系统?

小炮

企业知识管理 企业知识管理工具 知识管理系统

在线YAML转CSV工具

入门小站

工具

在线CSV转Plaintext(txt)工具

入门小站

工具

Nocalhost - 让云原生时代的开发更高效

沃趣科技

云原生 Nocalhost 应用开发

论利润中心内部核算和集团核算

秋去冬来春未远

阿米巴 利润中心 集团成本

web前端培训javaScript的内存管理机制分享

@零度

JavaScript 前端开发

spring-cloud-kubernetes的服务发现和轮询实战(含熔断)

程序员欣宸

java 4月月更

不同阶段的人,如何学习Rust?加入非凸,一起学习!

非凸科技

rust 招聘 编程语言‘

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