Web Worker是处理百万级商品模糊过滤与分类筛选的唯一可行方案,通过预加载数据、构建搜索索引、位图标记多条件筛选及分页通信,实现100ms内响应且不阻塞UI。

直接在主线程处理百万级商品列表的模糊过滤和分类筛选,必然导致页面卡顿甚至崩溃。Web Worker 是唯一可行方案——它把耗时计算移出主线程,不阻塞 UI 渲染和用户交互。
1. 商品数据预加载与 Worker 初始化
不要在 Worker 中动态请求数据,避免跨线程网络 I/O 延迟。主线程提前通过 fetch 获取完整商品数组(建议压缩为 JSON 字符串或结构化克隆),再用 postMessage 一次性传入 Worker:
- 商品数据尽量扁平化:避免深层嵌套对象,减少序列化/反序列化开销
- 若数据超 10MB,考虑分块传输或使用
Transferable(如ArrayBuffer)提升效率 - Worker 初始化后立即缓存商品列表(全局变量或
self.cachedItems = []),后续筛选复用,避免重复接收
2. 模糊匹配优化:用索引代替遍历
对百万条目逐个执行 includes() 或正则 test() 会严重拖慢。应在 Worker 启动时构建轻量级搜索索引:
- 提取关键字段(如 name、brand、category)生成“词元数组”,用
Set去重并小写归一化 - 对高频查询字段(如商品名)建立前缀 Trie 树或简单哈希映射:
{'iph': [0, 15, 222], 'red': [3, 88, 901], ...} - 模糊逻辑用快速近似算法:例如只比对前 3–5 个字符 + 编辑距离 ≤1(Levenshtein 简化版),避免全量计算
3. 多条件组合筛选:位图标记 + 懒执行
用户同时选“价格≤500”+“品牌=Apple”+“分类=手机”,传统 filter() 链式调用效率低。推荐位运算标记法:
立即学习“前端免费学习笔记(深入)”;
- 初始化一个长度等于商品总数的
Uint8Array(每个字节表示一个商品是否匹配当前条件) - 每类筛选条件独立执行:价格区间 → 批量比较并置位;品牌匹配 → 查哈希表批量置位;分类 → 直接查预存分类 ID 数组
- 最终用
bitwise AND合并所有条件位图,再遍历位图收集索引,仅返回对应商品子集(非全量复制)
4. 主线程通信与渐进式渲染
Worker 不应一次性返回全部结果(可能上万条),而应分页或流式推送:
- 主线程发送筛选参数时附带
page: 0, size: 50;Worker 计算后只返回该页 ID 列表或精简数据 - 支持中断机制:每次计算前检查
self.aborted标志(由主线程通过postMessage({type: 'abort'})设置) - 首次渲染用骨架屏,Worker 返回第一批 50 条后立即更新 DOM;后续滚动触底再请求下一页,保持交互响应
核心不是“能不能做”,而是“怎么让 Worker 快且可控”。预处理、索引、位图、分页——四者结合,百万商品筛选可稳定控制在 100ms 内响应,不掉帧,不锁屏。



















