webworker 应专注纯计算:主线程预处理数据(清洗、序列化)、worker仅分组聚合(sum/count/avg等)、分块处理防卡顿、结果由主线程渲染增强。

主线程先准备好结构化数据
Worker 无法访问表格、DOM 或 localStorage,所有原始数据必须由主线程采集并转成可序列化的格式再传过去:
- 表格数据:用
Array.from(table.querySelectorAll('tbody tr'))遍历,每行提取cell.textContent,转为对象数组(如{name: '张三', sales: 12500, region: '华东'}) - JSON 或 CSV 数据:直接解析为数组,确保数值字段是
Number类型,避免 Worker 内部反复parseInt - 过滤无效行:空行、标题行、含非法字符的字段,在主线程就剔除,减少 Worker 无效负担
Worker 内只做分组、聚合、条件统计
别让它生成 HTML、不排序、不格式化数字、不处理时间字符串——这些都留给主线程。Worker 的任务极简:
- 按字段分组:用
Map或普通对象,键为组合字符串(如`${row.region}-${row.category}`) - 支持常用聚合:sum / count / avg / min / max / distinct count,每个用独立变量累加,不依赖第三方库
- 简单筛选:参数里带
filter: { field: 'sales', op: '>', value: 5000 },Worker 内用if (row[field] > value)判断即可 - 用
Float32Array存大量数值列(如价格、数量),提升遍历和计算效率
分块处理 + 进度反馈防无响应
数万行一次性传入可能让 Worker 延迟响应,用户以为卡死。推荐切片+异步调度:
- 主线程把数据切成每 800–1200 行一组,用
queueMicrotask分批postMessage - Worker 每完成一块,发回
{ type: 'progress', processed: 2400, total: 10000 } - 主线程用
<progress></progress>或百分比文字更新 UI,保持交互可见性
结果返回后由主线程渲染与增强
Worker 只输出轻量结构化结果,比如:
{
"rows": [
{ "region": "华东", "category": "A", "sumSales": 84230, "avgOrder": 2450 },
{ "region": "华北", "category": "A", "sumSales": 67190, "avgOrder": 2180 }
],
"summary": { "totalRows": 10000, "filtered": 9820 }
}
主线程收到后:
- 用
document.createDocumentFragment()批量构建<tr><td>...</td></tr>,最后一次性插入tbody - 对数值列加
class="num"实现右对齐;对小计/总计行加class="subtotal"方便 CSS 样式控制 - 绑定事件委托处理点击展开明细,不为每行单独加监听器
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











