上周帮朋友看他那个刚上线的内容站,首屏要4秒多才出字。他把所有网上能搜到的优化手段全堆上去了——图片转webp、路由懒加载、gzip开了,甚至把第三方统计脚本都删了一半,最后跑Lighthouse分数还是卡在62。我打开他的打包产物看了一眼,差点笑出声。
别上来就堆优化手段 先搞清楚首屏到底在等什么
好多人做前端首屏加载性能优化的第一步,就是翻出网上的优化清单,一条一条对着打勾。根本没花十分钟去看自己的页面加载到底卡在哪。

说白了,首屏慢从来不是单一环节的问题。你盯着Lighthouse的分数抠,不如打开Network面板,把缓存全清了,硬刷一次,看时间线里哪段是空白的。
我见过太多人,把所有JS压到200KB以内,结果首屏要等的那个CSS文件,因为CDN回源慢,卡了1.8秒。还有的人,把首页的首屏图片全设成了懒加载,包括一打开就占满半屏的banner——这不闹吗?用户刚打开页面,视线直接落在banner上,你让它等JS加载完再开始请求,那前面两秒屏幕全是白的,谁等得起。
首屏加载的核心判定逻辑从来不是“所有资源都加载完”,而是“用户视线范围内的内容能在1.5秒内开始渲染”。很多人被网上的文章带偏,非要把首屏的JS体积压到100KB以下,甚至把组件库全拆了,结果为了抠这几十KB,把原本同步加载的关键CSS拆成了异步,等CSS到了才开始出字,反而更慢。这账算得完全不对。
那些被吹上天的优化手段 藏着你没算过的代价
好多优化手段的效果是真实的,但从来没有免费的午餐。
就说SSR,好多人说SPA首屏慢,全换成SSR就好。是好。但代价呢?你要搭服务端渲染的节点,要处理服务端的缓存,要应对首屏请求直接打在服务器上的流量压力。上次有个做电商的朋友,大促前把首页换成SSR,平时服务器QPS撑2000都稳,大促当天首屏请求直接翻了三倍,没撑十分钟就502了。

还有预加载、预连接,好多人把所有域名全写在link标签里preconnect,不管这些域名的资源首屏到底用不用。我见过一个站,光preconnect就写了6个域名,结果每次打开页面,浏览器要先跟6个域名做DNS查询、TCP握手、TLS协商,光这部分就占了近300毫秒的空白时间。
真的,别觉得多写几行link标签就是做了性能优化。浏览器的连接数是有限的,你把宝贵的连接名额全给了根本用不上的域名,真正要加载的首屏资源反而要排队等。
再说代码分割,路由懒加载大家都知道,但好多人把组件库的基础组件也拆成独立chunk,结果首屏要用到的按钮、输入框、导航栏,分别打了三个chunk,浏览器要发三次请求,等三个文件都到了才能渲染首屏。反而不如把这些首屏必用的组件打包进主chunk,一次请求拿全,省下来的请求握手时间,比你压个几十KB的体积有用多了。
别迷信跑分 真实用户的感知才是最终标尺

好多人优化完,对着Lighthouse的分数乐,说自己首屏性能拿到90分以上了,结果用户反馈打开还是慢。为啥?因为Lighthouse跑的是实验室环境,用的是模拟的4G网络,没有考虑真实用户的网络波动,也没有考虑用户设备的性能差异。
比如你在自己的顶配Mac上跑,首屏0.8秒就出来了,分数拉满,结果用中低端安卓机打开,JS解析就要花1.2秒,加上图片解码的时间,用户实际看到首屏的时间要3秒多。
真正要盯的性能指标,是用户实际感知的First Contentful Paint,是看到首屏核心内容的时间,不是跑分软件给你的虚拟分数。
怎么盯?别光在自己电脑上测,把性能监控的SDK埋上去,分网络类型、分设备档位看真实数据。我之前帮一个资讯站调优,一开始看监控数据,整体FCP是1.2秒,觉得挺好,结果拆分数据一看,2G网络下的用户FCP是4.7秒,占了总用户的18%。后来把首屏的核心HTML直接内联在页面里,把非关键的JS全延后到首屏渲染完再加载,这部分用户的FCP直接降到2.1秒,跳出率掉了快12个百分点。
说实话,前端首屏加载性能优化这事,真没网上说的那么玄。不是要你背完所有的优化清单,把所有能开的配置全打开,而是要分清楚哪些资源是首屏真的要的,哪些是可以往后排的。别为了凑跑分,把简单的事搞复杂。
我见过最离谱的优化,是为了把主包体积压到100KB以内,把首页首屏的文案全做成了图片,结果图片比原来的JS还大,加载时间反而翻了倍。这种事,但凡多花两分钟算下账,都不会犯。
下次再碰到首屏慢的问题,别着急抄网上的优化清单。先打开你的devtools,看清楚时间到底花在哪了。算清楚每一个优化手段背后的代价。比你看十篇所谓的最佳实践有用。