上周跟一个做电商业务的前端工程师聊天,他说为了把首屏加载时长压到1秒以内,熬了三个大夜,把图片懒加载阈值压到了视口外100像素的位置,把首屏的JS拆得七零八碎,好不容易上线跑通,转头就被运营拍了桌子——用户滑了半屏商品列表,图还没加载出来,直接对着空白框划走,页面跳出率涨了快8个点。
别上来就套性能优化的万能公式
很多人一提到前端性能优化,上来就搬Core Web Vitals的标准卡数值,什么LCP要进2.5秒,INP要低于200毫秒,CLS要小于0.1。说白了,这些数值是行业通用的及格线,不是让你拿着尺子往死里抠的终极目标。
没人跟你说过,为了把LCP硬压到1.8秒,把所有非首屏的JS全拆成异步,把首屏CSS压到只剩30%的必要样式,最后会落得什么结果。路由切的时候白屏要等个300多毫秒,用户点个菜单要等半秒才出视觉反馈,那种滞涩的卡顿感,比你LCP差个几百毫秒要难受一百倍。

麻烦在于,太多人把性能优化当成了数字游戏。跑完一遍Lighthouse,看到分数从60涨到95,截图发个朋友圈就觉得交差了,根本不管实际场景里的问题——会不会因为拆得太碎的chunk文件,在弱网下反复触发请求失败,会不会因为把所有图片都压成了高压缩比的WebP,导致老版本安卓机打开全是花屏。
我上次见个开发者,为了拿Lighthouse的全满分,把网站里所有第三方脚本都给拦了,连用户登录用的SDK都没放过,结果上线第一天,登录接口报错率涨了40%。你说这叫优化吗?这叫拆家!
你省下来的每一毫秒,都要付对应的代价
很多人从来没算过这笔账。比如做路由级的代码分割,把每个页面的JS单独拆成独立chunk,看起来首屏加载体积小了,但是你要多维护几十份chunk的缓存逻辑,每次发版的时候,用户可能拿到旧的chunk哈希,直接报资源加载失败。为了兜这个问题,你得写全局的chunk加载重试逻辑,还要做版本检测,发现旧版本就自动提示用户刷新。这些代码,哪个不需要写?哪个不需要测?
没有免费的优化。
比如把所有静态资源都上CDN做边缘缓存,看起来请求响应快了,但是你得跟CDN厂商对接精细的缓存失效规则——哪些内容是用户个性化的,绝对不能缓存,哪些内容是全局静态的,可以存到离用户最近的边缘节点。上次有个团队图省事,把用户的个人主页HTML也给缓存到CDN了,结果A用户打开自己的主页,看到的全是B用户的历史订单信息,吓得连夜回滚,那个事故造成的损失,比你省下来那几百毫秒的加载时间,贵出去不知道多少倍。

还有人说要做资源预加载,把用户可能点击的下一个页面的资源提前拉下来。听起来很美对吧?但是你怎么精准预判用户的操作路径?如果瞎做预加载,在用户的移动流量下,偷偷多下了几兆根本用不上的JS和图片,用户看到流量条跳的时候,只会觉得你这个网站在偷跑他的流量。我见过最离谱的站点,一进首页就把整个站点所有页面的资源全给预加载了,首屏加载速度确实快了,但是用户还没开始操作,后台就跑了20多兆的资源请求,4G网络下没两分钟就耗掉了半格流量,转头就把网站关了,再也不来了。
真正的优化是盯着用户体感做的

别拿实验室里的测速结果当真理。你在办公室千兆网下测出来的1秒首屏,跟用户在地铁里拿着五年前的旧安卓机,隔着两层信号屏蔽板测出来的结果,根本不是一回事。
很多时候,用户根本不在乎你首屏到底是1.2秒还是1.8秒。他在乎的是,点了按钮之后页面有没有立刻给他反馈,有没有转个圈等半天都没反应;他在乎的是,滑到商品图位置的时候,图是不是刚好在他视线到达之前就加载出来,不是看到个空白框愣两秒;他在乎的是,页面有没有毫无预兆地突然跳一下,把他正在点的按钮给挪走,害他点到根本不想看的广告上去。
用户感知到的快,从来不是你测速表上的数字,是他操作的时候,系统有没有跟上他的反应。之前有个团队,没搞那些花里胡哨的复杂优化,就改了一件事:把所有按钮的点击反馈从原来的100毫秒延迟,改成按下立刻出样式变化。就这么个小改动,用户反馈的“网站很卡”的工单量,直接降了60%。你说这不是性能优化是什么?
别总想着一步到位把性能拉满。先摸清楚你的用户画像再动手。如果你的用户都是用最新款的手机在千兆宽带下访问,你大可以上最复杂的动画、最炫的交互,根本不用纠结那几百毫秒的加载时间。如果你的用户大部分是在三四线城市,用千元机在弱网环境下刷你的站点,那你就老老实实把JS体积砍下来,把图片压得小一点,把不必要的动画全关了。
没有放之四海而皆准的优化方案。有人说要上SSR,把页面在服务器端渲染好,首屏速度就上来了。但是你要算SSR的服务器成本,要处理 hydration 不匹配的兼容问题,要维护两套渲染逻辑。如果你的站点本来访问量就不高,算下来服务器成本都赚不回来,那硬上SSR不是纯纯给自己找事吗?
前端性能优化这事,从来不是什么高大上的技术炫技。就是你站在用户的角度,想想他用的时候会不会觉得别扭,会不会因为加载太慢等得不耐烦,会不会因为卡顿点半天点不动。就够了。别总想着拿个满分交差,能让大部分用户用着舒服,就已经赢过绝大多数同行。