前端首屏加载性能优化 那些没人说透的取舍账
上周跟个做ToB的前端聊,他说上周刚被产品追着骂,后台统计首屏加载要3.2秒,老板拍着桌子说要砍到1.5秒以内,少0.1秒都算不合格。
这事没那么玄。
前端首屏加载资源优先级瀑布流示意图
还有更离谱的操作。我之前见过一个营销活动页,首屏还没加载完,先把页面底部的30张用户晒图全部提前加载了,占了快2M的带宽,就因为当初写代码的时候图省事,把所有图片组件扔在同一个父节点里,根本没做视口可见性判断。这种情况下你就算把图片压成WebP,把JS拆的再碎,优化效果也微乎其微——核心问题从一开始就没找对。

前端静态资源加载优先级对比示意图
很多人优化的时候总盯着自己写的代码,却忘了藏在页面里的第三方脚本。第三方脚本的阻塞开销,往往比自己写的业务代码带来的影响更大。一个中型内容站算下来,广告、客服、实时评论这些第三方脚本,平均能占1.2秒的首屏阻塞时间,你把自己写的JS删的只剩骨架,那点优化还抵不上这些脚本拖的后腿。处理方法也简单,别让这些脚本挡着核心内容渲染,要么加async/defer异步加载,要么等核心内容渲染完了再拉取,甚至可以等用户滚动了半屏了,再把客服SDK加载下来,根本不影响功能使用。
先搞清楚你要优化的“首屏”到底是什么
很多团队一上来就抄网上的优化攻略,把代码分割、懒加载、资源压缩全套流程走一遍,最后测出来的首屏时间根本没降多少,问题出在最开始的定义就错了。首屏加载的核心判断标准,是用户能看到核心可交互内容的时间,不是浏览器onLoad事件触发的时间。 那个ToB的朋友之前就是踩了这个坑。他之前一直盯着onLoad的时间做优化,把自己写的业务JS压到了300K,结果一测首屏时间还是3秒多,翻了瀑布流才发现,页面里挂的客服聊天SDK、第三方埋点脚本,两个加起来光加载执行就用了1.8秒,刚好卡在渲染阻塞的关键路径上。但用户进这个页面,根本不会第一时间点客服入口,这俩东西占着核心路径挡着渲染,完全是无意义的消耗。那些被吹上天的优化手段,都藏着代价
别迷信什么最佳实践。所有的优化手段都有对应的代价,不存在没有副作用的银弹。 很多人张嘴就说要把所有图片转WebP,要把静态资源全上CDN,要把代码拆成最细的粒度。没错,这些方法单独拿出来都对,但你得算自己的账。WebP格式在三年前的老安卓机型上根本解析不了,要是没做格式降级,用户打开就是一片裂图,体验比加载慢还糟。代码拆分太细也有问题,每个路由单独打个chunk,用户从首页跳到详情页的时候,光JS chunk的请求就要发五六个,HTTP握手的开销直接吃掉了拆分带来的加载收益,最后算下来总时间反而更长。 我之前接触过一个团队,为了把首屏的JS体积压到100K以内,把所有的业务逻辑判断全挪到了客户端运行时做字符串拼接,结果首屏时间是降了0.3秒,但是页面交互的时候卡的要死,用户点个按钮要等半秒才响应,上线一个月留存掉了快两成,这账怎么算都亏。