大 JSON 文件解析优化:前端如何高性能渲染 100MB 数据
2024-06-18
日志平台或数据可视化页面偶尔会遇到几十、上百 MB 的 JSON。主线程里一把 parse、再 map 成上万行 DOM,页面会直接假死。关键是别一次性做完所有事。
瓶颈在哪?
JSON.parse 是同步 CPU 密集操作,阻塞主线程;parse 后的对象占用大量堆内存。
React/Vue 全量渲染百万节点比 parse 还慢——UI 层往往才是体感卡顿的主因。
Web Worker 里 parse
把 ArrayBuffer 或字符串 postMessage 给 Worker,在子线程 JSON.parse,完成后传回摘要或分页数据。
注意 structured clone 传大对象仍有成本;更优是 Worker 内处理完只回传当前页需要的切片。
虚拟列表 / 窗口化
数组型大 JSON:只渲染可视区域(react-window、virtua 等),滚动时再取对应 index。
树形 JSON:懒加载子节点,展开时再 parse 或读取子路径。
流式与分块
JSON Lines(每行一条)适合流式读取;标准单文件大数组可考虑 NDJSON 导出或服务端分页 API。
浏览器侧 fetch + ReadableStream 边读边处理,避免等整个 body 下载完才 parse。
100MB 的现实建议
优先让后端分页、筛选、压缩(gzip);前端不要承诺「浏览器里打开任意大文件」。
必须本地处理:Worker parse + 虚拟滚动 + 进度条;内存峰值仍要监控(Chrome Performance)。