构建具备生产级质量、可访问性(Accessible)且响应式(Responsive)的面向用户界面(UI)。适用于以下场景:构建或修改界面与页面、创建组件、实现布局、满足 WCAG 可访问性要求、管理状态,或当输出需要呈现专业、真实、生产就绪(production-quality)的视觉与交互效果,而非典型的 AI 生成风格。
前端 UI 工程是一项面向实际任务的技能,主要用于Overview. 构建可访问、 执行和可视化的制作质量用户界面;目标是 UI , 它看起来是由设计意识 e 构建的。
从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;
若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。
构建具备可访问性、高性能与视觉精致度的生产级用户界面。目标是产出由顶尖公司中具备设计素养的工程师打造的 UI —— 而非由 AI 生成的界面。这意味着需严格遵循设计系统、正确实现无障碍支持、采用深思熟虑的交互模式,并杜绝泛化的“AI 审美”。
将组件相关所有内容集中存放:
src/components/
TaskList/
TaskList.tsx # 组件实现
TaskList.test.tsx # 测试文件
TaskList.stories.tsx # Storybook 示例(如使用)
use-task-list.ts # 自定义 Hook(如状态较复杂)
types.ts # 组件专属类型定义(如需要)
优先采用组合而非配置:
// 推荐:可组合// 避免:过度配置 Tasks } />
保持组件职责单一:
// 推荐:只做一件事
export function TaskItem({ task, onToggle, onDelete }: TaskItemProps) {
return (
分离数据获取与呈现逻辑:
// 容器组件:负责数据获取
export function TaskListContainer() {
const { tasks, isLoading, error } = useTasks();
if (isLoading) return ;
if (error) return ;
if (tasks.length === 0) return ;
return ;
}
// 呈现组件:负责渲染
export function TaskList({ tasks }: { tasks: Task[] }) {
return (
选择最简单且可行的方案:
本地状态(useState) → 组件专属 UI 状态 提升的状态(Lifted state) → 在 2–3 个兄弟组件间共享 Context → 主题、认证、本地化等(读多写少) URL 状态(searchParams) → 过滤器、分页、可分享的 UI 状态 服务端状态(React Query、SWR) → 带缓存的远程数据 全局状态(Zustand、Redux) → 复杂的、全应用共享的客户端状态
避免 props 下钻超过 3 层。 若需将 props 穿透多个不使用它们的中间组件,请引入 Context 或重构组件树。
AI 生成的 UI 具有明显可识别的模式。请全部规避:
| AI 默认样式 | 为何存在问题 | 生产级质量做法 |
|---|---|---|
| 全篇紫色/靛蓝色 | 模型默认采用视觉上“安全”的调色板,导致所有应用外观雷同 | 使用项目实际定义的配色方案 |
| 过度使用渐变 | 渐变增加视觉噪声,且常与多数设计系统冲突 | 使用扁平色或与设计系统一致的细微渐变 |
| 全元素圆角(rounded-2xl) | 最大圆角暗示“友好”,但忽略了真实设计中角半径的层级关系 | 统一使用设计系统规定的 border-radius |
| 模板化英雄区(hero section) | 套用布局模板,脱离实际内容与用户需求 | 以内容为先的布局方式 |
| 占位符文案(Lorem ipsum) | 占位文本掩盖了真实内容暴露的问题(长度、换行、溢出) | 使用贴近真实的占位内容 |
| 全局过大内边距 | 均等的大内边距破坏视觉层级并浪费屏幕空间 | 统一使用设计系统定义的间距比例 |
| 通用卡片网格 | 均质化网格是偷懒式布局,忽略信息优先级与用户浏览习惯 | 以目标为导向的布局方式 |
| 阴影过重 | 多层阴影增加内容竞争感,且在低端设备上拖慢渲染性能 | 仅在设计系统明确要求时使用细微或无阴影 |
使用一致的间距比例。禁止随意发明数值:
/* 使用既定比例:例如 0.25rem 增量(或项目所采用的比例) */ /* 推荐 */ padding: 1rem; /* 16px */ /* 推荐 */ gap: 0.75rem; /* 12px */ /* 不推荐 */ padding: 13px; /* 不属于任何标准比例 */ /* 不推荐 */ margin-top: 2.3rem; /* 不属于任何标准比例 */
尊重层级结构:
h1 → 页面标题(每页一个) h2 → 区块标题 h3 → 子区块标题 body → 正文默认文字 small → 次要/辅助文字
不可跳过标题层级。不可将标题样式用于非标题内容。
text-primary、bg-surface、border-default —— 禁止直接使用十六进制值每个组件必须满足以下标准:
// 所有可交互元素必须支持键盘访问
// ✓ 默认可聚焦
Click me // ✗ 不可聚焦
onKeyDown={e => {
if (e.key === 'Enter') handleClick();
if (e.key === ' ') e.preventDefault();
}}
onKeyUp={e => {
if (e.key === ' ') handleClick();
}}>
Click me
// 为缺少可见文本的可交互元素添加标签 // 为表单输入项添加 label // 或在无可见 label 时使用 aria-label
// 内容变更时主动移动焦点
function Dialog({ isOpen, onClose }: DialogProps) {
const closeRef = useRef(null);
useEffect(() => {
if (isOpen) closeRef.current?.focus();
}, [isOpen]);
// 对话框打开时限制焦点范围
return (
);
}
// 禁止显示空白界面
function TaskList({ tasks }: { tasks: Task[] }) {
if (tasks.length === 0) {
return (
No tasks
Get started by creating a new task.
);
}
return 采用移动优先策略,再逐步扩展:
// Tailwind:移动优先响应式需在以下断点进行测试:320px、768px、1024px、1440px。
加载与过渡效果
// 骨架屏加载(非旋转动画用于内容区域) function TaskListSkeleton() { return ({Array.from({ length: 3 }).map((_, i) => ( ))}); } // 乐观更新以提升感知速度 function useToggleTask() { const queryClient = useQueryClient(); return useMutation({ mutationFn: toggleTask, onMutate: async (taskId) => { await queryClient.cancelQueries({ queryKey: ['tasks'] }); const previous = queryClient.getQueryData(['tasks']); queryClient.setQueryData(['tasks'], (old: Task[]) => old.map(t => t.id === taskId ? { ...t, done: !t.done } : t) ); return { previous }; }, onError: (_err, _taskId, context) => { queryClient.setQueryData(['tasks'], context?.previous); }, }); }参阅
关于详细的无障碍要求及测试工具,请查阅
references/accessibility-checklist.md。常见借口
借口 事实 “无障碍只是锦上添花” 在许多司法管辖区属法律强制要求,亦是工程品质基准。 “我们稍后再做响应式” 后期补救响应式设计的难度是初始构建的 3 倍。 “设计稿尚未定稿,所以暂不加样式” 应使用设计系统默认值。无样式 UI 会给评审者留下严重缺陷的第一印象。 “这只是个原型” 原型极易演变为生产代码。务必从一开始就打好基础。 “AI 审美暂时可以接受” 这会传递低质量信号。请自始即采用项目真实的设计系统。 危险信号
- 单个组件超过 200 行(应拆分)
- 内联样式或任意像素值
- 缺失加载态、错误态或空态
- 未进行键盘导航测试
- 仅靠颜色表示状态(如红/绿色而无文字或图标)
- 泛化“AI 风格”(紫色渐变、超大卡片、模板化布局)
验证清单
完成 UI 开发后,请检查:
- 组件渲染无控制台报错
- 所有可交互元素支持键盘访问(Tab 键遍历页面)
- 屏幕阅读器可准确传达页面内容与结构
- 响应式适配:在 320px、768px、1024px、1440px 断点下均正常工作
- 加载态、错误态、空态均已覆盖
- 符合项目设计系统(间距、颜色、排版)
- 开发者工具或 axe-core 中无无障碍警告