Hydrogen 开发工作流
本技能是面向在 Shopify 无头店面生态中工作的工程师的开发实践与工作流指南。Hydrogen 框架仓库为 Shopify/hydrogen。领域背景参见 headless-storefronts-context 技能,仓库位置参见 shopify-repos 技能。
一、本地测试客户账户
要测试 Hydrogen 中任何需要客户登录的功能(订单历史、账户页面等):
- 使用客户账户推送标志启动开发服务器:
使用 npm
pnpm run dev -- --customer-account-push
直接使用 Hydrogen CLI(h2 是 Hydrogen CLI 二进制文件)
h2 dev --customer-account-push
注意使用 pnpm run dev 时的 -- 分隔符。
-
使用 bogus gateway 测试支付信息下一笔测试订单。
-
使用任意邮箱和密码创建客户账户。
-
下单后即可登录,在客户账户区域查看订单。
二、Hydrogen Recipes(食谱)
Recipes 是记录在开发文档中的 cookbook 条目,用于向 Hydrogen 店面添加功能。它们以 markdown 文件形式存在于开发文档中。“apply”命令及相关工具仅供内部使用,用于测试或更新 recipes——商家无法以编程方式将 recipes 应用到其店面。
Cookbook 架构:Ingredients 与生成的文档
每个 recipe 有两层需要保持同步:
-
Ingredient 文件(cookbook/recipes/{name}/ingredients/templates/skeleton/app/routes/*.tsx):这些是真实、独立的 .tsx 路由实现——不是补丁或 diff。商家按 recipe 操作时会应用它们。当骨架模板存在 bug(例如缺少 await)时,对应的 cookbook ingredient 文件可能独立存在相同 bug,需要单独修复。
-
生成的文档(cookbook/recipes/{name}/README.md 和 cookbook/llms/{name}.prompt.md):这些文件由 ingredient 源文件自动生成。它们内联了完整的路由源代码,因此如果修复了 ingredient .tsx 文件,必须同时重新生成文档:
pnpm run cookbook -- render --recipe {name} pnpm run cookbook -- validate --recipe {name}
README.md 和 llms/{name}.prompt.md 必须作为同一次修复的一部分提交。未重新生成意味着即使 ingredient 文件已正确,文档仍会教授错误的模式。
示例:markets recipe 的 ingredient 文件包括 ($locale).account.$.tsx、($locale).account.addresses.tsx 和 ($locale).account.profile.tsx。它们独立于骨架模板,不会自动继承骨架的修复。
三、修复损坏的 Recipes(补丁文件)
当骨架模板变更时,recipe 补丁文件可能损坏。两种方法:
-
对于简单的一行改动:直接编辑补丁文件。
-
对于非简单改动:
- 在本地创建新分支
- 硬重置到 recipes 仍能干净应用的最新提交
- 对每个 recipe: a. 应用 recipe b. 使用 Claude/LLM 将该提交到最新 main 的所有变更应用到已应用 recipe 的骨架模板上 c. 生成新的补丁文件 d. 取消应用 recipe,对下一个重复
四、升级 Hydrogen
升级 Hydrogen 店面的最佳方式是 upgrade CLI 命令:
pnpm exec shopify hydrogen upgrade
该命令会:
- 自动升级并安装所有必要依赖
- 对于手动更改,生成一个包含所有必需更改的 markdown 文件
该 markdown 文件非常适合喂给 Claude 或其他 LLM 来应用更改。
最佳实践:跨多个主版本升级时,一次升级一个主版本,并在每次升级之间验证一切正常。这比一次性尝试多个主版本升级更顺畅。
五、骨架模板(Skeleton Template)
骨架模板有两个用途:
- 内部测试:它是我们用来测试和验证 Hydrogen 变更的单一 Hydrogen 店面。位于 Hydrogen 仓库的 templates/skeleton。
- 新项目脚手架:当用户搭建新 Hydrogen 项目(通过 shopify hydrogen init 或 npm create @shopify/hydrogen)时,会获得骨架模板的副本。
关键事实:
- 位于 Hydrogen monorepo 的 templates/skeleton
- 使用 monorepo 中构建版本的 Hydrogen 包(而非来自 npm)
- 随 Hydrogen CLI 打包并发布
- 在 Hydrogen CLI 发布前应始终保持最新
- 即使 Hydrogen CLI 版本未升级,也可以在发布前更新
- 对骨架模板的任何更改都需要 changeset——详见 CLAUDE.md 中的 Changeset Rules
六、PR 约定
将 Issue 链接到 PR:始终在 PR 中包含 GitHub issue 的链接。使用 Closes <issue> 或 Fixes <issue>,以便 PR 合并时 issue 自动关闭。
七、Hydrogen 分析架构
packages/hydrogen/src/analytics-manager/ 中的分析系统有几个非显而易见的设计约束,调试前值得了解。
模块级单例
subscribers、registers 和 waitForReadyQueue 是模块级(而非实例级)的。这意味着:
- 它们跨 React 渲染和 React 树卸载/重新挂载持续存在
- 在测试中,它们跨测试用例累积状态——一个调用 register() 而未调用 ready() 的测试会阻塞所有后续测试
- 每个 JS 上下文恰好有一个分析总线;多个 <Analytics.Provider> 实例共享状态
同意(Consent)在订阅者而非发布者处强制执行
publish() 始终将事件入队,无论同意状态如何。同意在三个下游层强制执行:
- ShopifyAnalytics 仅在 privacyReady 为 true(隐私 SDK 已加载)后调用 shopifyAnalyticsReady()
- prepareBasePageViewPayload 在处理器调用时评估 customerPrivacy.analyticsProcessingAllowed()
- sendShopifyAnalytics(在 hydrogen-react 中)如果 payload.hasUserConsent 为 false 则丢弃事件
不要向 publish() 添加同意门控——这会导致事件在同意解决之前被丢弃(而非排队),造成竞态条件,初始化期间触发的事件将永久丢失。
八、Hydrogen CLI
Hydrogen CLI 源代码位于 Hydrogen 仓库的 packages/cli-hydrogen。它作为独立包发布到 npm。
在 Shopify CLI 中打包:商家通常不直接使用 Hydrogen CLI。相反,它被打包在 Shopify CLI 中(位于 Shopify/cli 仓库)。将新版本的 Hydrogen CLI 发布到 npm 后,还必须提升其在 Shopify CLI 中的版本。
时机:Shopify CLI 按固定节奏发布新的次版本。Hydrogen CLI 的版本提升不应等待下一个 Shopify CLI 次版本——将提升作为当前 Shopify CLI 次版本的补丁发布,以便更快推出。
如何更新:Hydrogen 仓库中存在 shopify-cli-update 命令,位于 .claude/commands/shopify-cli-update.md。这是一个 Claude Code 命令——在 Hydrogen 仓库中工作时用 /shopify-cli-update 调用。它记录了完整、细致、多步骤的流程。执行更新时始终参考此命令——不要凭记忆即兴操作。
九、项目脚手架
搭建新 Hydrogen 项目有两种方式:
- shopify hydrogen init——通过 Shopify CLI(其中打包了 Hydrogen CLI)
- npm create @shopify/hydrogen——通过 create-hydrogen 包
两者最终都使用骨架模板。create-hydrogen 包在底层使用 Hydrogen CLI 的 init 函数。
十、版本标签
- @latest:最新的官方发布
- @next:包含所有已合并到 main 的 Hydrogen 变更(带 changesets),即使尚未正式发布。每次代码推送到 main 时都会自动发布新的 next 版本。
next 标签对商家 bug 修复验证很有用:将修复合并到 main 后,商家可以用 npm create @shopify/hydrogen@next 测试,确认修复解决了他们的问题——无需等待官方发布。
十一、搭建特定版本
create-hydrogen 使用 SemVer,而 Hydrogen 使用 CalVer——两者关系详见 hydrogen-versioning 技能。搭建特定历史 Hydrogen 版本需要查找步骤,以确定哪个 create-hydrogen SemVer 版本包含所需的 Hydrogen CalVer 骨架。
十二、相关技能
- hydrogen-release-process——发布流程、回补修复、changelog.json、发布失败恢复
- hydrogen-versioning——CalVer 格式、版本支持策略、发布节奏
- CLAUDE.md——Changeset 规则(适用于每个 PR)、骨架/CLI 打包链