sse实现智能客服“打字机”交互需服务端以text/event-stream分块推送文本并禁用缓冲,前端用eventsource接收后通过定时器逐字符渲染,配合加载态、断线重连及语义分段提升体验。

JavaScript 中用 SSE(Server-Sent Events)实现智能客服的“打字机”流式交互,核心是让服务端持续推送文本片段,前端按顺序逐字/逐词渲染,配合定时器模拟人工输入节奏。它比 WebSocket 更轻量,适合单向下行、低频、长连接的客服响应场景。
服务端:按 chunk 推送文本片段
SSE 要求服务端以 text/event-stream 响应,并保持连接打开。关键不是一次性发完答案,而是把大段回复切分成小块(如每 5–15 字一组),逐个发送,中间加短暂停顿(如 200–400ms),模拟思考和输入过程。
- 后端语言(如 Node.js/Python)需禁用响应缓冲,设置
res.flush()或response.stream.write() - 每个 event 数据块格式为:
data: {"chunk": "您好,"}\n\n(注意两个换行) - 可选加
id:和retry:支持断线重连
前端:用 EventSource 接收 + 打字机渲染
用 EventSource 建立连接,监听 message 事件;收到每个 chunk 后,不直接插入 DOM,而是启动一个“打字机函数”,逐字符追加到消息容器中。
- 避免直接
innerHTML += chunk,应统一管理当前完整文本和已渲染字符数 - 打字机函数用
setTimeout或requestAnimationFrame控制节奏(推荐 30–60ms/字符) - 支持中断:新消息到来时清空当前打字定时器,防止乱序或重复渲染
增强体验:加载态、错误处理与语义分段
纯流式输出容易让用户困惑“是否还在处理”。建议结合状态提示提升可感知性:
- 连接建立后显示“客服正在输入…”(用 loading 动画或省略号)
- 首次收到数据时隐藏 loading,开始打字;最后一条消息带
done: true标志,触发完成态(如加时间戳、允许复制) - 服务端可按标点(句号、问号)或语义停顿(逗号、换行)切分 chunk,比固定字数更自然
- 监听
error事件,自动重连(EventSource默认会重试,但需处理超时或 5xx 场景)
注意事项:兼容性与边界情况
SSE 在现代浏览器中支持良好(Chrome/Firefox/Safari/Edge ≥12),但不支持 IE。实际落地还需考虑:
- HTTP/2 下 SSE 性能更好;若用 Nginx,需关闭
proxy_buffering并设proxy_cache off - 移动端弱网下,过短的间隔(
- 避免在打字过程中响应用户新提问——应关闭输入框或置灰,直到当前流结束
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











