7.5 KiB
7.5 KiB
组件、代码组织与视觉系统规则
当任务涉及模块、组件、Hook、函数、类型、数据来源、样式归属或旧实现清理时读取。
决策顺序
遇到视觉或交互问题时依次检查:
- 项目是否已有相同含义且符合本规范的组件、函数、统一设计变量或样式;
- 页面是否用了错误组件;
- 父级布局是否给了错误尺寸、对齐或定位;
- 组件默认样式或状态逻辑是否错误;
- 现有组件变体是否足够;
- 是否存在稳定的重复职责,足以新增共享实现;
- 所有使用位置和旧实现是否需要同步处理。
未完成搜索,也未检查组件选择、父布局和默认行为前,不新增组件、函数、样式或组件变体。
系统分工
- 统一设计变量负责跨产品复用的颜色、字号、间距、圆角、阴影和动效含义。
- 基础与共享组件负责自身视觉、交互反馈和完整状态,不由页面逐项重画。
- 业务组件负责组合稳定的业务对象和交互,不把业务差异塞进基础组件。
- 格式化、校验和数据转换等逻辑使用输入相同就返回相同结果的函数;请求、保存和导航由负责业务操作的代码处理,不藏进只负责展示的组件。
- 页面负责取得当前数据和路由信息、安排区域并组合组件,不复制组件内部逻辑。
同一含义只保留一个实现来源。结构相似不等于职责相同;只有职责、输入输出和行为都稳定一致时才共享。
模块与代码组织
- 按业务对象或功能模块组织代码,不按文件类型把整个项目拆散。
- 只服务一个模块的组件、Hook、函数、类型、样式和测试放在该模块附近;多个模块稳定复用后才移入共享层。
- Hook 负责状态和副作用组合;无副作用的格式化、校验和转换使用普通函数;请求和持久化由数据访问或业务操作代码负责。
- 业务类型由拥有该数据的模块定义,组件输入类型放在组件附近,接口请求与响应类型放在接口层;相同含义不重复声明。
- 共享层不得依赖具体业务模块;跨模块使用公开入口,不直接引用对方内部文件。
- 既有目录混乱时,不继续复制错误模式。为当前改动确定正确归属,迁移相关代码、更新引用并删除旧文件;无法一次完成时明确剩余范围。
数据来源
- 同一业务数据只保留一个权威来源;服务端结果、缓存、全局状态、表单草稿和派生视图各自只承担明确职责,不维护能够独立修改的重复副本。
- 能从权威来源计算的值直接派生。只有未提交编辑确实需要时才保留本地草稿,并明确初始化、提交和丢弃边界。
既有实现与历史包袱
- 既有实现只有在职责、行为、数据和样式归属正确时才值得复用;存在时间长、使用页面多或位于共享目录,都不能证明它是正确模式。
- 既有实现持续产生局部补丁、重复状态、影响无关页面的样式、业务开关或不一致行为时,停止在新位置继续使用它。
- 在授权范围内优先修复或替换真正出错的共享实现,处理所有受影响的使用位置后删除旧实现;为纠正问题,可以有计划地改变旧接口、结构或样式组织。
- 新实现已经接管且使用位置完成迁移后,删除旧分支、fallback、legacy 适配层、旧类型、旧状态和失效开关。只有仍有真实兼容对象时才暂时保留,并明确删除条件。
- 无法在当前范围内全部改完时,不得继续复制错误模式;明确记录还剩哪些旧使用位置、这次改到哪里以及后续如何清理,不靠长期保留两套实现来掩盖问题。
允许
- 在共享组件内部维护视觉样式。
- 使用含义明确的组件属性,例如
variant、size、state、loading、destructive。 - 由布局容器控制网格、排列、区域间距和响应式结构。
- 使用正式组件属性或
data-state表达状态。 - 为重复交互建立共享组件。
- 复用已有的格式化、校验和数据转换函数。
- 弹窗内部结构由共享组件和按用途命名的组件变体负责;只有任务实际改变弹窗尺寸、滚动或结构时,才读取 视口与弹窗规则。
- 在交互组件内部统一维护 pointer、hover、active 和 disabled 状态。
禁止
- 在使用组件的位置直接写只服务于当前页面的视觉样式。
- 为共享组件传入视觉型
className后覆盖颜色、尺寸、圆角、阴影或内部布局。 !important修补组件实例。- 页面专属选择器侵入共享组件内部。
- 使用任意数值绕过统一设计变量。
- 用页面名、业务对象名或视觉结果命名组件变体。
- 为一个实例增加没有稳定含义的组件变体。
- 复制组件后只改一点样式。
- 复制函数后改名,或在多个组件中分别维护相同转换和校验。
- 用大量页面名称、业务布尔开关和条件分支制造万能组件。
- 把请求、保存或导航藏进纯展示组件。
- 在 CSS 修复前不检查页面结构、父级布局和组件调用。
- 在使用弹窗的页面重排共享弹窗的标题区、内容区和操作区,或重新定义其高度和滚动方式。
- 在使用共享组件的页面为单个组件补固定宽高。
- 让业务组件样式无边界地累积在一个全局样式文件中。
视觉一致性
- 新页面沿用项目中符合本规范的统一设计变量、组件、布局模式和状态表达,不建立页面专属的设计语言。
- 一致性同时包括颜色、字号、间距、信息密度、动作层级、状态位置、图标含义和交互反馈,不能只统一其中一项。
- 业务差异通过内容、组合和稳定含义表达;不要通过任意视觉值制造差异。
样式归属与清理
- 每段样式必须归属于基础规则、共享组件或明确的业务模块;页面只负责区域布局,不接管组件内部视觉。
- 项目已有的样式组织方式符合归属边界时才沿用;如果业务样式无边界集中、互相覆盖或无法随组件删除,就停止扩大全局文件,重新建立组件或业务模块的样式归属。
- 删除或改名页面结构、样式类、状态或组件变体时,同步删除不再生效的选择器、状态样式、响应式规则、引用和样式文件。
- 新实现能够运行不代表改动完成;旧组件、旧函数和旧样式已经清理,所有受影响的使用位置已经检查,才算完成。
新增组件变体的门槛
同时满足以下条件才新增:
- 差异表达稳定含义,不是页面身份;
- 存在多个使用位置,或明确属于组件公共状态;
- 属性名称能说明使用原因,而非视觉结果;
- 默认行为仍适用于多数场景;
- 能用组件级验证覆盖。
组件变体应说明“为什么存在差异”,不能只说明颜色、数值、页面或业务对象。
尺寸由谁负责
- 页面布局容器负责区域分配,共享组件负责自身稳定尺寸。
- 使用共享组件的页面不得为单个组件补固定宽高;只有任务实际改变固定尺寸、滚动或视口边界时,才读取 视口与弹窗规则。
修改后的审查
修改共享组件、函数或样式后,搜索全部使用位置,检查默认方式、受影响的使用场景和旧实现,并报告未验证项。