在前端开发中,处理服务器发送事件(server-sent events)时,我们通常使用浏览器提供的 EventSource API。然而,该默认 API 存在一些限制,本文介绍了一个名为 @microsoft/fetch-event-source
的包,它提供了更强大的 API,使我们能够更灵活地进行服务器发送事件的请求。
默认的浏览器 EventSource API 在以下方面存在一些限制:
@microsoft/fetch-event-source
提供了一个基于 Fetch API 的替代接口,完全兼容 Event Stream 格式。这使得我们能够以更加灵活的方式进行服务器发送事件的消费。以下是该库的一些主要优势:
此外,该库还集成了浏览器的 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 的功能。希望这篇博客能够对你理解和使用该库提供一些帮助。