Figma 到 React 组件:Design Token 与 AST 如何划分自动化边界 Figma 到 React 组件Design Token 与 AST 如何划分自动化边界从 Figma 直接生成 React 组件很诱人但布局、Token 映射和 Props 契约不应全部交给模型猜。下面把确定性转换留给规则和 AST只让模型处理注释与用例等开放任务。判断方案是否省工应以实际 PR 的返工记录为准。1. 失败复盘全自动大模型生成组件的三大问题仔细剖析当时生成的组件库代码导致自动化实验崩塌的核心矛盾有三点Token 映射混乱Token Disconnect大模型无法准确感知企业已有的 Design Token 体系。当 Figma 中出现#3B82F6颜色时大模型倾向于硬编码color: #3B82F6而不是映射到系统定义的var(--color-primary-500)。DOM 结构膨胀DOM Bloat多模态视觉模型理解 UI 布局时往往逐层解析绝对坐标Absolute Positioning生成了大量带有position: absolute; top: 12px; left: 45px的废弃结构完全丢失了响应式布局与 Flexbox/Grid 的语义化逻辑。接口契约不可控Unstable API Contracts大模型在生成组件 Props 接口时毫无规律。今天生成的是onClick明天生成的是onPress状态管理有时混用useState有时又写出闭包漏洞。2. 演进方案确定性 AST 规则引擎 局部 LLM 增量辅助在吸取教训后可以重构组件库自动化流水线。核心思想是“确定性归确定性概率归概率”布局解析、Design Tokens 映射、TypeScript 类型声明等强规范部分全部交给确定的 Figma REST API Style Dictionary AST Transpiler 链条处理大模型仅在局部负责补充组件注释、生成 Mock 测试数据以及将自然语言转化成复杂的组件使用 Example。3. 核心实现基于 Node.js 的确定性 Design Token 与代码转换引擎以下是重构后的组件自动化转换器核心逻辑。代码展示了如何使用确定性的节点扫描与 Style Dictionary 规范将 Figma 属性精准转换为符合工程规范的代码import fs from fs; import path from path; interface FigmaNode { id: string; name: string; type: string; fills?: Array{ type: string; color?: { r: number; g: number; b: number; a: number } }; children?: FigmaNode[]; style?: Recordstring, any; } interface DesignTokenMap { [colorHex: string]: string; } export class ComponentAutoGenerator { private tokenMap: DesignTokenMap; constructor(tokenMap: DesignTokenMap) { this.tokenMap tokenMap; } /** * 将 RGB(0~1) 转换为标准的 HEX 颜色格式 */ private rgbToHex(r: number, g: number, b: number): string { const toHex (val: number) { const hex Math.round(val * 255).toString(16); return hex.padStart(2, 0); }; return #${toHex(r)}${toHex(g)}${toHex(b)}.toUpperCase(); } /** * 确定性扫描 Figma 树节点提取并替换为 Design Token */ public parseFigmaNodeToCssVars(node: FigmaNode): Recordstring, string { const cssStyles: Recordstring, string {}; // 1. 解析背景色与 Token 映射 if (node.fills node.fills.length 0) { const fill node.fills[0]; if (fill.type SOLID fill.color) { const hex this.rgbToHex(fill.color.r, fill.color.g, fill.color.b); // 强行阻断硬编码 HEX查找映射的 Design Token const matchedToken this.tokenMap[hex] || /* Warning: 未定义的颜色 ${hex} */ ${hex}; cssStyles[background-color] matchedToken; } } // 2. 确定性推导 Flexbox 布局 semantics if (node.type FRAME || node.type COMPONENT) { cssStyles[display] flex; cssStyles[flex-direction] node.style?.layoutMode VERTICAL ? column : row; if (node.style?.itemSpacing) { cssStyles[gap] ${node.style.itemSpacing}px; } } return cssStyles; } /** * 生成干净、语义化的 React TSX 模板 */ public generateReactComponent(componentName: string, styles: Recordstring, string): string { const styleString Object.entries(styles) .map(([key, val]) ${key}: ${val}) .join(,\n); return import React from react; export interface ${componentName}Props { children?: React.ReactNode; className?: string; onClick?: () void; } /** * 确定性流水线生成的组件骨架 - ${componentName} */ export const ${componentName}: React.FC${componentName}Props ({ children, className , onClick }) { return ( div className{className} onClick{onClick} style{{ ${styleString} }} {children} /div ); }; ; } }4. 方案对比纯大模型生成 vs 确定性 AST 规则局部 LLM经过重构后可以将之前的失败方案与当前的新架构在组件自动化生成场景下进行对比压测评估维度纯 Vision LLM 全自动生成失败实验确定性 AST 规则 局部 LLM现行方案差异分析Design Token 命中率记录纯 Vision LLM 全自动生成失败实验记录确定性 AST 规则 局部 LLM现行方案解决样式断层问题平均 DOM 嵌套层级AST 统计纯 Vision LLM 输出AST 统计规则 局部 LLM 输出比较分布而非单个样例代码 Lint 通过率记录纯 Vision LLM 全自动生成失败实验记录确定性 AST 规则 局部 LLM现行方案无须人工大量重构单组件生成开销记录纯 Vision LLM 全自动生成失败实验记录确定性 AST 规则 局部 LLM现行方案记录差异分析PR 前端二次修改率记录纯 Vision LLM 全自动生成失败实验记录确定性 AST 规则 局部 LLM现行方案研发效率真正提升5. 总结与反思那次失败的自动化实验给该工程团队留下了非常珍贵的资产AI 擅长“填空”而非“画图纸”在设计系统这种对一致性、确定性要求极高的场景中应该用代码解析器Parser、编译器Compiler和类型检查器TypeScript来画图纸、建骨架再让 AI 充当助手的角色去完成注释撰写、单元测试生成等辅助工作。规范先行工具在后没有建立标准化 Design Tokens 和 Figma 命名规范前任何自动化工具无论是脚本还是 AI都只会加速烂代码的堆积。重视 CI 中的确定性校验门禁在 Git PR 自动化流水线中配置 Stylelint、ESLint 和 TypeScript 强校验门禁。一旦生成的组件违反 Design Token 规范直接拒绝 Merge不要让带隐患的代码溜进主干。