Shopify 性能优化

Shopify defer 和 async 混用导致脚本报错

现象#

控制台偶尔报 Cannot read properties of undefined (reading 'init'),购物车抽屉十次里有一两次点不开。

原因#

  • async 下载完立即执行,不保证排在依赖方之前,defer 才按文档顺序执行
  • type="module" 天然延迟且作用域独立,靠全局变量与普通脚本通信会取不到值
  • 主题的 base.js 用 defer,应用注入的脚本用 async,应用先跑时依赖尚未定义
  • head 里的内联脚本没有延迟能力,执行时间早于所有带 defer 的文件

处理步骤#

  1. 在 Network 里对比脚本的 Start Time 与 Initiator,先确定实际执行顺序
  2. 有依赖关系的脚本统一写成 <script src="..." defer></script>,保持引入顺序
  3. 初始化逻辑从内联立即执行改为 document.addEventListener('DOMContentLoaded', ...)
  4. module 之间用 import 传依赖,不要再往 window 上挂对象
  5. 在 Performance 面板确认首屏脚本执行已合并成一段连续任务

验收标准#

连续刷新 10 次控制台无 undefined 报错,Performance 中脚本执行顺序与文档顺序一致。

本文由 风格技术 技术团队整理,适用于 Shopify 标准版与 Plus 店铺。Shopify 平台能力迭代较快,具体操作路径与字段以官方文档和店铺后台实际版本为准。