Generator 实现大型文本流的分块惰性加载,通过 ReadableStream + Generator 构建可中断管道,边读边解码切分、按批 yield,内存恒定且支持渐进渲染与手动中断。

Generator 处理大型文本流的分块惰性加载,核心是把“等全部下载完再解析”变成“边读边切、按批产出”,避免内存堆积和主线程冻结。它不负责网络传输本身,而是协调流读取、文本解码、按行/按记录拆分、分批返回这一整条链路。
用 ReadableStream + Generator 构建可中断的数据管道
浏览器原生 ReadableStream 支持流式读取,Generator 则负责封装读取逻辑并控制产出节奏:
- 调用
response.body.getReader()获取流读取器,传入 Generator 闭包内 - 在生成器内部用
while(true)循环调用reader.read(),每次拿到Uint8Array - 用
TextDecoder将二进制块转为字符串,拼接到缓存 buffer 中 - 按换行符
\n或自定义分隔符(如 JSONL 的行边界)切分完整记录,未闭合部分留到下次拼接 - 累积够一批(例如 200 行),
yield出去;不够就继续读,不阻塞也不丢数据
每批只处理、不囤积,内存占用恒定
关键在于不把整个文件或全部文本存成字符串——buffer 只保留当前未闭合的一小段,比如最后半行;已切出的记录一旦 yield 就交由上层消费,Generator 内部不留引用:
- 避免用
str.split('\n')全量切分大字符串,改用indexOf+slice逐段提取,防止正则回溯或隐式复制 - 每批 yield 后,buffer 清空已处理部分,仅保留尾部残留,内存峰值通常控制在几百 KB
- 若服务端支持
Content-Range,还可配合fetch分块请求,进一步降低单次网络负载
与 UI 层解耦,支持渐进渲染和手动中断
Generator 返回的是迭代器,天然适配 React/Vue 的响应式更新模式:
立即学习“Java免费学习笔记(深入)”;
- 初始状态显示骨架屏或进度条,不卡住交互
- 每次
iterator.next()得到新批次,就合并进列表状态(如setData(prev => [...prev, ...batch])) - 用户滚动时已加载部分立即可用,无需等待全部完成
- 点击“取消”或切换 tab 时,停止调用
next()即可中断;也可主动iterator.return()或throw()清理资源(如 abortController)
别在 yield 前做重操作,计算和 IO 要分离
Generator 解决的是调度和内存问题,不是计算性能瓶颈:
- 避免在
yield前对整批数据做JSON.parse、深克隆或坐标转换——这些应移入 Web Worker - Generator 只管“读→解码→切→产出”,解析、校验、映射等逻辑由上层或 Worker 异步处理
- 若某批数据需渲染复杂组件,建议搭配虚拟滚动,只挂载可视区域内的项


















