报错是这一行:ResizeObserver loop completed with undelivered notifications。
我先入为主了,看到 loop 就往循环引用上想,翻了半天闭包和依赖,白翻。这事发生在上个月中旬,用新工具第三天。
先说换工具。原来那个是公司统一买的,我用了快两年,熟,连它什么时候会开始胡说我都摸出规律了。九月说不续了,组长在群里问大家各自有没有顺手的,最后统一换成现在这个。第一天我还有点舍不得。新这个,怎么说呢,解释英文报错确实强。以前我拿到一坨堆栈是三步走:先扔翻译器,再复制去问,来回折腾三趟。现在整段贴进去,它不光翻,还会顺手给你指出哪一层才是根因。这个 feature 很 make sense(搭配对不对我不知道,意思到了)。
那天我把那段 ResizeObserver 的报错整段贴进去,它没跟着我往循环里钻。它说这大概率是浏览器的一个已知噪音,根因是我在回调里同步改了布局,导致下一帧通知堆积,让我去看 resize 回调里是不是直接动了 DOM。我一对照,就是这么回事。我写了个 debounce 包着,但回调里同步读了 offsetHeight 紧接着设了个 style,等于每帧都在量了改、改了量。
它给的修法是外面再包一层 requestAnimationFrame。我照着改,报错是没了。至少控制台干净了。
但别以为就顺了。同一个下午它给我补了个 throttle,我直接贴进项目,跑起来慢半拍我才发现第一次触发被它吞了,我要的是立刻执行那版。回去啃原文文档,果然有个 leading 参数我没传。这事又让我想到一个问题——它讲得越顺,我越容易不过脑子直接抄。以前我英语差,被迫一个词一个词查,慢是慢,但查过的地方基本能记住。现在快了,反而有几个地方我说不出为什么,只知道这么写能跑。
所以现在自己定了条规矩:它的解释我先接受,但代码里凡是我叫不出名字的方法,我得回原文里瞄一眼。不读全篇,看签名和第一段就够。麻烦,踏实。
别的感受。它写中文注释比上一个正常,上一个老给我写那种很长的句子,"这允许你去做……",新的这个短些。缺点也有,它特别爱加日志,console.log 撒一地,忘了删,上次提测被打回来一次。还有它偶尔会把我变量名改成它自己喜欢的风格,一个文件里三种命名法,我懒得改,反正能跑。
今日单词:throtle,呃,throttle,节流。油门那个词,读"斯罗头"。第十九次查它了,跟 debounce 还是分不干净——debounce 是防抖,等你不抖了才动;throttle 是节流,按固定频率动。这回写下来了,应该能记住。大概。