真实面经题目 · 原创解析
AI 返回 ECharts 图表配置时如果出错,前端应如何做校验、降级、重试、可观测性和用户提示?
这题考前端工程师能否把 AI 生成 ECharts 配置当成不可信输入处理,并设计校验、降级、重试、观测和测试闭环,保证图表功能稳定可用。
真实面经题目 · 原创解析
这题考前端工程师能否把 AI 生成 ECharts 配置当成不可信输入处理,并设计校验、降级、重试、观测和测试闭环,保证图表功能稳定可用。
AI 返回 ECharts 配置出错时,前端不能直接 setOption。我的处理会分五层。第一是契约层,尽量让 AI 返回受约束的 JSON schema,而不是任意 option;只允许业务支持的图表类型、字段和数据结构。第二是校验层,在前端解析 JSON 后做 schema 校验、字段白名单、数据长度、series/xAxis/yAxis/dataset 对齐、数值类型和 formatter 安全检查。第三是渲染保护,调用 ECharts 初始化和 setOption 时加错误捕获,处理空容器、尺寸异常、实例销毁、异步竞态和配置不兼容。第四是降级和重试,轻微问题可以自动修复或补默认值,严重问题降级成表格、空状态或上一次可用图表,并带错误上下文请求 AI 重新生成。第五是可观测性,记录错误类型、模型版本、配置摘要、用户 query、渲染耗时、重试次数和降级结果,用测试集、回放和报警持续优化。核心原则是把 AI 输出当作外部不可信数据,用确定性工程边界兜住不确定性。
AI 可能返回非法 JSON、字段拼错、图表类型不支持、series 和 axis 不匹配、数据维度不一致、颜色或样式异常、空数据、过大数据量,甚至返回解释文本而不是配置。前端不能假设模型一定遵守 ECharts option 规范,要把它当成外部输入做完整防御。
最好的错误处理不是等 setOption 崩溃,而是在生成阶段限制输出。可以定义业务级 schema,例如 chartType、title、dimensions、dataset、series、encoding、legend、tooltip 等字段,而不是让 AI 直接生成完整任意 option。前端再把业务 schema 转换成 ECharts option,这样可控性、兼容性和安全性都会更好。
结构校验看 JSON 是否可解析、必填字段是否存在、字段类型是否正确;语义校验看 xAxis、yAxis、dataset、series、encode 是否能对齐,数据是否为空,数值和类目是否合理,图表类型是否支持;安全校验要限制 formatter、rich text、URL、HTML 和函数注入,不要执行 AI 返回的任意代码。
即使配置合法,渲染也可能因为容器尺寸为 0、组件卸载、异步请求乱序、实例重复初始化、主题加载失败、大数据卡顿或 ECharts 版本差异出错。前端要管理 init、setOption、resize、dispose 的时机,使用请求 id 或 abort 控制旧请求,捕获渲染异常并避免页面整体崩溃。
轻微错误可以自动修复,例如补默认 title、过滤未知字段、截断过长数据、补齐颜色和 legend。中等错误可以降级为更简单的图表,例如复杂组合图降为柱状图或折线图。严重错误则展示结构化表格、原始数据摘要、空状态或上一次成功图表,并提示用户重新生成。降级要保证用户还能理解数据,而不是只显示报错。
如果 AI 返回配置错误,重试时要带上错误原因和可修复约束,例如缺少 xAxis、series 数据长度不一致、chartType 不支持。重试次数要有限制,避免陷入循环。对可确定修复的问题优先本地修复,对语义不清或数据理解错误的问题再请求模型重新生成。
需要记录 parse_error、schema_error、semantic_error、render_error、fallback_used、retry_success 等事件,并带上配置摘要、图表类型、数据规模、模型版本、用户意图、浏览器信息和渲染耗时。测试上要有非法 JSON、缺字段、空数据、大数据、竞态、卸载、主题切换和视觉回归用例。没有观测和测试,就无法知道 AI 图表失败率是否下降。
完整 option 空间太大,字段多、兼容性复杂,还可能包含不安全 formatter 或无效组合。业务 schema 更小、更可控,前端可以确定性转换和兜底。
缺少标题、legend 默认值、未知样式字段、颜色缺省、数据过长截断、简单类型转换等可以自动修复。series 和数据语义严重不匹配、图表类型不支持或用户意图理解错,通常需要重新生成或降级。
不要执行 AI 返回的函数字符串或 HTML。formatter 应使用前端内置模板或白名单枚举,必要变量由安全的数据映射提供,避免 eval、new Function 和不受控 DOM 注入。
用户连续提问或切换数据时,旧请求可能晚于新请求返回,覆盖最新图表;组件卸载后旧请求还可能 setOption 导致异常。需要请求 id、AbortController、mounted 状态和实例生命周期保护。
衡量图表生成成功率、首次可用率、schema 错误率、渲染错误率、重试成功率、降级率、用户重试率、页面崩溃率和用户反馈。还要用错误样本回放验证修复后不再复现。