今日推荐库:@microsoftfetch-event-source 前端发送SSE请求实现GPT流式输出

使用 @microsoft/fetch-event-source 改善服务器发送事件的请求@microsoft/fetch-event-source - npm

在前端开发中,处理服务器发送事件(server-sent events)时,我们通常使用浏览器提供的 EventSource API。然而,该默认 API 存在一些限制,本文介绍了一个名为 @microsoft/fetch-event-source 的包,它提供了更强大的 API,使我们能够更灵活地进行服务器发送事件的请求。

问题与限制

默认的浏览器 EventSource API 在以下方面存在一些限制:

  1. 无法传递请求体(request body),必须将执行请求所需的所有信息编码到 URL 中,而大多数浏览器对 URL 的长度限制为 2000 个字符。
  2. 无法传递自定义请求头。
  3. 只能进行 GET 请求,无法指定其他方法。
  4. 如果连接中断,无法控制重试策略,浏览器会自动进行几次尝试然后停止。

@microsoft/fetch-event-source 的优势

@microsoft/fetch-event-source 提供了一个基于 Fetch API 的替代接口,完全兼容 Event Stream 格式。这使得我们能够以更加灵活的方式进行服务器发送事件的消费。以下是该库的一些主要优势:

  1. 支持任何请求方法、请求头和请求体,以及 Fetch API 提供的其他功能。甚至可以提供替代的 fetch() 实现,以应对默认浏览器实现无法满足需求的情况。
  2. 提供对响应对象的访问权限,允许在解析事件源之前进行自定义验证/处理。这在存在 API 网关(如 nginx)的情况下非常有用,如果网关返回错误,我们可能希望正确处理它。
  3. 对连接中断或发生错误时,提供完全控制的重试策略。

此外,该库还集成了浏览器的 Page Visibility API,使得在文档被隐藏时(例如用户最小化窗口),连接会关闭,当文档再次可见时会自动使用上次事件 ID 进行重试。这有助于减轻服务器负担,避免不必要的开放连接(但如果需要,可以选择禁用此行为)。

安装

npm install @microsoft/fetch-event-source

使用示例

在使用 @microsoft/fetch-event-source 之前,我们通常使用以下方式处理服务器发送事件:

复制代码
const sse = new EventSource('/api/sse');

sse.onmessage = (ev) => { console.log(ev.data); };

现在,我们可以改为使用 @microsoft/fetch-event-source

复制代码
import { fetchEventSource } from '@microsoft/fetch-event-source';  
await fetchEventSource('/api/sse', { 
    onmessage(ev) { 
        console.log(ev.data);
     } 
});

可以通过传递所有其他由默认 fetch API 暴露的参数,进行更灵活的请求,例如:

复制代码
const ctrl = new AbortController(); //用于中断请求

fetchEventSource('/api/sse', {

    method: 'POST',

    openWhenHidden: true, //页面退至后台保持连接

    headers: { 'Content-Type': 'application/json', },

    body: JSON.stringify({ foo: 'bar' }),

    signal: ctrl.signal
 });

通过使用 @microsoft/fetch-event-source,我们能够更灵活地处理服务器发送事件请求,并充分发挥 Fetch API 的功能。希望这篇博客能够对你理解和使用该库提供一些帮助。

相关推荐
陈随易6 小时前
在 VSCode 里,把项目一键部署到服务器
前端·后端·程序员
Highcharts.js6 小时前
教程:基于 React + Highcharts 构建一个单页应用程序、按需数据拉取与图表渲染
开发语言·前端·数据结构·react.js·前端框架·highcharts·页面应用
To_OC7 小时前
我被 useState 坑了两次之后,终于把它的脾气摸透了
前端·javascript·react.js
鱼樱前端7 小时前
我用 Claude Code 后,编码效率翻 3 倍。但更值钱的是别的。
前端·后端·ai编程
_lucas7 小时前
给知识库网站接入AI问答
前端·ai编程·全栈
前端糕手8 小时前
前端面试题大全:JavaScript + Vue3 + React + TypeScript + 工程化 + 性能优化
前端
我不叫武9 小时前
一个用 Rust 写的离线编码查询桌面工具
前端
小川zs10 小时前
我让 gpt-image2 连画两张“三视图人像“,逐条对照后,我重新理解了提示词
gpt·文生图·gpt-image2
Web4Browser10 小时前
指纹浏览器 API 自动化怎么接:启动 Profile、获取 CDP 端点并连接自动化框架
前端·网络·typescript·自动化
Patrick_Wilson10 小时前
从 React 到 Flutter:写给前端的一张跨端知识地图
前端·flutter·react.js