EventSource 只支持 GET,带不了 JSON 请求体;axios 拿不到流式增量。
所以只能用原生 fetch 加 ReadableStream,自己按行解析 SSE。
真正难的不是解析,是分块。网络回来的 chunk 边界是随机的,会切在多字节字符中间, 也会切在分隔符中间。
for (;;) { const { done, value } = await reader.read() if (done) break // stream:true —— 避免 UTF-8 多字节被分块切断变成乱码 // 丢掉 \r —— 否则 CRLF 跨块时分隔符匹配不上 buffer += decoder.decode(value, { stream: true }).replace(/\r/g, '') let sep = buffer.indexOf('\n\n') while (sep >= 0) { dispatch(buffer.slice(0, sep)) // 完整事件先派发 buffer = buffer.slice(sep + 2) // 余下不完整的留在缓冲 sep = buffer.indexOf('\n\n') } }