演示如何让 10 万条数据流畅渲染、丝滑交互
核心思路:用户屏幕就那么大,没必要把10万个点全画出来。通过 DataZoom 组件,只渲染当前可视窗口内的数据,窗口外的数据被 filter 掉,不参与绑定bindbindbindbindbindbindbindbindbindbindbindbindbindbindbindbindbindbindbindbindbindbindbindbindbindbindbindbindbindbindbindbindbindbindbindbindbindbindbindbindbindbindbindbindbindbindbindbindbindbindbindbindbindbindbindbindbindbindbindbindbindbindbindbindbindbindbindbindbin绑定和渲染。
dataZoom: [
{
type: 'slider', // 滑动条
filterMode: 'filter', // 关键!过滤窗口外数据
start: 0, end: 5 // 初始只展示5%
},
{
type: 'inside', // 鼠标滚轮缩放
filterMode: 'filter'
}
]
Largest Triangle Three Buckets:在保留数据趋势的前提下,将10万个点降到1000个。人眼根本看不出差别,但渲染性能提升100倍。ECharts 内置支持,一行配置搞定。
series: [{
type: 'line',
sampling: 'lttb', // 内置LTTB降采样
// 其他选项: 'average', 'max', 'min', 'sum'
data: bigData
}]
// 概览图用手动降采样
const overview = downsampleLTTB(raw, 1000);
数据生成、排序、聚合等 CPU 密集计算放到 Worker 线程。主线程只负责渲染和交互,保证 UI 永远不卡。简历里可以写"使用 Web Worker 实现数据处理与渲染分离"。
// 创建 Worker(Blob方式,无需额外文件)
const blob = new Blob([workerCode], {type: 'text/js'});
const worker = new Worker(URL.createObjectURL(blob));
worker.postMessage({ count: 100000 });
worker.onmessage = (e) => {
chart.setOption({ series: [{ data: e.data }] });
};
多个配置项组合使用:关闭动画避免重绘开销、隐藏symbol减少DOM节点、开启large模式启用Canvas优化路径、progressive渐进渲染避免长帧。
series: [{
animation: false, // 关闭动画
showSymbol: false, // 不画数据点圆圈
large: true, // 大数据优化模式
largeThreshold: 5000, // 超过5000点启用
progressive: 2000, // 每帧渲染2000点
progressiveThreshold: 10000 // 超过1万启用渐进
}]