[v1.3] 显著提升 UI 响应速度 —— 修复 ArcoDesign/React 中 focusin / focusout 事件问题#1224
[v1.3] 显著提升 UI 响应速度 —— 修复 ArcoDesign/React 中 focusin / focusout 事件问题#1224cyfung1031 wants to merge 10 commits intoscriptscat:release/v1.3from
Conversation
|
如果是arco的问题,我觉得可以给arco提pr,让他们发新包更新一下,不过鉴于arco维护并不积极,可以临时这样处理一下 看代码感觉侵入性还是太强了 |
|
如果是arco的问题,我觉得可以给arco提pr,让他们发新包更新一下,不过鉴于arco维护并不积极,可以这样处理一下 |
Co-authored-by: wangyizhi <i@xloli.top>
老实说我也不知道是 React 问题 还是 ArcoDesign 问题 还是 ScriptCat 业务代码问题 |
|
加了注释。 |
|
应该只有 focusin/focusout 是否存在类似事件?存在,但真正值得像 focusin / focusout 这样采用 macrotask 延迟处理的同类事件非常少。 大多数问题集中在同时具备「同步冒泡 + 高频触发 + React/框架额外包装一层」特性的事件上。 以下按实际踩坑概率从高到低排序,而非罗列所有事件。 一、与 focusin / focusout 同级别(最需关注)1. focus / blur(
为何仍需关注?
但: 结论: 二、存在「同步连环触发」的高频 UI 事件(有一定风险)特点:一次用户操作 → 同步触发多个事件 → React/框架再次包装 2. mouseover / mouseout(次高风险)
为何通常没 focusin 那么严重?
结论: 3. pointerover / pointerout(🟡 现代且相对干净)
结论:基本无需特别担心。 三、真正的高频事件,但不适合用 macrotask 方案4. scroll / resize(🚫 不建议此方式)
若强行放入 macrotask:
推荐正确处理方式:
四、键盘与输入相关事件(需视场景而定)5. input / change / keydown / keyup在中文输入法(IME)场景下会产生: 一次输入可能导致原生 + React 多轮触发。 但这些事件语义极其敏感(光标位置、撤销栈、输入法交互等),延迟到 macrotask 极易引入 bug。 结论: 五、为何 focusin / focusout 尤其“特殊”?当前 macrotask 方案几乎是为它们量身定制,主要原因同时满足以下六点:
真正同时满足这六点的其他事件极少。 六、实战判断标准(Mental Checklist)未来遇到类似性能问题时,可快速对照以下条件: 只有同时满足全部条件的事件,才值得考虑 macrotask 延迟方案:
目前几乎仅限于:
|

React 16.14.0 -> React 17.0.0
经测试,会在 dom 加入这些事件
ArcoDesign 实际上只支持到 React 16.x (16.13.0)
所以没针对React >=17 作出优化?
( ArcoDesign 以 onFocus onBlur 作出发点,但实际上是用 focusin focusout)
( ScriptCat的设计,一个页面会有多个 tabIndex 项,所以 click 的时候会有这样的 focusin focusout ?)
(React 本身好像只會 anchor 在 div#root, 但 ArcoDesign 好像因為有Modal之類的會 anchor 在 body? 所以兩者互相衝突了? )
https://github.com/arco-design/arco-design/blob/72a881a37a5957d16021cf26d39e6e2e63b05021/package.json#L120-L121
我不知道是ArcoDesign本身的问题还是什么了
我估计它在初始化时会加一些 event 在 body 和 root
但它加了之后,在Re-render 时又再加一次
所以会有重复触发
在 ScriptList Table
有300个scripts
打勾一下
你会发现拖超慢
然后你看一下 DevTools, 会显示为 focusin focusout 超时
打印一下的话,会发现 focusin focusout 的 handler 一次打勾会执行 8次左右
现在加了这个 fix, 打勾要等一秒的情况就完全消失了 (打勾不会卡死在 focusin focusout)
整个体验快乐得多了 ...
screen-capture.25.online-video-cutter.com.-00.00.00.000-00.00.28.559.mp4