跳至正文
Shopify · Google SEO

Shopify 后台速度报告与 PageSpeed 分数不一致,先看这几处

// / / 光算科技

后台速度报告和 PageSpeed Insights 的分数对不上,这本身不是故障。两个数字来自两套测量方式:一个是你店铺真实访问结果的汇总,一个是工具在受控条件下跑一次的结果。把它们当成同一个指标来比较,只会得出「优化没生效」或者「分数是假的」这两种都不对的结论。

先确认两个数字量的不是同一件事

后台报告属于字段数据。它统计的是一段时间内真实访问的采样结果,设备、网络、地区都是真实分布,所以达标率的含义是「有多少比例的访问达到了某个水平」,默认看 75 分位,并且移动端与桌面端分开统计。web.dev 对 Core Web Vitals 的评估口径写得很直接:达标要求是 75 分位的访问达到阈值,移动端和桌面端分别计算(Web Vitals 指标说明)。

两类数据为什么对不上:口径不同,不是谁错了

口径不同,不是谁错了(光算 · 示意图)

PageSpeed Insights 里的 Lighthouse 部分,以及开发者工具 Performance 面板,量的是单次加载。它固定设备模拟、固定网络节流,缓存和设备状态都由这次测试的开始条件决定。这类数据适合回答「慢在哪里」,不适合当成绩单用。

两类数据还会在同一张报告里同时出现,这一点最容易混:真实流量足够时,PageSpeed Insights 也会展示字段数据,而字段数据按 URL 分组,和后台按店铺或按页面类型汇总的口径依然不同。分不清的时候回到一个原则——判断体验有没有变好,看字段数据;找具体原因,看实验室数据。

对不上的四个常见来源

  • 设备与网络。实验室默认模拟移动设备并施加网络节流;真实访客里既有新手机连 Wi-Fi,也有旧设备在弱网下打开,混在一起后分布很宽,任何一次单点测试都代表不了这个分布。
  • 测试地区。工具从特定节点发起请求,你的访客分布在别处。做多市场销售时,同一个页面在不同地区的到达时间差别明显,报告里选的地区不是你的主要市场,结果就没有可比性。
  • 缓存状态。首次访问和回访走的缓存路径不同。你在本地反复测试时,静态资源往往已经在浏览器缓存里,测出来的成绩比新访客看到的好。
  • 第三方脚本的加载完成度。统计、客服、评论、同意横幅这些脚本,在实验室里可能超时、被拦截,或者按测试地区的判断根本不出现;而在真实访客那里它会完整加载并占用主线程。这是字段数据和单次测试分歧最大的一项。
  • 你测的页面和访客打开的页面不是同一个。多市场店铺尤其明显:访客走的是某个市场或某种语言版本,你测的可能是主域名下的默认版本;币种切换、活动参数、轮播停留位置也会让同一路径下的首屏内容不同。分母不一样,两个百分比就没有可比性。

这五条里,前四条是测量条件的差别,不改代码也能让两个数字对上;最后一条说明你手上的两个数字可能根本不是同一批页面。第三方脚本那一项要单独处理,它同时是测量问题和真实问题:脚本在你测试时超时,会掩盖真实访客承受的主线程开销;脚本在真实环境加载成功,又会把你以为已经优化好的交互拖慢。判断方法不复杂——把单次测试里所有外部脚本的请求列出来,看它们在测试结束前有没有加载完。如果测试在脚本还没加载完时就收尾,这次成绩衡量的是一个现实里不存在的轻量页面。

怎么对比才有意义

可比对的做法:不同条件的数据不要放在一起比

不同条件的数据不要放在一起比(光算 · 示意图)

  1. 一次只比一个 URL。产品页和集合页的趋势分开看,把不同模板混在一起平均,等于把问题平均没了。
  2. 固定条件。同一个工具、同一套设备或模拟配置、同一档网络、同一地区节点,用无痕窗口避开本地缓存。
  3. 改动之前先跑三次以上,把原始报告存下来。三次之间的差距就是这套条件下的噪声幅度;后面看到的提升如果小于这个幅度,不能算改动有效。
  4. 改完在同一条件下复跑同样的次数,逐项对比 LCP、CLS、INP,不要只看总分。三项指标各自对应什么体验、在 Shopify 上通常由什么引起,基线那篇已经拆开讲过(三项指标的分工与基线建立)。
  5. 同时观察后台字段数据的变化,但它有统计窗口,不会当天反应,不要拿它验证当天的改动。

先把首屏那张图处理掉,再谈分数

多数 Shopify 首页和产品页的 LCP 元素就是首屏主图。如果它被懒加载、缺优先级提示,或者被动画挡住,动这几处的收益比在别处抠分大得多。Shopify 的性能文档把「懒加载 LCP 图」列为最常见也最伤的反模式之一:image_tag 服务端渲染的价值在于浏览器预加载扫描器能在解析 HTML 阶段就发现图片地址,而 loading="lazy" 会把下载推迟到浏览器处理完隐藏的观察器事件之后(Never lazy-load the LCP image)。

优先级提示属于同一份文档体系里的要求:图片默认按低优先级被发现有,等布局完成后浏览器才把视口内的图片升级为高优先级,中间那段时间是白等的;LCP 图加 fetchpriority="high" 能消掉这段等待,但一页只加一张,并且不能和懒加载同时使用(Mark the LCP image with fetchpriority="high")。

第三件事是动画。淡入、页面过渡、滚动触发的显示效果都让元素从 opacity: 0 开始,而浏览器不会把透明元素算作 LCP 候选,要等到它以非零透明度重绘才记录。官方给的替代是改用 CSS @keyframes,它在元素第一次渲染时就启动,不需要等脚本执行,时长压在 0.3 秒以内比较合适;同时也去主题设置里找找有没有全局的页面过渡开关(Don't hide the LCP image behind animations)。

{% if section.index == 1 %}
  {{ section.settings.image | image_url: width: 1000 | image_tag: loading: 'eager', fetchpriority: 'high' }}
{% elsif section.index > 3 %}
  {{ section.settings.image | image_url: width: 1000 | image_tag: loading: 'lazy', widths: '400, 800, 1000', sizes: '(min-width: 1000px) 900px, calc(100vw - 2rem)' }}
{% else %}
  {{ section.settings.image | image_url: width: 1000 | image_tag: loading: 'eager' }}
{% endif %}

这段里有个容易踩的坑:section.index 在主题编辑器、静态 section 和 Section Rendering API 的返回里是空值,所以懒加载分支要写成正判断 section.index > 3,让空值落到 eager 分支。写成「等于 1 才算首屏」的负判断,你在编辑器里预览正常,线上却跑了懒加载。图片尺寸、容器比例和响应式宽度的细节在 LCP 图优化里单独展开(首屏大图的加载与尺寸处理)。

第三方脚本的瓶颈要单独标出归属

真正拖慢交互的部分经常不在主题里,而在应用注入的脚本和外部平台挂件。这类问题在报告上表现为主线程占用或长任务,但修复动作不在你手里。可行的做法是先把脚本按来源分成三类:主题自带、已安装应用注入、外部平台(统计、客服、支付)。第一类自己改;第二类要和应用方确认能否延迟加载或换实现;第三类先确认业务是否必需,再看能不能改成点击后再加载。为了分数把客服或统计脚本直接删掉,省下的是数字,丢掉的是渠道。完整的判断顺序在第三方脚本审计里(按来源分清脚本的责任归属)。

现象更可能的原因先验证什么归属
后台达标率不动,分数大幅波动单次测试受缓存、节点、脚本超时影响同一条件复跑三次,看波动幅度测量方法,不是代码
分数上去了,后台指标没变只改了实验室路径,真实访客路径没动后台按页面类型、按设备分开看主题层
首页达标,产品页不达标产品页脚本与变体交互更重在手机上确认 LCP 元素与主线程占用主题加应用
某个具体操作点了没反应事件处理或第三方脚本阻塞主线程看慢的是哪一类交互应用或外部平台

把结果记成一张能前后对比的表

口径统一之后,剩下的是纪律问题:改动和结果要能对上号。记录不需要复杂,但每一条都要包含这几项,缺一项这条记录以后就没法用。

  • 日期与时间、页面 URL、用的工具及测试条件(设备模拟、网络档位、地区节点)。
  • LCP、CLS、INP 三项的数值,以及工具给出的原始报告链接。链接比留一份无法复现的记录有用,因为它保留了完整的加载过程。
  • 本次改动做了什么、什么时候发布到线上。同一天有多次改动就分开记,合在一起写等于没有记录。
  • 同一次改动后如果复测了三次,把三次都写上。只写最好的一次,等于自己骗自己。

这张表最大的价值是否定作用:当你准备对一个「看起来慢」的页面动手时,先翻记录,看它在同样条件下到底有没有变差。很多被归到性能问题上的现象,其实是那几天第三方脚本在更新、活动页面在切换,或者测试条件从 Wi-Fi 换成了手机热点。没有记录,这些差别全会算到你头上。

不能当成承诺的几件事

没有一次单点测试能代表全部访客。同一页面在相同条件下复测,分数上下浮动是常态,所以别拿单次分数对外说性能提升了多少,那既不严谨,事后也无法复现。

平台已经处理的部分不需要你重复做。CDN、图片格式转换、默认压缩都在平台侧完成,你要负责的是主题和应用引入的那部分。这个边界和自建站完全不同,把自建站的优化清单整套套过来,会做很多无用功(平台默认能力与自建站的差别)。

后台报告有统计窗口和采样延迟,改动当天看不到变化属于正常,具体口径以当前后台展示为准。应用方的代码不要擅自动,改写或删除别人维护的脚本,出问题时的排查成本远高于省下的那点分数。

如果排查到最后发现真正的问题是页面能不能被抓取、能不能被索引,而不是加载速度,那要处理的是技术 SEO 的另一条线,性能报告回答不了(从抓取到索引的技术自查顺序)。两条线用的是同一套方法:先在固定条件下建立基线,再改动,再复测,差别只在看的是分数还是收录数据。把结论落到具体页面上时会发现,首页和产品页的瓶颈根本不一样(按页面类型排的移动端检查顺序)。需要人来建整站基线和验收标准,可以走光算的谷歌 SEO 服务(谷歌 SEO 与整站技术基线)。