为什么前端越来越需要“流式能力”?

在传统 Web 应用中,前端与后端的通信方式大多是 “请求—响应” 模式:
前端发起请求,后端计算完成后一次性返回结果。

但随着应用形态的演进,这种模式越来越显得“笨重”:

  • AI 对话需要边生成边展示
  • 日志、进度条需要实时推送
  • 实时监控、消息提醒不适合频繁轮询
  • 大模型推理结果可能需要数秒甚至更久

于是,一个经典但长期被低估的技术重新回到前端视野——
SSE(Server-Sent Events)

本文将系统讲解 SSE 的通信原理、前端实现方式、与 WebSocket 的差异,并结合 前端 AI 对话应用,完整演示 SSE 在真实业务中的落地实践。


一、什么是 SSE?

1. SSE 的基本定义

**Server-Sent Events(服务器推送事件)**是一种基于 HTTP 的单向通信机制:

服务器可以在一个持久连接上,持续向客户端推送文本事件。

其核心特征:

  • 基于 HTTP / HTTPS
  • 单向通信(Server → Client)
  • 长连接
  • 自动重连
  • 文本流式传输

2. SSE 的历史背景

SSE 是 HTML5 标准的一部分,早在 2010 年左右就已被提出,但由于:

  • WebSocket 更“炫酷”
  • SSE 使用场景相对垂直

导致它长期被忽视。

而在 AI 流式输出、低频实时推送 场景下,SSE 反而成为更优解。


二、SSE 的底层通信原理

1. 基于 HTTP 的长连接

SSE 并不是新协议,而是:

  • 使用 Content-Type: text/event-stream
  • 保持 HTTP 连接不断开
  • 按特定格式不断写入数据

示意流程:

Client ──HTTP 请求──> Server Client <─持续推送── Server


2. 事件流数据格式

SSE 数据是纯文本,格式非常简单:

text

data: Hello World data: Next message

每一条消息以 空行 结尾。

完整字段包括:

text

event: message id: 123 data: 内容

常用的只有 data。


3. 为什么浏览器能“自动解析”?

浏览器内置了 EventSource 接口,会:

  • 自动解析 data: 字段
  • 自动触发 message 事件
  • 在断线时自动重连

这极大降低了前端使用成本。


三、前端 SSE 基础用法

1. 使用 EventSource 建立连接

js

const source = new EventSource('/api/sse')


2. 监听消息

js

source.onmessage = (event) => { console.log(event.data) }


3. 监听错误与关闭

js

source.onerror = (err) => { console.error('SSE error', err) }

关闭连接:

js

source.close()


4. 浏览器支持情况

浏览器

支持

Chrome

Firefox

Safari

Edge

IE

在现代前端项目中,兼容性基本不是问题。


四、SSE 与 WebSocket 的核心差异

对比项

SSE

WebSocket

通信方向

单向

双向

协议

HTTP

WS

连接复杂度

简单

相对复杂

自动重连

❌(需手动)

文本流

二进制

适合场景

推送 / 流式输出

实时互动

关键结论:

如果你只需要“服务器不断往前端推数据”,
SSE 往往比 WebSocket 更轻、更稳、更省心。


五、后端如何配合 SSE(简要说明)

以 Node.js 为例:

js

app.get('/api/sse', (req, res) => { res.setHeader('Content-Type', 'text/event-stream') res.setHeader('Cache-Control', 'no-cache') res.setHeader('Connection', 'keep-alive') res.write('data: hello\n\n') setInterval(() => { res.write(`data: ${Date.now()}\n\n`) }, 1000) })

核心点只有三件事:

  1. 设置 text/event-stream
  2. 不要结束响应
  3. 按格式持续 write

六、为什么 SSE 非常适合前端 AI 对话?

1. AI 输出本质是“流”

大模型在推理时:

  • Token 是逐个生成的
  • 完整答案往往需要数秒
  • 一次性返回体验极差

SSE 可以:

✅ 边生成边传
✅ 边接收边渲染
✅ 明显降低用户等待焦虑


2. 与 AI API 的天然契合

无论是:

  • OpenAI Streaming
  • Qwen / LLaMA 流式输出
  • 自研推理服务

底层几乎都是 文本流

SSE 正好是前端的“最后一公里”。


七、前端 AI 对话 + SSE 架构设计

整体架构:

用户输入 ↓ 前端 POST 提问 ↓ 后端调用大模型(流式) ↓ 后端 SSE 推送 Token ↓ 前端实时渲染对话


八、前端 AI 对话 SSE 实现实战

1. 前端发送提问

js

fetch('/api/chat', { method: 'POST', body: JSON.stringify({ prompt: userInput }) })

后端收到后,开始推理并通过 SSE 推送。


2. 前端建立 SSE 监听

js

const source = new EventSource('/api/chat/stream') let answer = '' source.onmessage = (e) => { answer += e.data render(answer) }


3. 实时渲染 UI

js

function render(text) { document.querySelector('#ai').innerText = text }

这样,用户可以看到:

AI 正在“一字一句”地回答。


4. 结束标识设计

后端可以发送:

text

data: [DONE]

前端处理:

js

if (e.data === '[DONE]') { source.close() }


九、在 Vue / React 中使用 SSE

1. Vue 示例

js

onMounted(() => { source = new EventSource('/api/sse') source.onmessage = (e) => { content.value += e.data } }) onUnmounted(() => { source.close() })


2. React 示例

js

useEffect(() => { const source = new EventSource('/api/sse') source.onmessage = (e) => { setText(prev => prev + e.data) } return () => source.close() }, [])


十、SSE 常见坑与解决方案

1. Nginx 缓冲导致不实时

关闭缓冲:

nginx

proxy_buffering off;


2. 连接被意外断开

  • SSE 会自动重连
  • 后端可使用 id 字段做断点续传

3. 跨域问题

SSE 也是 HTTP,请正确设置 CORS:

http

Access-Control-Allow-Origin: *


十一、SSE 的性能与扩展性

1. 连接数问题

SSE 是长连接,但:

  • 比 WebSocket 轻
  • 不需要心跳包
  • 浏览器对同域连接有限制(通常 6 个)

2. 什么时候不适合 SSE?

❌ 高频双向通信
❌ 游戏实时同步
❌ 二进制数据传输


十二、SSE + Fetch Stream:进阶组合

现代浏览器还支持:

js

fetch('/api/stream').then(res => { const reader = res.body.getReader() })

相比 SSE:

  • 更灵活
  • 需要自己解析
  • 兼容性稍差

在 AI 对话中:

  • SSE:简单稳定
  • Fetch Stream:更底层

十三、真实项目中的 SSE 设计建议

  1. 明确单向推送
  2. 设计结束标识
  3. 控制推送粒度
  4. 前端及时关闭连接
  5. 开发环境关闭代理缓存

结语:SSE 是被低估的“前端利器”

在 Web 技术栈中,SSE 可能不是最“流行”的方案,但在以下场景中,它几乎是最优解:

  • AI 对话流式输出
  • 日志 / 进度推送
  • 低频实时通知

它的优势在于:

  • ✅ API 简单
  • ✅ 与 HTTP 完美融合
  • ✅ 浏览器原生支持
  • ✅ 对前端极其友好

在 AI 应用逐渐成为前端核心能力的今天,掌握 SSE,几乎等同于掌握流式交互的钥匙

如果你正在做前端 AI 应用,不妨从 SSE 开始——SSE 就是服务器向客户端发送实时事件的一种技术。它和传统的请求 - 响应模式不同,服务器可以主动向客户端推送数据,就像有个小信使一直给你送消息一样!这也太牛了吧在前端 AI 对话应用里,SSE 编程语言c++5g.360hhsm.cn++c语言的魅力 编程语言C++3g.360hhsm.cn++c语言的魅力 编程语言C++www.share.360hhsm.cn++c语言的魅力 编程语言C++read.share.360hhsm.cn++c语言的魅力可太有用啦!当你输入问题后,服务器可以通过 SSE 实时返回 AI 的回答,就像和真人聊天一样流畅!再也不用等半天才能看到回复啦,这体验感直接拉满!你会发现,很多复杂问题,其实可以很优雅地解决。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐