流式输出需前后端协同实现:后端用res.write()或StreamingResponse分块发送并设置相应响应头,前端用SSE或fetch流式读取,逐块解码、解析、追加DOM并滚动到底部,同时处理解析异常与字符边界问题。

流式输出不是靠HTML本身实现的
HTML只是静态结构,innerHTML 或 textContent 一次写入整段内容,没法“边生成边显示”。所谓“流式输出”,本质是前端持续接收分块数据,并逐块追加到 DOM 中——这必须由 JavaScript 驱动,且依赖后端支持分块响应。
后端必须返回 chunked 数据流
前端能流式显示的前提,是后端真正在流式发送。常见错误是:后端用 res.send() 一次性返回完整字符串,前端即使写了循环解析逻辑,也收不到中间态。
- 使用
res.write()+res.flush()(Node.js)或StreamingResponse(Python FastAPI)显式分块输出 - HTTP 响应头必须包含
Content-Type: text/event-stream(SSE)或保持连接开放(WebSocket / 流式 fetch) - 若走
fetch,需检查response.body是否可读取为ReadableStream,并用response.body.getReader()持续读取 - OpenAI 风格 API 要开启
stream=true参数,否则默认关闭流式
前端用 TextDecoder + reader.read() 处理流
直接拼接 event.data 或 response.text() 会破坏流式效果。正确做法是逐块解码、识别分隔符(如 data:、
)、提取 content 字段,再追加到消息容器。
生成可在 deepbi 沙箱 iframe 内运行或作为独立文件运行的交互式 HTML 页面,使用 `window.deepbi` JS SDK 实现数据查询、空间管理、文件浏览及用户操作。当用户提出以下需求时启用该能力: - 创建 KPI 仪表盘、数据表格、文件浏览器、成员列表、管理页面; - 明确要求“转成 dhtml”、“转译成 HTML”、“把 XX 页面转成……”、“控制台页面”、“管理后台”、“DeepBI 页面迁移”; - 提及位于 `apps/console/src/featur
- 对 SSE:监听
eventsource.onmessage,用JSON.parse(event.data)解析每条事件 - 对 fetch 流:用
const reader = response.body.getReader(),循环调用reader.read(),配合new TextDecoder().decode(chunk) - 每次追加前,先用
messagesEl.appendChild(document.createTextNode(text))或messagesEl.innerHTML += `<span>${text}</span>`,避免重排开销过大 - 务必在追加后调用
messagesEl.scrollTop = messagesEl.scrollHeight,否则新内容可能不可见
别忽略字符边界和解析失败场景
流式数据常因网络中断、编码错位、JSON 截断导致解析失败。一个没处理好的 JSON.parse() 就会让整个流卡住。
立即学习“前端免费学习笔记(深入)”;
- 不要假设每次
reader.read()返回完整 JSON 对象;实际收到的可能是半截字符串,需缓存拼接 - 用正则
/data: (\{.*?\})\n\n/g提取合法 JSON 块,比直接JSON.parse更鲁棒 - 遇到解析异常时,跳过当前块,继续读下一块,而不是 throw 中断整个流
- 服务端若未按规范返回
data:前缀(比如只返回裸 JSON),前端需降级为按换行符分割


















