前端性能优化是拆出来的不是堆出来的
上周跟做了六年前端的朋友吃夜宵,他把冰可乐碰得哐当响,说刚被业务方追着骂了一下午。页面打开要三秒,竞品才一秒不到。他熬了三个晚上改打包配置,压图片,拆包,跑Lighthouse拿了92分,结果用户反馈的速度还是没变化。
我啃了一口烤串,没接话。
太熟悉了。
前端核心网页指标用户感知热力图
说白了,你优化的从来不是测试工具上的冰冷分数,是用户从点下链接到能正常输入、点击、读到核心内容的那几秒。那些花里胡哨的装饰图,哪怕加载慢个两秒,用户根本不会在意。但要是核心按钮点了没反应,核心文字加载不出来,哪怕你整个页面的总加载时间再短,用户也会觉得这个网站慢得要死。

前端资源加载优先级瀑布流对比图
先搞清楚你在优化什么
很多人一碰到性能问题,第一反应是打开性能工具跑一遍,照着上面的红项挨个改。图片没压缩就压,脚本没异步就加async,缓存时间短就拉长。忙活一周,分数涨了,用户该嫌慢还是嫌慢。 你得先搞清楚,用户等的到底是什么。首屏可交互时间的权重,从来都比整页加载完成时间高。 举个最常见的例子。有个团队把首页所有图片都转成了webp,体积直接砍了70%,算下来首屏总加载时间少了近一秒。结果因为懒加载的判断逻辑直接绑在scroll事件上,没做节流,用户一滚动,主线程被高频触发的判断逻辑占满,直接卡成PPT。用户感知到的“慢”,比优化之前还强烈。那些没人跟你算的优化代价
别信那些列满优化技巧的清单。每一条优化手段,背后都藏着你要付的成本。 就说路由懒加载。确实,首屏包体积砍下来了,加载速度快了。代价是什么?每多切一个路由,就要多等一次动态脚本的加载。弱网环境下,用户点个跳转,白屏等个几百毫秒,比你一开始把整个包打进去的体验还糟。 还有预加载。听着很美好,把用户可能要访问的页面提前拉下来,切的时候秒开。但你算过带宽占比吗?你提前拉的那些资源,会挤掉首屏核心资源的加载优先级。本来核心脚本应该先加载的,结果被你预拉的次要资源堵在队列后面,首屏时间反而变长。 我之前见过一个项目,恨不得把所有能开的优化开关都拉满:代码分割、图片懒加载、第三方脚本异步、预连接所有CDN域名、资源提示全加上。最后一查请求瀑布图,首屏的请求数从原来的30个涨到了87个,光DNS查询的时间加起来,就占了首屏总时间的四分之一。 麻烦在于,每加一层优化逻辑,就多一个可能出bug的节点。比如你给懒加载的图片设了占位符,忘了给核心图设置固定宽高比,图片加载的时候直接把下面的文字顶下去,用户刚读到一半的内容突然跳位置。这种体验,比你慢个几百毫秒还让人火大。