智汇 IT
城启新篇

前端性能优化藏在日常代码的取舍里

上周跟做电商前端的老周在珠江路的咖啡店坐了一下午,他吐槽刚结束的季度优化项目,熬了三个通宵把主JS包从1.4M压到了280k,结果后台的用户反馈还是说打开商品页慢。 他翻来覆去的算,哪里还能再砍点体积。 我凑过去看了看他的监控数据,首屏的LCP值是4.2秒。 拖后腿的根本不是那个JS包。 是页面最上面的轮播图,1.8M的原图,连个压缩都没做。 他愣了半天,说原来大家说的前端性能优化,根本不是对着代码体积死磕。

先搞清楚你要优化的到底是什么

太多人一提到前端性能优化,第一反应就是打开Lighthouse跑个分,把分数刷到90分以上就算交差。 完全不管自己的用户到底是什么样的。 是每天在地铁里挤着用4G刷内容的上班族?还是在办公室千兆网下打开管理系统的员工?是用最新款iPhone的年轻人?还是攥着用了四年的安卓机的中老年用户? 测试环境的默认参数,从来代替不了真实的用户感知。 很多人打开DevTools的网络面板,盯着那一排彩色的条看十分钟,根本找不出来哪个资源在拖后腿。
Chrome DevTools网络面板首屏加载瀑布流截图
Chrome DevTools网络面板首屏加载瀑布流截图
麻烦在于,你不能只看哪个资源体积最大。真正影响用户感知的,从来不是资源的绝对体积,而是它在整个渲染流程里的位置。比如那个120k的轮播图,哪怕体积比下面的评论区加载的JS小一半,但是它是LCP元素,它晚加载100ms,用户感知的慢就会被放大十倍。而那个评论区的JS哪怕有500k,只要是在用户滑动到对应位置之前加载完,根本没人在意它多大。 之前见过一个团队,为了刷Lighthouse分数,把所有的非关键CSS都拆到了外部文件,结果在弱网环境下,首屏直接闪了三次白屏——因为CSS加载完了,渲染了一版,后面的异步CSS到了,又重新渲染了一版。分数是上去了,用户的实际体验反而更差。 对吧?你优化的是用户的感知,不是测试工具的评分。

所有优化都要算清楚代价

没有零成本的优化。 所有的前端性能优化操作,本质都是在做动态的取舍。 很多人张口就来,要做全量代码分割,要把所有图片转WebP,要把所有第三方脚本都做延迟加载。从来没人提过这些操作背后的代价。 比如代码分割,看似把主包从1.2M砍到了300k,结果路由跳转的时候要多等200ms的chunk加载。用户从首页点到详情页的那一下,白屏的时间比之前还长。 比如WebP图片,体积是小了40%,但是要兼容老的安卓机型的话,你得做多格式的格式判断,多出来的逻辑代码,加上老机型上图片解码的性能开销,在那种2G内存的设备上,反而比加载原图还卡。 之前碰到过一个创业团队,为了把首屏的JS体积压到200k以内,把所有业务逻辑里的通用工具函数都做了内联。结果后续迭代的时候,同样的判断逻辑在代码里抄了十几遍,半年下来,光重复代码的维护成本就多花了两个前端的人力。这账怎么算都亏。 很多人做资源加载的时候,只会把所有JS都加上async属性,根本不管哪个是关键的,哪个是次要的。
浏览器渲染关键路径资源优先级标注示意图
浏览器渲染关键路径资源优先级标注示意图
浏览器本身有内置的优先级调度机制,你要是乱加属性,反而会打乱它的节奏。比如那个首屏需要的核心CSS,你要是乱加上defer,那浏览器就得等JS解析完才渲染,白屏时间直接涨了几百毫秒。 这事没那么玄。不是你写的优化代码越多,效果越好。很多时候你不动,比瞎动的效果还好。

别把优化当一次性的项目

性能是持续维护的指标,不是可以一次性交付的项目。 太多团队的前端性能优化,就是版本上线前抽一周时间集中搞。搞完了就把相关的埋点、监控全关了。 结果过了三个月,新的运营活动功能、新的业务组件、新的第三方统计脚本往上堆,主包体积又涨回了原来的大小,LCP值又掉回了之前的水平。之前熬的那些夜,全白费。 说实话,性能从来不是一劳永逸的事。 你得把那几个核心的性能指标,嵌到日常的开发流程里。每次提合并请求的时候,自动对比当前分支的主包体积、LCP、首次输入延迟的数值,要是涨过了之前定的阈值,直接卡住不让合并。不要等老板在周会上说”怎么页面又打开慢了”的时候,才临时抱着代码库到处找可以砍的体积。 慢,从来不是某一个资源的错。 你盯着那个占了页面三分之一高度的运营位大图,把它压缩80%,换个低质量的模糊占位图,用户打开页面的时候,第一眼看到的不再是白屏,而是模糊的图慢慢变清晰。那种感知上的快,比你把JS包压到100k以下的效果强太多。 不过话说回来,也没必要为了快把页面做的像上个世纪的网页。该有的动效,该有的交互,该有的业务功能,一样都不能少。前端性能优化从来不是让你把功能砍光换速度,是在你现有的功能边界里,找那个让用户最舒服的平衡点。 老周最后回去把那个1.8M的轮播图压成了200k的WebP,加了个模糊的占位图。当天下午的用户反馈里,说打开慢的评论少了七成。 他之前熬的那些通宵,全花错了地方。
免责声明:市场有风险,选择需谨慎!此文仅供参考,不作买卖依据。如有侵权请联系删除。
文章名称:前端性能优化藏在日常代码的取舍里
文章链接:https://www.itcdj.com/news/729.html