骨架屏不结束🏃🏻,CPU哪敢躺平🚨

核心就这一句🏋️

结论:至少Element系及AntD的骨架屏组件动效实现有性能(稳定占用一部分CPU资源)问题,但不影响正常使用。

事情是这样的🎸

某天办公时一时兴起打开了任务管理器,看见Chrome浏览器对应的进程有几个一直在跑,类似下面这样:

由于不清楚每个具体是对应的什么,随即好奇的进行了右键->结束任务操作,有的结束后页面崩溃了,有的结束后开发者工具自动退出了,直到有一个结束后伴随着页面一闪而过......竟然死灰复燃了,而且如此循环,如此往复,给我了一点小小的震撼,我看了看页面,有点懵逼。

良久,打开开发者工具后发现即使在没有对页面做任何操作的情况下,通过 Performance monitor 可以看到也一直有稳定的10%左右的CPU占用,类似下图:

然后在不操作页面的情况下,录制了一段时间内的性能表现情况,从中可以看到一直在循环跑某特定任务:

(防杠备注:截图用的Element官网页面的做示例,后同)

放大来看单个任务里面并没有跑JS相关的任务执行,而是规律的内容绘制:

所以排查方向就是看是否有样式层面的循环变动,一开始埋头在代码里面去把页面涉及到的样式代码看了个遍,但最终一无所获,确实没有写什么动态的样式代码,直到某一刻在观察页面时看见了某个偏于一隅的正在loading的小内容块......我心里还是咯噔了一下(内心OS:不可能,这绝对不可能,这可是用的组件库的骨架屏组件),我终于还是抬起了不太相信的手指做了一系列的操作:鼠标放到骨架屏上 -> 右键 -> 检查 -> 鼠标放到该元素上 -> 右键 -> Delete element

CPU直接躺平了,占用率降为0%,就像这样:

原来是这样的👨🏻‍⚕️

直到这时我第一反应依旧是当前我用的版本或者用法是不是有问题,又跑到官网去看了骨架屏组件页面验证了下,结果也是一样的情况,然后看了下具体的css写法:

css 复制代码
.el-skeleton.is-animated .el-skeleton__item {
    background: linear-gradient(90deg,#f2f2f2 25%,#e6e6e6 37%,#f2f2f2 63%);
    background-size: 400% 100%;
    animation: el-skeleton-loading 1.4s ease infinite
}

@keyframes el-skeleton-loading {
    0% {
        background-position: 100% 50%
    }

    to {
        background-position: 0 50%
    }
}

实现逻辑比较简单,在无限循环的动画里面,通过改变 background-position 来实现动效,而它的改变会触发重绘,重绘通常由CPU处理(除非触发GPU加速),频繁的 background-position 动画就导致CPU频繁处理重绘任务使得CPU占用率稳定居高不下。理论上的优化方案就是改用 transform 去实现该动效(至于是否能实现同样的动效还有待研究尝试,但我目前觉得吧这个组件的开发攻城狮们应该是有尝试过,只不过由于某种未知原因所以都采用了现在的实现方案)。

后面又看了下 ElementPlus 的骨架屏也是一样的情况,两者实现代码基本一致,但有个特殊情况是 ElementPlus 骨架屏的CPU占用率稳定在10%左右,而 ElementUI 的却稳定在8%左右,我盯着看了好一会儿,确实是这样,暂未深究,值得玩味。

Ant Design 亦是如此:

至于更多的其它组件库就没一一验证了。

最后我想说🍇

骨架屏的应用场景大家都知道,是为了更好的用户交互体验,一般不会专门拿来用作动画场景(但可能出现类似这样的动效实现写法),在loading结束后就没有了,所以倒也不至于导致页面运行存在稳定的额外性能消耗,但基于此问题可以延伸出性能问题排查、动画性能优化等开发过程中可能出现或遇到的场景。我自己平时没咋写过动画(翻看了下之前唯一一次写过的动画是老老实实的用 transform 做的),虽然相关理论知识知晓,但当真的看到骨架屏这个小小的动画所带来的CPU消耗情况时才能真切感受到相关知识的分量。

相关推荐
用户059540174467 小时前
把AI长期记忆测试从手动验证换成pytest,2天揪出11个隐藏Bug
前端·css
a1117769 小时前
唯美花朵风格的黑胶唱片音乐播放器
前端·css·css3
布兰妮甜14 小时前
CSS 现代布局终极方案:Grid 完整实战,替代浮动/弹性布局复杂场景
css·grid·实战教程·浮动·web布局
JR空位投 李佃贵是18 小时前
如何编写轻量级 CSS 框架
前端·css·tensorflow
寒水馨1 天前
Windows下载、安装 Tailwind CSS-v4.3.3(附安装包tailwindcss-windows-x64.exe)
前端·css·前端开发·tailwind css·utility-first·css 框架·独立 cli
思码梁田2 天前
CSS 定位详解:从相对到固定,掌握网页布局的核心
前端·javascript·css
muddjsv2 天前
CSS 高级选择器精讲:伪类、伪元素、逻辑伪类与选择器解耦规范
前端·css
用户446846004802 天前
C 语言分支与循环语句总结
css
寒水馨2 天前
macOS下载、安装 Tailwind CSS-v4.3.3(附安装包tailwindcss-macos-arm64)
前端·css·macos·tailwind css·utility-first·css 框架·实用优先
朕的剑还未配妥3 天前
CSS 实现渐变毛玻璃:从 backdrop-filter 到多层 mask
前端·css