前端首屏加载性能优化 先搞懂卡在哪

上周帮朋友排障,他做的家居类内容站首屏白屏2.8秒,运营说跳出率快到七成了。他照着网上的攻略一顿操作:把所有图片压到最低,给所有JS加异步,还上了边缘缓存。折腾一周,测出来2.3秒。

还是慢。

他挠头问,是不是要上SSR?我拉着他的Chrome DevTools跑了一遍Performance。

哦。

他的首屏白屏,根本不是资源加载慢。

是HTML文档本身,在服务器端生成要花1.7秒——他把首屏要展示的30条内容,全在Node服务里同步查了三次数据库,还在同一个接口里拉了广告位配置。

先搞懂你测的慢到底是哪一段慢


很多人嘴里的“首屏慢”,根本是个模糊的概念。

有人说的慢是白屏久——就是用户点进来,等了半天啥都没有,连个背景色都不出来。有人说的慢是内容出来了但点不动——按钮按了没反应,链接跳不了。

你得把整个加载链路拆成碎段看。从用户输入网址那一刻开始,DNS解析、TCP握手、TTFB(服务器返回第一个字节的时间)、HTML下载解析、CSS加载、DOM树构建、首屏内容渲染、JS加载执行、事件绑定,每一段的耗时都要拎出来。

Chrome DevTools Performance面板首屏加载时间线截图
Chrome DevTools Performance面板首屏加载时间线截图


刚才那个朋友的情况,TTFB就占了1.7秒,后面所有资源加起来的加载耗时才0.4秒。他之前折腾的压缩图片、拆包、缓存,全是在那0.4秒里挤水,当然看不到明显效果。

这事真的太常见了。我见过至少一半的团队,做前端首屏加载性能优化的时候,连自己的TTFB是多少都没测过,就先把webpack的拆包插件装了。

别迷信通用优化清单


网上流传的优化清单,每条单独拿出来都没错,但套到你的站身上,未必有用。

比如图片懒加载。大家都喊要做,可如果你首屏本来就要展示3张图,你给这三张图也加了懒加载监听,反而要等JS初始化完、监听到可视区域之后才开始加载,平白多了几十毫秒的延迟。

还有JS拆包。很多人照着教程把vendor拆成好几个chunk,结果首屏要请求七八个小JS文件。如果你的用户大多在三四线城市,用3G网络,并行请求的开销反而比单个大JS更大——请求多了,握手的时间就多了。

之前接触过一个做本地生活的团队,他们一开始把所有第三方SDK都塞在head里,什么统计、客服、广告,光这些JS就占了首屏可交互时间的40%。后来他们把这些SDK全改成用户第一次滚动或者点击之后再加载,首屏可交互时间直接砍了一半。

前端首屏加载各阶段耗时占比统计柱状图
前端首屏加载各阶段耗时占比统计柱状图


最烦的是那些SDK厂商的文档,全写着”请放在head标签内保证统计准确性”,说白了就是不想做延迟加载,把成本甩给你的站点。

优化的代价你得提前算清楚


很多人觉得优化是免费的,其实每一个方案都有代价。

比如SSR,确实能把TTFB降下来,首屏出来的速度快。但你得维护一套同构代码,还要给服务器加渲染资源,原来的静态站改成SSR之后,服务器成本可能涨两三倍。如果你的站本来就是内容更新不频繁的,完全可以用预渲染,把首屏的HTML提前生成好存在CDN上,成本比SSR低太多了,效果差不多。

还有图片用WebP,压缩率比JPG高30%,加载更快。但你得考虑老版本的安卓机能不能兼容,得做格式降级,不然用户打开全是裂图,得不偿失。

缓存也是个坑。很多人给带hash的JS和CSS设了一年的强缓存,这没问题。但有人顺手把入口HTML也设了强缓存,结果改了版本之后,用户还是加载旧的文件,出了线上bug,还要紧急回滚。说白了,缓存的粒度要卡好,带hash的静态资源可以放心强缓存,入口的HTML一定要设no-cache,不然全白搭。

很多人觉得前端首屏加载性能优化是个纯技术活,其实到最后都是算账的事——你要多少性能,愿意花多少成本,愿意承担多少兼容性风险,没有万能的方案。

上周那个朋友后来把服务器端的同步查询改成了并行查库,把广告位配置挪到了客户端异步加载,TTFB直接降到了300毫秒。现在首屏1.2秒就能出来。

他说早知道先测瓶颈,就不用折腾那一周了。
免责声明:市场有风险,选择需谨慎!此文仅供参考,不作买卖依据。如有侵权请联系删除。
文章名称:前端首屏加载性能优化 先搞懂卡在哪
文章链接:https://m.itcdj.com/it/236.html