Shopify 商店性能优化
商店性能不只是技术指标,直接影响转化率与 SEO 排名。Google 自 2021 年起将 Core Web Vitals 纳入排名信号;Akamai 与 Shopify 的多项联合研究显示,LCP 每提升 1 秒,移动端转化率提升约 7-10%。但实际项目中,Lighthouse 跑分 90 分以上的 Shopify 主题很少见——多数店铺停留在 40-60 分之间。
本文按”评估 → 诊断 → 优化 → 持续监控”四阶段展开。
一、Shopify 平台层面的默认优化
Shopify 在基础设施层已经做了多项性能优化,不需要额外配置:
- 全球 CDN:所有静态资源通过 Cloudflare 分发,Shopify 状态 与 Cloudflare 状态 可查看可用性
- 图片 CDN(cdn.shopify.com):自动转换 WebP/AVIF 格式,按浏览器能力派发
- HTTP/2 + Brotli 压缩:所有响应默认启用
- 静态资源缓存:CSS、JS 默认长缓存
这些是免费且自动的,不需要”开启”或”配置”。性能问题几乎不来自 Shopify 基础设施,而来自店铺自定义内容。
二、Core Web Vitals 三项指标
Google 用三项指标评估真实用户体验:
| 指标 | 含义 | 良好 | 需改进 | 差 |
|---|---|---|---|---|
| LCP(Largest Contentful Paint) | 最大内容元素绘制时间 | ≤ 2.5s | 2.5-4s | > 4s |
| CLS(Cumulative Layout Shift) | 累积布局偏移 | ≤ 0.1 | 0.1-0.25 | > 0.25 |
| INP(Interaction to Next Paint) | 交互到下次绘制 | ≤ 200ms | 200-500ms | > 500ms |
INP 自 2024 年 3 月起取代了旧的 FID 指标。三项的衡量基准都是75 分位的真实用户数据(CrUX 数据集),不是 PageSpeed Insights 的实验数据。
在哪看真实数据
- Google Search Console → 网页体验:来自 Chrome 用户的真实数据,最权威
- Shopify 后台 → Web Performance Dashboard:Shopify 提供的真实用户监控
- PageSpeed Insights → “实际数据”标签页:CrUX 数据,与 GSC 一致
不要用 PageSpeed Insights 的”实验数据”做决策——那是单次模拟,波动很大。
三、LCP 优化(最高优先级)
LCP 元素 90% 的情况是首屏 hero 图片或第一个 H1 区域。
常见瓶颈与对策
瓶颈 1:首屏图片未压缩
最常见。原图 3-5MB 直接上传,LCP 普遍 > 4 秒。
对策:
- Hero 图压到 ≤ 250KB
- 主题文件中的背景图通过
image_url指定合理尺寸:
{# 反例 #}
<img src="{{ section.settings.hero_image | image_url }}">
{# 推荐 #}
<img
src="{{ section.settings.hero_image | image_url: width: 1920 }}"
srcset="
{{ section.settings.hero_image | image_url: width: 800 }} 800w,
{{ section.settings.hero_image | image_url: width: 1200 }} 1200w,
{{ section.settings.hero_image | image_url: width: 1920 }} 1920w"
sizes="100vw"
fetchpriority="high"
width="{{ section.settings.hero_image.width }}"
height="{{ section.settings.hero_image.height }}"
alt="{{ section.settings.hero_image.alt | escape }}">瓶颈 2:首屏图片错误地加了 lazy load
{# 反例:首屏图也用 lazy #}
<img src="..." loading="lazy">
{# 正确:首屏图禁用 lazy,加 fetchpriority="high" #}
<img src="..." fetchpriority="high">fetchpriority="high" 是 2023 年新增的浏览器属性,告诉浏览器立即下载。结合 <link rel="preload"> 效果更好:
<link rel="preload" as="image"
href="{{ section.settings.hero_image | image_url: width: 1920 }}"
fetchpriority="high">瓶颈 3:JavaScript 渲染 hero 区域
部分主题用 React / Vue / Alpine.js 异步加载首屏内容,导致 LCP 元素延后显示。
对策:
- Hero 区域用纯 Liquid + HTML 渲染,不依赖 JS
- 如必须用 JS,把 hero 用骨架屏 + Server-Side Rendering 预渲染
瓶颈 4:Web 字体阻塞渲染
{# 反例:阻塞渲染的字体加载 #}
<link rel="stylesheet" href="fonts.css">
{# 推荐:preconnect + font-display: swap #}
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="preload" as="font" type="font/woff2"
href="..." crossorigin>在 CSS 中使用 font-display: swap 让文本立即用 fallback 字体显示,自定义字体加载完成后再切换。
深入调试
Shopify 官方有专题文档:针对 Shopify Liquid 店面加载缓慢的常见原因
四、CLS 优化
CLS 测量页面加载过程中元素跳动幅度。常见来源:
来源 1:图片缺少 width / height
浏览器在图片加载完成前无法知道占位高度,加载完瞬间挤动周围内容。
{# 反例 #}
<img src="{{ product.featured_image | image_url: width: 800 }}">
{# 推荐 #}
<img
src="{{ product.featured_image | image_url: width: 800 }}"
width="{{ product.featured_image.width }}"
height="{{ product.featured_image.height }}">显式声明 width / height 后,浏览器按比例预留空间。
来源 2:字体加载触发文本重排
Web 字体加载完成后,文本宽度可能变化。对策:
font-display: swap让 fallback 字体先显示- 用
size-adjust让 fallback 与 web 字体度量接近:
@font-face {
font-family: 'CustomFont';
src: url('font.woff2') format('woff2');
font-display: swap;
size-adjust: 98%; /* 调整使 fallback 字宽接近 CustomFont */
}来源 3:动态注入的弹窗与 Banner
Cookie banner、邮件订阅弹窗、限时折扣条等会延迟注入挤动布局。
对策:
- 弹窗用
position: fixed,不影响文档流 - Cookie banner 在
<body>顶部预留固定高度 - 评论 widget 等用
<iframe>包裹,预设高度
来源 4:广告位 / 嵌入内容
YouTube 嵌入、Instagram 嵌入等加载完高度会变。对策:用 aspect-ratio CSS 属性预设比例:
.youtube-embed {
aspect-ratio: 16 / 9;
width: 100%;
}深入调试
Shopify 官方:如何在 Shopify 网站中优化 CLS
五、INP 优化
INP 测量交互(点击、输入)到下次屏幕绘制的延迟。主要瓶颈是 JavaScript 主线程阻塞。
常见原因
原因 1:第三方脚本同步加载
Klaviyo、Pinterest、TikTok、Recart、Hotjar 等都通过 <script> 注入。每个脚本初始化时占用主线程。
对策:
- 所有第三方脚本用
async或defer - 评估每个脚本的业务价值,删除非必要的
- 把次要脚本延迟到首次交互后加载:
let scriptsLoaded = false;
function loadDeferredScripts() {
if (scriptsLoaded) return;
scriptsLoaded = true;
// 加载非关键脚本
const scripts = [
'https://heatmap-script.com/script.js',
'https://chat-widget.com/widget.js',
];
scripts.forEach(src => {
const s = document.createElement('script');
s.src = src;
s.async = true;
document.head.appendChild(s);
});
}
// 在用户首次滚动或点击时加载
['scroll', 'click', 'keydown'].forEach(event => {
window.addEventListener(event, loadDeferredScripts, { once: true, passive: true });
});
// 兜底:5 秒后强制加载
setTimeout(loadDeferredScripts, 5000);原因 2:主题 JavaScript 框架重
部分主题打包了完整的 React / Vue 用于简单交互,主线程负担重。
对策:
- 简单交互用原生 JS 或 Alpine.js(< 8KB)
- 复杂交互用 Web Components 而非全栈框架
原因 3:单个 section 输出过大
Liquid 渲染数百个产品的 collection 页面,HTML 单体超过 1MB,浏览器解析慢。
对策:
- 用
{% paginate %}拆分页面 - 折叠内容(FAQ、产品描述)用
<details>而非 JS 控制 - 长列表用虚拟滚动(仅渲染可见项)
原因 4:Cart Drawer 弹出卡顿
打开购物车时同步执行复杂逻辑(加载产品图、计算运费、显示推荐)。
对策:
- 加购物车数据预先在页面加载时缓存
- 弹出 Drawer 时仅显示骨架屏,数据异步加载
- 推荐位置用
IntersectionObserver懒加载
深入调试
Shopify 官方:找到对页面加载产生最大影响的 JavaScript 内容的 3 种方法
六、应用审计
每个安装的应用都可能向主题注入 <script> 和 <link>。多数店铺安装 10-20 个应用后,性能严重劣化。
审计流程
Step 1:用 Chrome DevTools 找罪魁祸首
- 打开 Chrome DevTools → Performance 标签
- 录制一次页面加载
- 在 “Bottom-Up” 视图按 “Total Time” 排序
- 找到最耗时的脚本,对照域名定位是哪个应用
Step 2:评估每个应用的 ROI
对每个应用问三个问题:
- 这个功能能用 Shopify 原生功能替代吗?
- 这个应用过去 30 天的实际使用频率?
- 卸载后能挽回多少性能?
Step 3:常见可卸载的应用类型
| 类型 | 替代方案 |
|---|---|
| 弹窗 / Popup | Shopify Email 自带、或简化为 Liquid 实现 |
| 评论展示 | Judge.me / Loox 性能差异大,挑性能优的 |
| 推荐位 | Shopify Product Recommendations API(原生) |
| 计时器 / 紧迫感 | 一行 Liquid + 简单 JS 即可,不必装 App |
| 多语言 | Shopify Markets 原生(替代 Langify) |
应用市场审核中的”性能影响”标签可以参考,但不绝对。最准的还是自己审计。
七、模板选择与定期更新
Shopify 主题性能数据
Shopify 官方维护 Theme Performance Data Table ,公布主流付费 / 免费主题的真实性能数据。可查询主题在生产环境的 LCP、CLS、INP 中位数。
性能良好的免费主题:
- Dawn(Shopify 官方推荐,性能基准)
- Sense
- Crave
- Studio
这些都是 Online Store 2.0 主题,原生支持 sections everywhere 与 metafields。
主题需要定期更新
很多店铺主题安装后两三年不更新,但 Shopify 主题持续接收 bug 修复与性能改进。建议每季度查看主题更新,谨慎升级(先在 unpublished 主题上测试)。
八、测试工具
真实用户监控(首选)
| 工具 | 数据类型 | 用途 |
|---|---|---|
| Google Search Console → 网页体验 | CrUX 真实用户 | SEO 排名相关 |
| Web Performance Dashboard | Shopify 真实用户 | 商家自查 |
| Chrome User Experience Report | 全网 CrUX 数据 | 行业基准对比 |
实验性诊断(用于调试)
| 工具 | 用途 |
|---|---|
| PageSpeed Insights | 综合诊断,含建议 |
| Chrome DevTools Lighthouse | 本地详细诊断 |
| WebPageTest | 性能瀑布图、视频回放 |
| Chrome DevTools Performance | 主线程深度分析 |
实验数据与真实数据可能差很多——实验环境在固定网络、固定设备模拟,真实用户分布在各种设备与网络。优化决策以真实数据为准。
九、持续监控与改进
月度复盘
每月在 Google Search Console 的”网页体验”报告中查看:
- LCP / CLS / INP 三项的通过比例(75 分位)
- 移动 vs 桌面分别看
- 与上月对比,识别哪些页面退化
改动验证
每次主题改动 / 应用安装后:
- 在 unpublished 主题上测试,PageSpeed Insights 比较前后
- 上线后等 28 天,观察 CrUX 数据
- 不要在大促期间做大改动
性能预算
为关键页面设置性能预算(performance budget),超出预算的改动不能上线:
| 指标 | 预算 |
|---|---|
| 主页 LCP | ≤ 2.5s |
| 产品页 LCP | ≤ 2.5s |
| 主页 JavaScript 总体积 | ≤ 200KB |
| 主页图片总体积 | ≤ 1MB |
预算超出时强制 review,决定是否值得为新功能牺牲性能。
十、获取专业帮助
Shopify 自带主题(Dawn 等)的基础性能问题可联系 Shopify 官方支持。
第三方主题或深度定制需要联系:
- 主题原开发者
- 主题代理 / Shopify Expert
- 内部 / 外部 Shopify 开发者
Shopify 应用引起的性能问题,优先联系应用开发者,多数会响应处理。