React 前端如何流式展示 LLM:忙开发者 10 分钟上手
为什么一定要做流式输出
在 React 前端里接 LLM,如果一次性等完整回答再渲染,用户会感觉“卡住了”。流式输出的核心价值很简单:先把首个 token 显示出来,再持续追加内容。这样不仅能明显缩短“等待感”,还更适合聊天、代码解释、摘要生成这类长文本场景。
对忙开发者来说,流式的收益很直接:交互更像实时打字,页面可提前展示加载状态,用户也更容易中途打断或继续追问。无论你调用 Claude 的 Opus、Sonnet、Haiku、Fable,还是 GPT 系列,流式思路都基本一致。
先把接口接通:用 59API 省成本、省时间
如果你不想同时维护多家模型的鉴权和 SDK,59API 很适合做统一入口。它是 AI API relay,基于 https://api.59api.com 提供 OpenAI 兼容接入,同时可调用 Claude 和 GPT 模型,支持 Claude Code、Codex 和任何 OpenAI SDK。对预算敏感的团队来说,它的按量计费和较低价格很友好,而且用的是官方品质模型,不需要接受“降级版”输出。
接入方式很简单:把 OpenAI SDK 的 baseURL 指向 https://api.59api.com,然后把模型名换成你要用的 Claude 或 GPT 模型,保留 stream: true 即可。对于想先验证前端体验、再决定是否扩量的项目,这种低门槛接法特别省事。
React 里的最小可用实现
前端逻辑可以拆成 4 步:发送请求、读取流、增量更新 state、处理结束信号。最常见的写法是用 fetch 获取响应后,从 response.body 里拿 reader,再用 TextDecoder 把 chunk 解码成字符串。你需要把每一段增量文本追加到 React state 中,而不是等整个请求结束才 setState。
- 点击发送按钮后,先把用户输入追加到消息列表。
- 创建 AbortController,方便用户随时停止生成。
- 请求体里打开 stream: true,并传入 messages。
- 循环读取 reader.read(),遇到 data: [DONE] 就结束。
如果你用的是聊天场景,建议把“正在生成”的 assistant 消息先插入到列表里,然后持续更新最后一条内容。这样 React 只需要渲染一个不断增长的字符串,代码最简单,也最不容易出错。若需要更顺滑的滚动体验,可以在消息容器更新后自动滚到底部。
一个容易忽略但很重要的坑
生产环境里,不要把 59API 密钥直接写进浏览器代码。更稳妥的做法是:React 前端请求你自己的后端或 BFF,再由服务端去调用 59API。这样既能保护密钥,也方便做速率限制、日志和用户配额控制。如果你是做原型验证,才考虑临时直连,并且要尽快替换为服务端代理。
另一个常见问题是流解析。不同网关返回的 chunk 可能会被拆分成半行,所以你要做好缓冲,按换行分隔,再提取 data: 后面的内容。遇到空行、心跳包或结束标记时,不要把它们当成正文追加,否则 UI 会出现乱码。
快速建议:先用低成本模型把体验跑通
先用便宜但质量稳定的模型验证交互,再按业务分层切换更强模型,是最省钱的路线。59API 的优势就在这里:同一套前端和同一套 OpenAI 兼容代码,可以在 Claude 和 GPT 之间灵活切换,还能利用返利机制进一步摊薄成本。对于要做 AI 产品 MVP、内部工具或客服助手的团队,这种“少改代码、多试模型”的方式很划算。
如果你现在就想把 React 流式聊天跑起来,可以先去 59API 注册并拿到密钥,接上 baseURL 后做一个 20 行左右的流式 demo。先看到首 token,再优化解析、样式和中断控制,通常一小时内就能做出可演示版本。
शुरू करने के लिए तैयार?
कुछ ही मिनटों में Claude और GPT जोड़ें, सबसे कम कीमत पर। साइन अप करें और API key पाएं।
मुफ़्त साइन अप