AI 生成组件库设计规范:从设计系统到智能生成的标准化桥梁
AI 生成组件库设计规范:从设计系统到智能生成的标准化桥梁
一、组件库规范的痛点:一致性靠人治,而非规则
组件库的设计规范通常以文档形式存在——Figma 中的组件说明、Storybook 中的用法示例、Markdown 中的规范文档。但文档是静态的,无法阻止开发者写出不符合规范的代码。间距用了 14px 而非 16px、按钮颜色用了自定义值而非 Token、组件嵌套层级过深——这些偏差在 Code Review 中很难逐一发现。
AI 生成组件库设计规范的思路是:将设计规范转化为机器可读的约束规则,AI 在生成组件代码时自动遵守这些规则。更进一步,AI 可以根据设计规范自动生成组件代码骨架,开发者只需填充业务逻辑。规范从"文档约束"升级为"代码约束"。
二、AI 组件生成架构:从规范到代码的约束链
AI 组件生成的核心是"规范即约束"——设计规范被转化为结构化的规则文件(JSON Schema),AI 在生成代码时必须满足这些约束。规则文件包含:组件结构约束(必须包含哪些子元素)、样式约束(必须使用哪些 Token)、交互约束(必须支持哪些状态)、可访问性约束(必须满足哪些 ARIA 要求)。
flowchart TB A[设计规范文档] --> B[规则提取] B --> C[结构化规则文件<br/>JSON Schema] C --> D[AI 代码生成器] D --> E[组件代码骨架] E --> F[约束校验] F -->|通过| G[可用组件] F -->|不通过| H[修正建议] C --> I[Lint 规则<br/>ESLint/Stylelint] I --> J[CI 校验] subgraph 规则内容 K[结构约束: 必须包含 label] L[样式约束: 必须用 Token] M[交互约束: 必须支持 disabled] N[可访问性: 必须有 aria-label] end C --> K C --> L C --> M C --> N关键设计点:规则文件是单一事实来源(Single Source of Truth),AI 生成、Lint 校验和 CI 检查都基于同一份规则。规则变更时,所有环节同步更新。
三、生产级代码实现:规范规则化与 AI 生成
3.1 组件规范规则定义
// 组件规范规则定义 // 为什么用 JSON Schema 而非自然语言: // JSON Schema 是机器可读的,AI 和 Lint 工具 // 都可以解析;自然语言有歧义,无法自动校验 interface ComponentSpec { name: string; category: "layout" | "input" | "display" | "navigation"; description: string; // 结构约束 structure: { requiredChildren: string[]; // 必须包含的子元素 maxNestingDepth: number; // 最大嵌套层级 allowedParents: string[]; // 允许的父组件 }; // 样式约束 styles: { mustUseTokens: string[]; // 必须使用的 Token forbiddenValues: string[]; // 禁止使用的值 allowedVariants: string[]; // 允许的变体 }; // 交互约束 interactions: { requiredStates: string[]; // 必须支持的状态 requiredEvents: string[]; // 必须触发的事件 requiredAria: string[]; // 必须的 ARIA 属性 }; // Props 约束 props: { required: string[]; optional: Record<string, { type: string; default?: unknown; validation?: string; }>; }; } // Button 组件规范示例 const buttonSpec: ComponentSpec = { name: "Button", category: "input", description: "可点击的按钮组件", structure: { requiredChildren: [], maxNestingDepth: 2, allowedParents: ["Form", "Toolbar", "Dialog"], }, styles: { mustUseTokens: [ "--button-bg", "--button-text", "--button-radius", "--button-padding", ], forbiddenValues: [ "color: #", // 禁止硬编码颜色 "padding: [0-9]", // 禁止硬编码间距 ], allowedVariants: ["primary", "secondary", "ghost", "danger"], }, interactions: { requiredStates: ["default", "hover", "active", "disabled", "focus"], requiredEvents: ["onClick"], requiredAria: ["aria-label", "aria-disabled"], }, props: { required: ["children"], optional: { variant: { type: "'primary' | 'secondary' | 'ghost' | 'danger'", default: "'primary'", }, size: { type: "'sm' | 'md' | 'lg'", default: "'md'", }, disabled: { type: "boolean", default: "false", }, loading: { type: "boolean", default: "false", }, }, }, };3.2 AI 组件代码生成器
// AI 组件代码生成 Prompt 模板 class ComponentGenerator { private spec: ComponentSpec; constructor(spec: ComponentSpec) { this.spec = spec; } generatePrompt(): string { // 将规范转化为 AI 可理解的 Prompt // 为什么将规范嵌入 Prompt:AI 模型不知道 // 你的设计规范,必须显式告知约束条件; // 规范越精确,生成代码的合规率越高 return ` 你是一个前端组件开发专家。请根据以下规范生成 React 组件代码。 ## 组件规范 - 名称: ${this.spec.name} - 分类: ${this.spec.category} - 描述: ${this.spec.description} ## 结构约束 - 必须包含的子元素: ${this.spec.structure.requiredChildren.join(", ") || "无"} - 最大嵌套层级: ${this.spec.structure.maxNestingDepth} - 允许的父组件: ${this.spec.structure.allowedParents.join(", ")} ## 样式约束 - 必须使用的设计 Token: ${this.spec.styles.mustUseTokens.join(", ")} - 禁止使用的值: ${this.spec.styles.forbiddenValues.join(", ")} - 允许的变体: ${this.spec.styles.allowedVariants.join(", ")} ## 交互约束 - 必须支持的状态: ${this.spec.interactions.requiredStates.join(", ")} - 必须触发的事件: ${this.spec.interactions.requiredEvents.join(", ")} - 必须的 ARIA 属性: ${this.spec.interactions.requiredAria.join(", ")} ## Props 定义 - 必需 Props: ${this.spec.props.required.join(", ")} - 可选 Props: ${Object.entries(this.spec.props.optional) .map(([k, v]) => `${k}: ${v.type} (默认: ${v.default})`) .join(", ")} ## 输出要求 1. 使用 TypeScript 2. 使用 CSS Modules 3. 所有样式值必须使用设计 Token(var(--token-name)) 4. 包含完整的类型定义 5. 包含错误处理和边界情况 6. 包含中文注释说明设计决策 `; } }3.3 生成代码的约束校验
// 组件代码约束校验器 class ComponentValidator { private spec: ComponentSpec; constructor(spec: ComponentSpec) { this.spec = spec; } validate(code: string): ValidationResult { const errors: string[] = []; // 检查 Token 使用 // 为什么校验 Token:AI 生成的代码可能 // 用硬编码值替代 Token,这是最常见的 // 规范违反;自动校验比人工 Review 更可靠 for (const token of this.spec.styles.mustUseTokens) { if (!code.includes(`var(${token})`)) { errors.push(`缺少必需的 Token: ${token}`); } } // 检查禁止值 for (const forbidden of this.spec.styles.forbiddenValues) { const regex = new RegExp(forbidden); if (regex.test(code)) { errors.push(`使用了禁止的值: ${forbidden}`); } } // 检查 ARIA 属性 for (const aria of this.spec.interactions.requiredAria) { if (!code.includes(aria)) { errors.push(`缺少必需的 ARIA 属性: ${aria}`); } } // 检查状态支持 for (const state of this.spec.interactions.requiredStates) { const statePatterns: Record<string, string[]> = { hover: [":hover", "data-hover"], active: [":active", "data-active"], disabled: [":disabled", "aria-disabled"], focus: [":focus", ":focus-visible"], }; const patterns = statePatterns[state] || []; const hasState = patterns.some((p) => code.includes(p)); if (!hasState) { errors.push(`缺少状态支持: ${state}`); } } return { valid: errors.length === 0, errors, }; } }四、AI 组件生成的架构权衡:生成质量、规范覆盖与人工介入
AI 生成代码的质量波动:同一规范下,AI 生成的代码质量可能差异很大——有时完全符合规范,有时遗漏关键约束。解决方案是多次生成取最优,或用约束校验器自动修正。但修正本身可能引入新问题,建议生成后人工审查。
规范规则的覆盖度:设计规范中有些规则难以形式化——如"视觉层级应清晰"、"动画应自然"。这些主观规则无法用 JSON Schema 表达,仍需人工判断。AI 组件生成只能覆盖可形式化的规则,主观规则需要设计师审查。
组件变体的组合爆炸:一个 Button 有 4 个变体 × 3 个尺寸 × 2 个状态 = 24 种组合。AI 需要为每种组合生成正确的样式,但组合数量随约束维度指数增长。建议只生成最常用的组合(如 primary + md + default),其余组合通过代码逻辑推导。
规范演进时的向后兼容:设计规范会随版本迭代更新,新规范可能与旧组件不兼容。建议在规范文件中增加版本号,AI 生成时指定目标版本,Lint 校验时检查版本兼容性。
五、总结
AI 生成组件库设计规范的核心是将"文档约束"转化为"代码约束"。JSON Schema 格式的规则文件是单一事实来源,AI 生成、Lint 校验和 CI 检查都基于同一份规则。落地时建议先为核心组件(Button、Input、Card)建立规范规则,验证 AI 生成的合规率,再逐步扩展到其他组件。生成代码必须经过约束校验和人工审查,AI 是辅助而非替代。
