现场是这样的。React Native 0.76 开 Hermes,用 fetch 调 SSE 接口,response.body 是 null,只能等整段返回后一次性渲染,控制台报 response.body is not supported,iOS 和 Android 表现一样。

中间走过弯路,把「iOS 的 NSURLSession 默认缓冲响应体」当成主因,改完现象没变。

排查方向其实有限,先把可能性排一排。RN 的 fetch 由原生层实现,没有 ReadableStream;Hermes 缺少流式 TextDecoder 支持;Android 侧没有监听进度事件。

装一个专门读 SSE 的库替换 fetch

npm install react-native-sse

或者用 XMLHttpRequest 的 onprogress 增量读取

python -c "print('use xhr onprogress')"

补一个 TextDecoder 的 polyfill 处理多字节字符

npm install text-encoding

剩下的就是记录首块到达时间验证是否真的流式

python -c "print('measure ttft in ms')"

这台环境是别人交接的,不少默认值被动过,只能一项项核。

同事提醒我看一下最近一次发布,时间点确实对得上。

恢复的判定其实很直接。首块内容在 1 秒内渲染出来,长回答逐字追加,切到后台再回来连接能自动恢复。

RN 的流式能力取决于原生实现,升级 RN 版本不一定能解决,选库时优先看它是否基于 XHR 或原生模块,而不是直接读 response.body。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189