Horizon 源码阅读:固定版本、条件分支与证据边界
本文基于 Horizon 4.2.0,源码固定到 5acd1b6(核验于 2026-10-07)。结论限于此 commit,不表示其他版本行为相同;本篇为源码分析,未完成店铺运行验证。
源码解读应把可复查的实现关系留给读者,而不是复制一份会独立过期的参数表。参考既有笔记或第三方解读时,先固定研究对象,再判断哪些结论仍有证据。
同一版本名称还不够
先核对 config/settings_schema.json 中的主题信息,再记录官方 commit。版本名称便于阅读,commit 才能把引用固定到同一份文件。未固定基线的资料可以提供选题和文件线索,但不能直接用作当前实现的依据。
JSON 模板、Liquid、JavaScript、全局配置和样式共同构成功能。templates/product.json 保存实际页面组合;跳过它,只分析 Liquid 文件,无法完整解释实例顺序和默认组成。
三个容易误判的地方
复合条件要遵循 Liquid 的求值顺序。 Liquid 的多个 and / or 从右向左处理。逻辑式 A and B or C 应按 A and (B or C) 理解,这里的括号只是解释,Liquid 条件中不能用括号分组。若按相反的分组理解,就可能误得出“区域内每张图片都 eager”之类的结论。具体图片策略仍需读 snippets/card-gallery.liquid 并观察请求。官方运算规则
私有块不等于禁止 presets。 下划线前缀使块不被 @theme 通配入口自动纳入;父级可以显式接受指定块。blocks/_product-card-group.liquid 中存在 presets 不能单独作为缺陷证据,更不能因此直接建议删除。官方 Theme Blocks 说明
主题选择不等于平台限制。 某个 Horizon 基线主要使用 JSON 模板,不代表 Shopify 只允许礼品卡使用 Liquid。模板支持范围需要查对应类型,不能由目录里现有文件反推平台禁令。官方模板说明
缺少设置与布尔值也要分清
Liquid 中 nil 与 false 是不同类型,虽然两者在条件判断中都表现为 falsy。不能从“某设置未定义”直接推导与 false 的相等比较恒真。阅读分支时应核对运算符、默认值处理和真实输入。官方类型说明
同样,源码注释可能落后于实现。snippets/spacing-style.liquid 的说明提到 margin,而实际键列表处理 padding;此处应以代码为依据,不复制说明中的扩大承诺。
三种证据分开记录
| 证据 | 能说明什么 | 不能代替什么 |
|---|---|---|
| 固定源码核对 | 文件、条件与调用关系 | 编辑器和真实请求结果 |
| 独立浏览器实验 | 指定夹具中的交互 | Shopify 服务端及真实商品上下文 |
| 店铺集成测试 | 指定商品、配置和环境下的行为 | 其他版本与所有配置的普遍保证 |
本系列完成固定源码核对,并以 partial 标注验证范围。未经复现的缺陷、安全、性能和无障碍判断不写成结论。可从架构总览选择一个功能,再沿入口补充可复现证据。