直接用浏览器原生 EventSource API 即可实现极简 SSE 客户端,它自动处理连接保持、重连、字段解析和换行分隔;需监听 message 或自定义事件,注意 event.data 是字符串需手动 JSON.parse,支持 withCredentials 和 close() 控制,现代浏览器均兼容。

直接用浏览器原生 EventSource API 就能完成极简 SSE 客户端,无需额外库或复杂封装。它专为解析 text/event-stream 设计,自动处理连接保持、重连、字段解析和换行分隔,是标准且最轻量的方案。
基础用法:监听默认 message 事件
服务端返回符合 SSE 格式的数据(如 data: {"msg":"hello"}\n\n),前端只需:
- 创建
new EventSource('/events')实例 - 监听
message事件,event.data即为解析后的纯文本内容 - 可选:监听
open(连接建立)和error(连接异常)事件
注意:event.data 是字符串,需手动 JSON.parse() 才能转为对象;SSE 不自动识别 JSON 类型,只按规范切分并提取 data: 后的内容。
处理自定义事件类型(event: xxx)
当服务端发送带 event: 字段的消息(例如 event: update\ndata: {"id":123}\n\n),客户端应监听对应名称的事件:
- 用
source.addEventListener('update', handler)替代onmessage - 此时
event.type === 'update',event.data仍是原始字符串 - 多个事件类型可共存于同一流,互不干扰
控制连接行为与错误恢复
EventSource 内置重连机制,但可显式干预:
- 设置
withCredentials: true支持跨域带 Cookie 请求:new EventSource('/events', { withCredentials: true }) - 通过
source.close()主动断开,避免内存泄漏 -
error事件触发时,检查source.readyState:0=关闭、0=正在连接、2=已连接;仅在 readyState === 0 时才需人工干预(如提示用户) - 重连间隔默认由服务端
retry:字段控制(单位毫秒),未指定则使用浏览器默认值(通常几秒)
兼容性与降级建议
现代浏览器均支持 EventSource(Chrome 6+、Firefox 6+、Safari 5.1+、Edge 12+)。若需支持旧环境:
- 可用
fetch+ReadableStream手动解析流(适用于 Chrome 68+/Firefox 65+) - 降级为长轮询(如每 3 秒
fetch一次)仅在必须支持 IE 时考虑,会增加延迟和服务器压力 - 检测支持性:
if ('EventSource' in window) { /* 使用 SSE */ } else { /* 降级逻辑 */ }











