Skip to content

运行时与交互体验

涵盖 防抖与节流虚拟列表长任务Web Worker,以及与主线程相关的体验优化。


1. 防抖(debounce)与节流(throttle)

典型场景
防抖搜索框输入、窗口 resize 结束、提交防连点:事件停止触发后只执行一次
节流滚动监听、鼠标移动跟手:固定时间窗口内最多执行一次

实现可用 Lodash 或自写;需注意 this 与取消防抖 等业务细节。


2. 长列表与虚拟列表

问题:上万 DOM 节点导致布局与内存压力巨大。
思路:只挂载视口内及少量缓冲行,滚动时复用行组件(react-window / vue-virtual-scroller 等)。

适合表格、Feed、大量日志等;需处理 行高不固定动态数据 等边界情况。


3. 长任务(>50ms 量级)与主线程

长任务会推迟输入响应,导致 卡顿、INP 变差

优化方向:

  1. 拆分为小块setTimeout / queueMicrotask / requestIdleCallback(需注意兼容性)做时间切片。
  2. 减少多余渲染:避免无效 setState、大面积 DOM 操作。
  3. 移出主线程:纯计算、大批量数据处理可考虑 Web Worker。

4. Web Worker

适用:加密、编解码、大数据排序、图像处理等 无 DOM 的 CPU 密集逻辑。

限制:不能直接访问 DOM;通过 postMessage 通信,注意 序列化开销,不适合极细碎且来回反复的调用。


小结

交互体验:输入路径短(防抖节流)+ 列表少 DOM(虚拟列表)+ 主线程少阻塞(拆任务 / Worker)