海康威视前端实习一面:AI 建站渲染链路与回读对账
- 轮次
- 一面
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
- 自我介绍
- AI 建站项目从用户输入到渲染的流程
- AI 建站项目里客户端起到的作用
- 这个渲染功能比较难的技术点是什么?
- 项目在渲染过程中会存在性能问题吗?
- 虚拟列表的实现方案
- 在智能体平台中对结果不明的写入进行回读对账,哪些场景是「结果不明」?
- 回读对账怎么实现的?
- 旅行平台项目瀑布流卡片用的是 Flex 还是 Grid?它们的区别是什么?
- HTTP 缓存和前端数据缓存的区别?
- 界面上登录过一次,在页面刷新和页面切换时不会因为认证原因登出的实现方式?
- 如果关闭浏览器,还能不能保存 token?
- WebSocket 流式传输和 SSE 的区别?
- 实习中遇到的最困难的事
- 能否接受 Vue 作为主要技术栈?
《参考解析》
AI 建站这类「生成式 UI」的链路,可以按「输入 → 生成 → 校验 → 渲染」四段讲。 用户输入需求后,服务端调用模型产出结构化的页面描述(JSON Schema、DSL 或组件树,而不是直接产出 HTML,便于校验与二次编辑);前端拿到后进行 schema 校验与降级(字段缺失、组件未注册、属性非法都要有兜底),再交给渲染器把描述映射成真实组件;渲染过程中要处理流式增量(模型还在输出时先渲染已完成部分)、占位与骨架屏、以及错误重试。客户端在其中的作用是「可信渲染 + 交互 + 状态管理」:把不可信的模型输出约束在可渲染的白名单组件内、处理用户对生成结果的编辑与局部重生成、并承担预览与保存/发布的状态同步。难点通常不在渲染本身,而在增量更新的稳定性(流式片段到达时避免整树重渲染与布局跳动)、schema 兼容(老版本页面在新渲染器上还能打开)、以及性能(复杂页面节点多、频繁更新导致掉帧)。
「结果不明的写入」指的是那些「请求发出去了,但客户端无法确定服务端有没有执行」的时刻。 典型场景:调用超时或连接中断(服务端可能已成功)、网络抖动导致响应丢失、用户主动取消但服务端已受理、以及服务端返回 5xx 但其实已落库。这类场景不能简单重试(会造成重复写入),所以要回读对账:为每次写入生成客户端幂等键(业务 id + 请求 id),超时或异常后先用只读接口按幂等键查询真实状态,确认未生效才重试,确认已生效就直接采用服务端结果;服务端侧同样要用唯一约束与幂等表把重复请求收敛到同一结果。实现要点:幂等键要持久化(刷新/重开页面后仍能查)、查询接口要能按幂等键精确定位、对账要有退避重试与「长时间未确认」的告警兜底,另外要把「我不确定」这个状态显式呈现给用户,而不是假装成功或失败。
瀑布流选型与缓存问题。 用 Flex 还是 Grid 取决于是否需要「定高」:Grid 适合等高、规则的卡片,能直接表达行列关系;不等高瀑布流通常用绝对定位 + JS 计算最短列(或 CSS 的 columns/grid-template-rows: masonry,后者兼容性有限),原因是布局需要知道每张卡片高度后再决定落到哪一列。RN 里没有 CSS Grid,所以用最短列算法是常见做法——代价是滚动时要做高度测量与重排,长列表要配合虚拟化与预计算。HTTP 缓存 vs 前端数据缓存:前者是浏览器对响应资源的缓存(强缓存 Cache-Control/Expires + 协商缓存 ETag/Last-Modified),管的是「这次请求要不要发出去」,作用在传输层;后者是把接口返回的数据存在内存/IndexedDB(SWR、React Query 等),管的是「这次渲染用不用旧数据、什么时候后台刷新」,作用在应用状态层。两者可以叠加:静态资源走 HTTP 缓存,接口数据走应用层缓存 + 失效策略。
登录态保持与 token 存储,是一道边界很清楚的题。 页面刷新或路由切换不掉线,说明凭证存在比内存更持久的地方:localStorage/sessionStorage/cookie 或 IndexedDB,配合应用启动时的静默刷新(refresh token 换 access token)。sessionStorage 的生命周期是标签页会话——页面刷新仍在,关闭标签页就清空;localStorage 关闭浏览器后依然保留(除非清除数据),所以「关闭浏览器还能不能保存 token」的答案是:localStorage 和持久化 cookie 能,sessionStorage 不能。安全取舍:localStorage 会被 XSS 读取,所以生产上更推荐 httpOnly + Secure + SameSite 的 cookie(JS 读不到,防 XSS 窃取)配合 CSRF 防护;无论存哪里,access token 都应短寿命 + 服务端可吊销(jti 黑名单或版本号),不能只依赖「存得隐蔽」。
WebSocket 与 SSE 的差异。 SSE 是单向的(服务端 → 客户端)、基于普通 HTTP 长连接、文本协议(text/event-stream)、浏览器原生自带断线重连与 Last-Event-ID 续传,非常适合大模型流式输出这类场景;缺点是只能服务端推、走 HTTP/1.1 时受同域连接数限制(HTTP/2 下可多路复用)。WebSocket 是全双工、需要一次握手升级协议(Upgrade: websocket),适合双向高频交互(聊天、协同编辑、游戏),代价是要自己做心跳保活、重连、鉴权(不能带自定义 header,通常用一次性 ticket 或首帧认证)和连接数管理。选型判据:只需要服务端推送用 SSE(更简单),需要双向实时用 WebSocket。用 SSE 做流式输出时要注意中间层(网关、CDN、Nginx)的缓冲与超时会切断连接,需要关闭缓冲并配置超时。