Skip to content

Latest commit

 

History

History
56 lines (34 loc) · 3.09 KB

30.md

File metadata and controls

56 lines (34 loc) · 3.09 KB

30 · 输入为什么没有及时响应

由 pnpm docs:lessons 生成。内容源:src/data/performance.json;生成与共同合同:scripts/generate-performance.mjs。本页包含教师参考答案。

学习目标与原理

理解主线程、任务、微任务与交互等待。主线程任务结束不代表立刻渲染;微任务队列会在渲染机会前清空。把 Promise.resolve 当作让出渲染机会会继续阻塞。

建立测量边界

交互可含输入等待、处理及呈现延迟;只看 handler 不完整。

把时间关联到原因

setTimeout / scheduler.yield 可给后续任务和渲染机会;Promise 微任务不保证这一点。

用同一条件验证

防抖减少次数,不减少最后一次工作的成本。拆分必须保持顺序和计算结果。

交互演示

比较计算、拆分任务和防抖。先预测输入变化会影响哪个阶段;只改变一个条件,比较输出与观察范围;将模型线索对应到真实录制。模型不计实战完成。

商城实战

输入事件之后,提示与结果迟迟不能绘制。

  1. 从课程准备商城;固定视口、CPU / Network 与缓存条件,再开始录制。
  2. 准备场景后再开始 Record,点击执行目标操作,观察搜索中与结果的呈现。
  3. 在 Main 查看任务、微任务与 Rendering;同时查看 Interactions / Event Timing。
  4. 固定输入与数据量,比较分批前后校验值和最长阻塞段。自定义反馈时间不是正式 INP。
  5. 保存故障与对照证据;错误方案不能记录修复。
  6. 回教程选择原因、证据与验证,并记录测量条件和不确定范围。

独立挑战与答案

为新交互选方案且保证结果正确。输入与故障随机变化;可能再次抽到同一类。

配置 根因 证据 针对性验证
配置1 一次同步任务完成所有计算 一个连续长任务,提示未及时绘制 分批处理并让出任务,核对完整结果
配置2 仅通过 Promise 微任务拆分计算 多段微任务仍处于同一阻塞窗口,没有任务级让出 用任务级让出替代微任务链
干扰项 只凭总耗时或颜色猜测 没有与本次操作对应的实际证据 改变所有条件且不复测

三级提示

  1. 先区分加载、交互、稳定性和绘制成本,不把所有慢归给网络。
  2. 在 Main 查看任务、微任务与 Rendering;同时查看 Interactions / Event Timing。
  3. 比较两种解释:一次同步任务完成所有计算;仅通过 Promise 微任务拆分计算。保持输入与条件一致,再核对针对性对照。

边界、恢复与来源

正常结果要保持 SKU、数量与业务校验值一致;对照只改变本课对应成本。先固定条件再录制,停止录制后保存 trace;恢复限速、Rendering 高亮和媒体模拟。CPU / 帧率结果按实际观测和多轮趋势解释,不能把课堂耗时当线上目标。

共同合同 · 验收记录 · 官方参考。