# 1. 长会话如何用虚拟列表和稳定锚点渲染,流式增长时怎样避免滚动跳动 A 虚拟列表仅用于减少内存,与滚动位置无关 B 用稳定 key、scroll anchoring 并区分"是否在底部"决定是否自动跟随,避免流式增长跳动 ✓ 正确答案 C 流式增长时总是自动滚到底部 D 无需虚拟列表,直接渲染全部消息即可
# 2. 如何用 rAF/时间片节流增量更新,同时保证停止按钮、输入框和页面滚动响应 A 每个 token 都立即渲染,保证实时性 B 用 rAF/时间片批量更新并让出主线程,保证停止按钮、输入和滚动及时响应 ✓ 正确答案 C 渲染优先级最高,停止按钮可稍后响应 D 时间片调度与输入框响应无关
# 3. AbortController 能取消哪些浏览器工作,服务端模型推理为何还需要独立取消协议 A AbortController 能直接取消服务端模型推理 B 前端 abort 后服务端必然停止 C AbortController 只取消浏览器侧连接,真正停止推理与计费需服务端独立取消协议 ✓ 正确答案 D 服务端无需取消协议
# 4. 流式聊天中“停止生成”后如何清理未完成的 DOM 节点、撤销已渲染的占位符 A 停止后直接清空整个消息即可 B 停止生成无需清理 DOM C 停止不影响已渲染的占位符 D 取消请求后统一走 stopped 状态,清理占位符与未闭合内容,保证 DOM 与数据一致 ✓ 正确答案
# 5. 消息列表的虚拟滚动应如何处理变高项(带代码块、表格、图片)防止布局抖动 A 渲染后测量实际高度并缓存,图片加载后重测,动态校正偏移 ✓ 正确答案 B 用固定高度估算所有消息即可 C 变高项无法用虚拟滚动 D 高度缓存与滚动无关
# 6. IndexedDB 如何持久化允许落地的会话状态,刷新后怎样与服务端版本合并 A IndexedDB 是权威源,刷新后直接用它 B 无需与服务端合并 C 刷新后总是以本地为准 D 先读本地立即渲染,再按版本号与服务端合并,未提交编辑保留 ✓ 正确答案
# 7. 断线恢复如何使用游标、事件 ID 和去重;旧流晚到时如何防止串写新消息 A 重连后从开头重新拉取即可 B 旧流晚到应直接写入覆盖新消息 C 事件 ID 不必要,重复无妨 D 用游标续传、事件 ID 去重,并用 requestId 隔离丢弃旧流晚到事件 ✓ 正确答案
# 8. 大附件如何做分片、Hash、进度、重试和 MIME 校验,Web Worker 适合卸载哪些工作 A 一次性上传整个文件,无需分片 B MIME 用扩展名判断即可 C 分片 + Hash 校验 + 断点续传,用 magic bytes 校验 MIME,Hash/解析等重计算放 Web Worker ✓ 正确答案 D Web Worker 可以访问 DOM 做渲染
# 9. IndexedDB 存储哪些会话数据(消息、附件、引用),如何加密与同步到服务端 A 存消息、附件元数据、引用与版本,敏感数据用 Web Crypto 应用层加密,附件大文件存对象存储 ✓ 正确答案 B IndexedDB 本身加密,无需额外处理 C 原始大文件直接存 IndexedDB D 同步总是全量传输
# 10. 聊天应用在网络中断时已发出的请求如何避免重复扣费(前端幂等 ID) A 前端生成幂等 ID 并重试时复用,服务端按 ID 去重只计费一次 ✓ 正确答案 B 重试时每次都生成新 ID,各计各的 C 幂等 ID 只由服务端生成,前端无需参与 D 网络中断后无需重试
# 11. 跨标签页打开同一会话时,BroadcastChannel 如何同步流事件、避免重复请求 A 每个标签页各自发起请求即可 B 用 BroadcastChannel 同步流事件,并用 leader 选举保证单一请求者避免重复扣费 ✓ 正确答案 C BroadcastChannel 只能发消息,不能同步状态 D 多标签页无需协调
# 12. 跨标签页并发编辑同一会话时,BroadcastChannel 与服务端版本号如何解决冲突 A BroadcastChannel 同步后无需版本号 B 并发编辑时直接覆盖即可 C BroadcastChannel 负责实时同步,服务端版本号做乐观并发控制决定最终一致性 ✓ 正确答案 D 版本号只用于显示,不用于冲突检测
# 13. 前端遥测怎样记录性能和错误而不采集完整 Prompt、文件内容或敏感 URL A 遥测应完整采集 Prompt 便于诊断 B 只上报聚合指标与脱敏标识符(如 prompt_hash),不采集完整 Prompt 与文件内容 ✓ 正确答案 C URL 原样上报即可 D 遥测无需隐私考虑
# 14. 大型附件上传(>10MB)应如何分片、断点续传、并行上传,前端 UX 如何设计 A 一次性上传整个大文件,失败重来 B 取消后已传分片全部作废 C 上传无需进度显示 D 分片并行上传 + 断点续传 + 进度可取消可重试,Hash 放 Worker 计算 ✓ 正确答案
# 15. Web Worker 在 AI 前端应用中适合卸载哪些工作(Markdown 解析、JSON Schema 校验、向量计算) A Worker 适合渲染 DOM 的 UI 任务 B 所有任务都放 Worker 最好 C 适合卸载 Markdown 解析、JSON Schema 校验、向量计算等计算密集且不依赖 DOM 的任务 ✓ 正确答案 D Worker 通信无成本,可随意使用
# 16. 会话历史的本地缓存与远程同步策略(last-write-wins、CRDT、版本号) A 所有场景都用 CRDT 最稳妥 B 同步策略与一致性无关 C last-write-wins 永远正确 D 按冲突频率与一致性需求选择:单用户用 last-write-wins,协同编辑考虑 CRDT,版本号提供冲突检测 ✓ 正确答案
# 17. 流式输出中的“粘贴文本”与“模型输出”应如何在视觉上区分(背景色、边框) A 两者应完全一致显示,避免用户困惑 B 用不同背景色/边框/标签区分来源,并保证无障碍对比度 ✓ 正确答案 C 只需要文字提示,无需视觉区分 D 区分无意义,模型输出与粘贴文本本来就不同
# 18. 前端缓存 Provider 列表、模型元信息的能力如何减少首屏延迟,又避免过期数据 A 用缓存版本号 + TTL + ETag 条件请求,先渲染缓存再后台校验更新 ✓ 正确答案 B 缓存永远不过期,省事 C 元信息缓存会必然导致数据过期,应禁用 D 只有网络请求才能保证数据正确
# 19. 错误重试(断线重连、Provider 错误)应做几次指数退避,避免前端“卡死”等待 A 无限重试直到成功 B 重试不需要退避间隔 C 所有错误都要重试 D 指数退避加抖动,最多重试 3-5 次,区分可重试与不可重试错误并设超时 ✓ 正确答案
# 20. 聊天应用切换到后台标签页时,是否应暂停流渲染(性能优化) A 暂停 DOM 渲染但保留数据接收与连接,回前台时渲染最新状态 ✓ 正确答案 B 后台继续满速渲染,保持实时 C 后台应完全断开请求 D 后台渲染无关紧要
# 21. 聊天前端如何用消息 ID、游标和幂等提交处理 SSE 重连,避免重复 Token 或消息顺序错乱 A 重连后从头重放全部事件 B 事件 ID 无法使用 C 用事件 ID + 游标续传、幂等键去重、序列号校验顺序,避免重复与乱序 ✓ 正确答案 D 顺序错乱无法避免
# 22. React 或 Vue 的增量渲染怎样避免每个 Token 触发全树重渲染,并保持 Markdown 和代码块稳定 A 每 token 直接 setState 全量更新最准确 B 流式更新应禁用 memo C memo 无法避免全树重渲染 D 用 memo 拆分组件 + rAF 批量合并 + 解析结果缓存,只更新变化叶子节点保持稳定 ✓ 正确答案
# 23. 用户在工具调用期间刷新页面时,前端如何从服务端恢复 Agent 状态并展示可继续或需审批的节点 A 刷新后 Agent 任务作废,需重新开始 B 工具调用状态无法持久化 C 刷新后无需展示审批节点 D 服务端持久化 Agent 状态,刷新后恢复并展示可继续/需审批节点 ✓ 正确答案
# 24. 如何设计乐观 UI、取消生成和重新生成操作,使客户端状态与 Provider 已产生的计费事实一致 A 用 requestId 关联服务端计费记录,以服务端实际消耗校正 UI 状态 ✓ 正确答案 B 以乐观 UI 显示为准,忽略服务端 C 取消生成就不会产生任何费用 D 计费与 UI 无需一致
# 25. 长对话中的虚拟列表、上下文摘要和滚动锚点如何协作,避免恢复历史时跳动或丢失未读内容 A 恢复时总是自动滚到底部 B 锚点用像素偏移最稳定 C 摘要节点不可展开 D 虚拟列表 + 稳定锚点 + 上下文摘要,恢复时锚定原位置并保留未读提示 ✓ 正确答案
# 26. 流式结构化 JSON 尚未闭合时,前端如何显示可用字段并在解析失败后平滑回退到文本展示 A 必须等完整 JSON 才渲染 B 无法增量解析 JSON C 解析失败就抛异常 D 增量解析先渲染可用字段,解析失败时平滑回退到 Markdown 文本 ✓ 正确答案
# 27. 如何用 Web Vitals、首 Token 延迟和用户中断率评估 AI 界面性能,而不是只测接口 P95 A 只测接口 P95 即可 B 中断率与性能无关 C 综合 Web Vitals、首 Token 延迟与用户中断率等用户视角指标 ✓ 正确答案 D 首 Token 延迟就是接口 P95