Nonmotor 开发手册
NONMOTOR / ENGINEERING GUIDE
面向后端工程师 · 从需求到交付更新于 2026.10.14

Nonmotor 前端开发指南:从需求到交付#

这份指南面向准备接手 Nonmotor 前端需求的后端工程师。代码可以交给 AI 辅助编写;接需求的人仍要弄清产品在什么市场和环境运行、页面由哪些配置控制、改动影响谁,以及怎样证明真实业务链路可用。本文沿一项需求的完整流程,重点讲产品工厂、PFC、Transify 的使用与验证,再说明必要的代码定位、联调和交付。

完成练习后,应能主导一项 Nonmotor 需求:确认产品和业务规则,查清实际生效的 Journey、PFC 与文案配置,让 AI 辅助实现,并用真实流程完成验收和交付。AI 无法仅凭代码判断业务边界、后台配置是否命中以及 App 内全流程是否可用;这些结论需要负责需求的人亲自核实并承担结果。

阅读路线与分享安排#

主线:认识项目 → 跑通环境 → 明确需求 → 使用产品工厂 / PFC / Transify → AI 辅助实现 → 联调 → 交付。

阅读目的 章节 重点
第一次接手项目 第 1—4 章 认识业务、打开页面、选调试方式,确认需求范围与当前配置
掌握三个核心平台 第 5—7 章 产品工厂配置页面,PFC 管理配置与灰度,Transify 完成多语言更新
完成开发与交付 第 8—10 章 给 AI 提供输入、选择 Skill、交接埋点、联调与发布验收
按问题查阅 第 11 章及附录 市场/产品差异、灰度放量、TMS/IDAP、代理规则与 Motor 详细流程

现场分享重点放在第 4—10 章。第 1 章简要开场,第 2、3 章作为提前准备和现场调试手册;安装步骤无需逐项演示。产品工厂、PFC、Transify 保持独立章节,先讲平台怎么用,再讲 AI 如何参与实现。现场顺序见分享提纲。

本文依据 2026-10-09 至 2026-10-14 核对的工作区源码、团队提供的截图和已确认操作约定整理。业务项目的新环境安装、真实产品端到端流程及部署尚未在本次文档整理中实测;登录、权限和负责人等待补信息统一列在附录 A。源码依据见附录 B,市场代理规则见附录 C,Motor 各市场流程详解见附录 D。

1. 项目介绍:先认识业务与复用边界#

本章先建立项目认知:用户经过哪些页面、Motor 与 Nonmotor 为什么分开组织、哪些能力可以复用。入口注册和模板内部实现分别在第 4、5 章展开。

1.1 Motor 与 Nonmotor 的区别#

Motor 主要承载车险,Nonmotor 承载非车险。两者都会经过产品选择、信息填写、报价/确认和支付,但 Checkout 之前的页面组织方式不同:Motor 以市场专属页面为主,Nonmotor 的产品工厂主流程以共享模板和 Journey 配置为主。

对后端同学来说,可以先这样理解:Motor 由各市场的页面代码编排本地业务;Nonmotor 把高度一致的页面骨架、表单和交互做成可复用能力,再由产品工厂描述某个产品应该使用哪些能力。

对比项 Motor:车险 Nonmotor:非车险产品工厂流程
业务关注点 车辆、车主/驾驶人、历史保单、报价、附加保障,以及市场专属材料和步骤 产品保障、Plan、保障期间、投保人/被保人信息,以及产品所需的扩展字段
Checkout 前的页面组织 按市场维护页面,例如 src/pages/my/、sg/、id/motor/ 多个市场复用 src/pages/factory/、factoryV2/ 下的模板与组件
页面结构与流程 React 页面、市场组件及业务条件共同编排 模板执行 Journey 中的页面、区块、字段、步骤和路由配置
差异主要放在哪里 市场页面、model/service、组件、状态与导航处理 Journey、产品数据、翻译,以及必要的产品/市场扩展代码
复用特点 完整业务页面和专属组件跨市场复用较少;UI、表单、请求等基础能力仍能共用 产品间、市场间的页面和功能组件高度一致,适合共享模板与配置复用
拿到需求先查什么 哪个市场、哪条 Motor 流程、哪个页面或业务组件 哪个产品、哪份 Journey、哪个模板/区块/字段,已有能力能否表达

Motor 与 Nonmotor 的页面组织对比:市场专属页面与共享模板

图 1:两种组织方式的核心差异在 Checkout 之前。图中是源码结构示意,不是真实产品 UI 截图;可点击放大。

业务分类、应用配置、源码目录和维护仓库需要分别确认,具体定位方法见第 4 章。

1.2 为什么采用不同的页面组织方式#

按照团队当前的业务划分,Motor 页面相对复杂,很多业务组件与市场流程强相关,跨市场难以直接复用;Nonmotor 不同市场、产品的页面结构和功能组件高度一致,复用收益更高。源码中的“市场目录”与“共享 Factory 模板”体现了这一设计取向。

设计判断 代码中的具体表现 对开发的意义
Motor 的流程差异较大 ID 有车辆配件/附加保障编辑分支;MY 有报价卡片和车辆信息编辑;SG 按保障决定是否经过 Add-ons 先理解目标市场的页面状态、缓存和导航条件,再修改业务逻辑
Nonmotor 的主结构一致 多市场的 PDP6、Purchase5 等入口指向同一份 Factory 源码 同一种字段、区块、校验能力可以服务多个产品,避免逐产品复制页面
Nonmotor 的差异通常可以参数化 Journey 的 blocks、entries、props、dependencies、constraints、stepItems 等参与页面生成 已有能力范围内,优先调整配置、翻译和数据;新行为再扩展代码能力
共用代码会扩大影响面 修改共享 FillInfo 或解析器,会影响使用它的其他产品/市场 回归范围应按“谁消费这项能力”确定,不能只验证当前产品

这不是绝对隔离。Motor 也会复用 MoneeDesign、InsEntry、Bridge、请求、缓存和部分业务组件;Nonmotor 也保留市场适配,例如 purchase5/config/{region}、PDP 的市场插入规则,以及 PHApplicant 等专属区块。应复用稳定共性,同时保留明确的市场/产品扩展点。

1.3 用户实际经过哪些页面#

两类业务的共同目标都是让用户了解保障、提供投保信息、确认方案并支付。差别在于 Checkout 之前如何拆页、组织交互和复用实现。

Motor 与 Nonmotor 典型页面流程:ID、MY、SG 与产品工厂主流程

图示根据源码导航与配置整理,表示典型路径;产品、续保和可选分支可能改变实际顺序。

业务 典型链路与主要差异
ID Motor 车辆信息/PDP → 报价 → 个人信息确认 → Checkout;报价页可打开配件与附加保障编辑
MY Motor PDP → 报价列表 → 报价详情 → Checkout;摩托车和历史版本有不同分支
SG Motor PDP → 报价列表 → 报价详情 → 可选 Add-ons → 投保表单 → Checkout
Nonmotor 产品工厂 PDP → Purchase → Confirmation → Checkout;由具体产品配置决定步骤,部分页面可以合并或跳过

Motor 按市场查页面,完整目录截图、页面文件名和源码依据见附录 D。Nonmotor 在多个市场复用 Factory 模板,当前 MY、ID、SG、TH 注册了同一组 PDP6、Purchase5、Confirmation 入口,但其他市场的页面集合并不完全相同。

Checkout 的边界#

Nonmotor 的“模板引擎 + 产品工厂”主要描述 Checkout 之前的产品工厂页面。收银台采用独立的 checkoutV2 实现,处理金额、优惠、支付选项及创单衔接,并保留市场适配。Motor 与 Nonmotor 可以共用收银台源码,传入的数据、应用与市场构建仍然不同。

前端负责交互、展示和及时校验;金额、资格、报价和创单结果应以对应后端契约为准。一个浏览器页面能打开,不等于 App 内完整下单流程已经通过。

1.4 页面最终由什么决定#

实际页面来自几个部分的组合:前端代码、产品 Journey、接口数据、翻译、PFC 配置以及运行环境。

因此,“页面不对”不一定意味着要修改 React 代码。某个字段没有出现,可能是 Journey 没有配置、显隐条件未命中、组件名未匹配,也可能是当前产品或市场选错。

还要区分两个常见概念:

1.5 后端工程师需要建立的前端认知#

当前工程主要使用 React 18、TypeScript、Webpack 5、SCSS,采用多入口多页面架构。每个页面有自己的入口和 HTML,构建时按应用与市场选择页面集合。

页面可以运行在浏览器或 App WebView 中。项目通过 Bridge 封装页面跳转、返回和其他宿主能力。浏览器能打开页面,并不代表 App 中的返回、登录和支付链路已经验证完成。

后端熟悉的概念 在本项目前端中如何理解
服务启动入口 index.tsx 挂载页面,并进行页面级初始化
业务用例编排 App、业务组件和 Hook 组织数据、交互与页面状态
下游接口客户端 service/model 调用统一 request,封装接口协议
请求上下文 props、state、Context 和持久化缓存有不同生命周期
配置驱动 Journey 决定部分页面结构;PFC 提供命中条件下的配置
日志与调用链 Network、Console、IDAP 与后端日志结合排查

前端组件会随状态变化重复渲染,不能把组件函数当作“只执行一次的服务初始化”。跨页面跳转后,组件状态也不能自然保留,需要明确缓存与参数传递方式。

2. 本地环境:从安装到打开业务页面#

本章按实际准备顺序操作:拿到有效入口与权限 → 安装依赖 → 选择环境并启动 → 配置浏览器代理与 HTTPS → 验证业务域名、接口和登录态。默认先跑通浏览器,模拟器与真机准备放在第 3 章。

2.1 准备入口、账号与权限#

先拿到仓库访问权限,以及一个可以复现的非生产产品入口。开发样例至少要包含:市场、环境、产品、页面 URL、测试账号获取方式,必要时还包括后端 PFB。

需要访问的能力包括公司 npm 源、项目启动所需的 KMS、产品工厂配置、翻译平台,以及联调使用的后端环境。具体权限申请入口由团队维护人提供。

本文示例从已拉取的 nonmotor_h5 仓库根目录执行。开发者可使用自己的 IDE,但终端工作目录必须正确。

2.2 安装 Node 与项目依赖#

仓库 .nvmrc 当前声明 v20。已安装 nvm 的同学可以执行:

bash
nvm install
nvm use
node -v
npm -v

使用其他 Node 版本管理器时,同样以项目版本文件为依据。package.json 中较宽泛的最低版本声明,不代表所有更低版本都已验证可用。

部署安装脚本使用以下依赖安装方式,本地可以据此准备依赖:

bash
npm install --registry https://npm.shopee.io --legacy-peer-deps

安装失败时,先根据错误区分 npm 源访问、权限、Node 版本和原生依赖编译问题。不要通过随意升级依赖或删除锁文件来跳过原因分析。安装后检查 package-lock.json 差异,确认是否属于本次需求。

2.3 选择环境并启动本地服务#

配置 作用 需要注意
APP_NAME 选择应用及入口配置 本项目目标服务选择 nonmotor
REGION 选择市场入口和区域实现 使用目标市场,例如 my、id;并非每个应用都支持菜单中的全部市场
ENV 选择开发/构建环境 对应 mock、dev、test、uat、live 等;日常联调选已约定的非生产环境
BUILD_ENV 选择构建环境与相关运行配置 按目标业务选择 spin 或 spic
BROKER_NAME 部分 spic 场景的主体配置 仅按实际业务选择
TRANSIFY_REPORT 本地翻译使用上报开关 启动菜单可选择,默认 off
后端 PFB 指定联调的后端分支环境 不等于前端 ENV;必须结合实际请求验证

npm run dev 的交互脚本会把所选配置保存到仓库根目录 .env。新任务开始时应核对配置,不要无意复用上一次开发的市场和应用。

npm run start 和 npm run build 都会先执行 scripts/kms.js。KMS 访问失败属于启动前置条件问题,应按团队约定准备对应凭证和网络;凭证不要写进源码、MR 或共享排障日志。

使用交互入口启动#

bash
npm run dev

依次选择“开发”、目标环境、Transify 上报设置、目标市场、服务 nonmotor、构建环境;需要时再选择主体。首次启动应显式选择,确认无误后才使用“使用上一个命令”。

脚本随后调用 npm run start。默认端口为 3000,端口变更时以终端输出为准。

2.4 建立浏览器到本地服务的代理链路#

本地联调使用 ZeroOmega 浏览器代理插件 + Whistle 代理服务 + 本地开发服务。三者职责如下:

工具 职责 本文使用的地址
Proxy SwitchyOmega 3(ZeroOmega) 控制 Chrome 请求是否经过指定代理 指向 127.0.0.1:8899
Whistle 抓包、匹配规则、转发或替换请求响应 默认代理端口 8899,管理后台为 http://127.0.0.1:8899
nonmotor 开发服务 返回本地 HTML、JS/CSS,并通过开发代理处理 /api 默认 localhost:3000

Whistle 是基于 Node.js 的跨平台网络代理与调试工具,支持 macOS、Windows、Linux。日常使用它查看请求、代理页面和接口、mock 响应、模拟弱网以及调试移动端 H5。ZeroOmega 只负责代理选择,安装插件后还需要运行 Whistle。Whistle 项目说明

以 MY Test 的整站代理规则为例:

流程示意
  1. Chrome 访问 MY Test 域名
    1. ZeroOmega
      1. Whistle 8899
        1. 本地开发服务 3000
          1. 返回本地页面与资源
          2. API 经开发代理发往后端

浏览器地址栏仍是业务域名,本地代码通过代理返回。页面 Cookie 和存储仍按浏览器中的域名使用;代理本身不会创建登录态。

安装 ZeroOmega 插件#

在 Chrome 中打开 Proxy SwitchyOmega 3(ZeroOmega)安装页,安装后进入插件设置,新建一个代理情景模式,例如命名为 Whistle。

设置项 值
代理协议 HTTP
代理服务器 127.0.0.1
端口 8899

将该 HTTP 代理设为默认代理,使目标 HTTP/HTTPS 请求都经过它;若界面分别配置 HTTP、HTTPS 请求代理,两者均指向上述代理服务。这里选择的 HTTP 是浏览器连接代理的方式,不代表目标业务页面必须使用 HTTP。

保存/应用设置。等 Whistle 启动后,再通过插件图标切换到 Whistle 模式。也可以在自动切换模式中仅让目标业务域名走此代理。

安装并启动 Whistle#

完成 Node 环境准备后,在终端执行:

bash
# 安装命令行版
npm i -g whistle

# 启动并查看状态
w2 start
w2 status

打开 Whistle 本地管理后台。主要使用 Network 查看流量,使用 Rules 编辑代理规则。命令行版的常用管理命令如下:官方命令行文档

bash
# 重启
w2 restart

# 停止
w2 stop

Whistle 也提供桌面客户端,可从官方安装说明进入;本指南统一以命令行版为例。同一套环境选择一种运行方式,避免两个实例竞争端口或误用另一套规则。

安装证书并开启 HTTPS 抓包#

业务页面使用 HTTPS 时,需要让 Whistle 解密请求,才能按页面路径代理并查看明文请求响应。完成以下设置:

  1. 在 Whistle 管理界面打开 HTTPS,通过 Download RootCA 下载本机 Whistle 根证书。
  2. 在操作系统中安装并信任该证书。macOS 可在“钥匙串访问”中导入并设置证书信任;也可使用下面的官方命令完成安装,按系统提示确认。
  3. 在 Whistle HTTPS 设置中开启 Enable HTTPS (Capture Tunnel Traffic)。
  4. 重新加载目标 HTTPS 页面,检查是否能看到具体 URL、请求头和响应内容。
bash
w2 ca

证书安装与 HTTPS 解密开关需要同时完成。若只看到 Tunnel to 而无法查看目标请求内容,先检查解密开关、证书信任以及请求是否经过当前 Whistle 实例。HTTPS 设置说明、证书安装命令

配置目标市场的代理规则#

在 Whistle 的 Rules 中按市场与环境建立规则组,例如 nonmotor-my-test,粘贴规则、保存并启用。本地 3000 端口一次运行的是当前选择的应用/市场/环境;日常只启用本次需要的规则组。

以 MY Test 为例,团队材料使用整站转发,本指南整理为显式指定 HTTP 目标的写法:

text
# MY Test:保留请求路径,整站转发到本地开发服务
protection.test.shopee.com.my http://localhost:3000

它会将 /nonmotor/purchase5.html?... 转发到本地相同路径。已有整站规则时,指向相同服务、保留相同路径的 /ins、/nonmotor、/common、/ec、/static 规则可合并,避免重复维护。使用 http:// 明确目标是本地 HTTP 开发服务,URL 路径按规则自动拼接。Whistle HTTP 转发规则

整站转发也包含 /api,接口随后由 scripts/start.js 的开发代理决定最终后端目标。因此需要核对浏览器访问环境、Whistle 规则和本地启动环境。它不是只替换 HTML 的规则。

如果只想代理某个页面目录,可以使用下列规则替代整站规则;资源和其他请求的去向需要另外核对,不要与整站规则一起启用后误以为范围已缩小:

text
# 可选:仅把 nonmotor 路径转发到本地
protection.test.shopee.com.my/nonmotor http://localhost:3000/nonmotor

各市场的整站规则见附录 C。代理规则不会自动启动项目,也不会让未构建的应用页面出现:APP_NAME=nonmotor 时,其他应用入口是否可用仍取决于本地构建内容。

2.5 使用有效业务 URL 与登录态#

开发环境生成的 HTML 路径带应用前缀。例如,MY 的 purchase5 在默认端口下对应:

text
http://localhost:3000/nonmotor/purchase5.html?product_id=<目标产品ID>

这是路径示意,<目标产品ID> 必须替换成实际值,其他必要参数应从有效业务入口保留。该页依赖产品配置、登录态和前序流程数据时,应从产品详情进入;直接打开中间页不能替代完整链路验证。

完成第 2 章代理配置后,日常联调在浏览器打开对应环境的原始业务地址,例如 MY Test:

text
https://protection.test.shopee.com.my/nonmotor/purchase5.html?product_id=<目标产品ID>

浏览器通过 Whistle 获取本地页面,地址栏保持 MY Test 域名。直接访问 localhost 可用于检查本地页面服务,但两者的 Cookie/存储域不同,不能把 localhost 能打开视为业务域名登录已完成。

仓库旧 README 中的 /ins/ 和根路径示例不能直接套用到 nonmotor。开发路径依据 config/webpack.config.js,页面名单依据 config/nonmotor/{region}.json。

2.6 核对 API 环境与 PFB#

scripts/start.js 已包含开发代理:非 mock 环境根据 BUILD_ENV、REGION、ENV 等选择后端域名,并代理 /api 请求;mock 环境将 /api 指向本地 3001 端口。

启动后先查看终端输出的请求转发域名,再在浏览器 Network 面板核对具体请求。页面加载成功、代理目标正确、登录成功是三个不同检查点。

使用第 2 章的整站规则时,请求链路是“浏览器 → Whistle → 本地开发服务 → 开发 API 代理”。登录 Cookie 的域、环境和账号必须匹配当前打开的页面;后端使用 PFB 时,验证实际链路是否命中目标 PFB。

用户提供的浏览器域名与当前 scripts/start.js 的部分 API 目标存在差异:

市场/环境 材料中的浏览器域名 当前 spin 开发代理目标
TH Test protection.test.shopee.co.th protection.test.moneeinsurebroker.co.th
TH UAT protection.uat.seainsurebroker.co.th protection.uat.moneeinsurebroker.co.th
SG Test / UAT test.moneeinsureagency.sg / uat.moneeinsureagency.sg test.seainagency.sg / uat.seainagency.sg
PH Test / UAT protection.test.moneeinsurebroker.com.ph / protection.uat.moneeinsurebroker.com.ph protection.test.seainsureagency.com.ph / protection.uat.seainsureagency.com.ph

此表记录材料和源码的差异,不据此认定域名不可用或需要替换。目标环境是否通过别名或迁移实现兼容,需要实际联调确认。浏览器域名正确仍不足以证明 API 目标正确,本次文档整理未修改代理源码。

2.7 首次启动的验收清单#

首次开发不以“终端没有报错”为结束,应完成以下检查:

  1. Webpack 编译完成,目标 /nonmotor/*.html 可以打开。
  2. 当前应用、市场、环境和产品与需求一致。
  3. 页面能获取正确 Journey 或业务数据,接口没有登录失败。
  4. 修改一处目标页面代码后,能够确认浏览器运行的是本地版本。
  5. 至少完成目标产品的一段真实交互,核对请求和页面结果。

代理链路还应检查:

若 Whistle 看不到请求,先查插件模式和代理端口;能看到请求但页面未替换,查规则命中、缓存和本地路径;接口报登录错误则继续核对账号、Cookie 域和 API 目标,代理工具不会代替登录步骤。

3. 调试方式:浏览器、模拟器与真机#

本章解决“在哪里验证、用什么工具看问题”。第 2 章先跑通请求链路,本章再区分浏览器局部调试、App 内 H5 调试和完整业务自测。

3.1 按任务选择调试环境#

日常开发可以先在浏览器快速调试,再用模拟器检查 App 内行为,提测前优先在真机完成主流程自测。三种方式共享同一套业务代码,但运行环境和可验证的能力不同。

方式 优势 主要限制 适合做什么
iOS 模拟器 在电脑上运行 Shopee App,可配合 Safari 调试 App 内 H5 占用电脑内存,依赖 Simulator App 构建;不能完全替代真实设备 H5 与 App 的交互、Bridge 跳转与返回、iOS WebView 问题定位
浏览器 轻量,不用启动模拟器;有有效 URL 和所需登录态即可访问,调试工具使用方便 缺少 App 宿主能力,无法走完依赖原生页面的完整下单流程 页面布局、DOM、字段校验、接口数据、异常状态和快速修改验证
真机 最接近用户实际的触摸、输入、滚动和 App 使用体验 需要目标设备、App、测试账号及网络环境 业务主流程自测首选,尤其是支付、OTP、地址选择和跨页面返回

3.2 浏览器:日常开发与局部验证#

浏览器调试最轻量。完成代理和登录准备后,直接打开目标业务 URL,使用 Chrome DevTools 的 Elements、Console、Network、Sources、Application 等面板即可调试,不必同时运行模拟器。

浏览器通过业务 URL 打开 H5,使用 Chrome DevTools 查看日志、请求与页面存储

图示:完成登录鉴权后,通过有效的业务 URL 打开 H5 页面;Console 查看日志,Network 查看请求,Elements 检查 DOM 与样式,Application 查看当前域名的 Local Storage、Session Storage 和 Cookie。截图中的 URL 和参数仅用于说明入口位置,实际调试请使用本次产品的有效入口。点击图片可放大查看。

适合先完成布局调整、文案检查、字段校验、接口响应处理等工作。浏览器的设备模拟模式可以辅助检查移动端尺寸,但页面仍运行在浏览器环境中,不会因此获得 Shopee App 的 Bridge、RN 或原生能力。

当前项目涉及 App 能力的完整下单流程,不能只在普通浏览器中验收。 按团队提供的场景,支付页面、OTP 验证页面、SP 统一的 address select 页面等需要跳转到 App 内的 RN/原生页面,浏览器无法复现这些跳转及返回链路。具体页面承载方式以目标市场和 App 版本为准。

遇到这些边界时,转到模拟器或真机继续验证。即使使用 mock 或模拟 Bridge 返回值,也只说明 H5 在指定返回数据下的处理正常,不能证明真实 App 跳转、回调和下单流程通过。

3.3 模拟器:安装 App 并配置代理#

本节适用于 macOS + Xcode 的 iOS 模拟器,用于验证 Shopee App 内的 H5 展示、返回与 Bridge 交互。安装入口和内部 App 下载方式来自团队提供的截图;截图中的设备、iOS 和 App 版本只是示例,选择时以当前测试要求和兼容性为准。

第一步:安装 Xcode 并启动模拟器#

  1. 从团队材料中的 Xcode 下载目录获取适配当前 Mac 的 Xcode,完成安装及首次启动要求的组件安装。
  2. 在 Xcode 中确认已安装目标 iOS Simulator runtime。如果没有可选的 iOS 设备,先在 Xcode 设置的运行时/组件管理界面下载所需版本;不同 Xcode 版本的菜单名称可能不同。Apple 运行时安装说明
  3. 搜索并打开 Simulator.app,或通过 Xcode 的 Open Developer Tool → Simulator 打开。
  4. 选择并启动一个目标 iPhone 模拟设备,等待进入 iOS 主屏幕。

Simulator 是 Xcode 自带的开发工具。仅有命令行工具不等于已经准备好完整的模拟器环境。Apple Simulator 说明

第二步:下载对应市场的 Simulator App 包#

进入团队 App 平台 app.sea.com,选择需要调试的 Shopee 市场 App。截图给出的示例为 Shopee ID App 页面,其他市场选择各自对应的 App。

在 iOS 版本列表中搜索 simula 或 simulator,找到团队要求的模拟器构建版本并下载。不要把截图中的历史版本号作为统一安装要求;也不要仅凭市场一致就选择任意 Native Feature Build,应使用本次测试约定的构建。

安装包需要明确支持 iOS Simulator,并与当前 Mac 架构及模拟器运行时兼容。普通真机安装包不能通过改扩展名变成 Simulator 包。

第三步:解压并安装 App#

  1. 若下载的是可直接使用的 .app 应用包,直接进入安装步骤。
  2. 若是压缩包,先解压。团队材料中的“改后缀为 .zip”适用于内容本身为 ZIP 归档、但下载扩展名不便解压的包;已经是 .zip 的文件直接解压即可。
  3. 在解压目录中找到 .app 应用包,将它拖到已经启动的 Simulator 设备窗口中安装。
  4. 等待主屏幕出现 App 图标,打开并检查能否正常启动。

如果安装失败,先核对是否误下真机包、市场/构建是否正确、Mac 架构及 runtime 是否兼容。App 安装完成后,再按团队测试账号流程登录;账号获取和登录操作另行补充。

第四步:为模拟器开启系统代理#

第 2.4 节的 ZeroOmega 控制 Chrome 请求,不能代替模拟器 App 的代理设置。按团队材料,模拟器联调通过 Whistle 设置 Mac 系统代理:

bash
# 启动 Whistle
w2 start

# 设置 Mac 系统代理,指向运行中的 Whistle
w2 proxy

默认 Whistle 使用 127.0.0.1:8899。开启系统代理会影响使用该系统代理的其他应用,操作前保留原代理配置,结束后恢复。Whistle 系统代理命令

同时完成以下配置:

浏览器 ZeroOmega、Mac 系统代理和实体手机 Wi-Fi 代理是不同的流量入口,按调试设备选择;三者可以指向同一个 Whistle 服务。

第五步:验证并结束调试#

在 Whistle Network 中观察请求,并核对:

检查项 通过标准
模拟设备 能进入 iOS 主屏幕,目标 App 能正常启动
代理 模拟器访问目标页面时,Whistle 能捕获对应请求
HTTPS 能查看具体请求与响应内容,无证书信任错误
页面版本 目标业务域名返回本地修改后的页面
业务链路 登录、接口环境、页面返回与相关 Bridge 行为符合本次需求

若 Safari 请求可抓取、但目标 App 请求不可抓取,应继续检查 App 的网络及证书策略,不把浏览器验证结果当作 App 已通过。模拟器用于日常开发验证,依赖真实设备能力的场景仍需按验收要求在真机验证。

调试结束,或其他软件因系统代理出现网络问题时,关闭本次启用的系统代理:

bash
w2 proxy 0

# 不再需要 Whistle 时再停止服务
w2 stop

截图使用 w2 proxy off,本文统一采用官方当前文档列出的 w2 proxy 0。若原来已有公司代理或其他网络工具,应恢复原设置;Chrome 的 ZeroOmega 若仍选着 Whistle 模式,也需要切回正常模式。Whistle 命令说明

团队安装材料截图#

团队提供的 Xcode、Shopee Simulator App 安装与模拟器代理步骤

截图中的内部下载地址作为团队提供的安装入口保留,本次未登录这些平台确认可下载版本,也未实际安装 Xcode、App、证书或修改系统代理。

3.4 Safari:检查 App 内的 H5#

模拟器负责运行 App,Mac 上的 Safari Web Inspector 负责查看和调试其中的 H5。可以把它理解为“给模拟器里的网页打开 F12”。

  1. 打开 Mac 上的 Safari → Settings(设置)→ Advanced(高级),勾选 Show features for web developers(显示网页开发者功能)。旧版 Safari 的文案可能为“在菜单栏中显示开发菜单”。
  2. 启动 iOS 模拟器,在 Shopee App 中进入要调试的 H5 页面,保持页面打开。
  3. 在 Mac Safari 的 Develop(开发) 菜单中,找到正在运行的模拟设备,再选择对应 App 下的目标 H5 标题或 URL,打开 Web Inspector。
  4. 在模拟器中操作页面,同时在 Mac 上查看日志、请求、DOM 与样式。页面跳到新 WebView 后,必要时重新选择当前页面。

Safari Develop 选择模拟器或真机中的 H5 页面并打开 Web Inspector

图示:Safari → Develop → 当前模拟器或真机 → Shopee → 目标 H5 页面。截图中选中的是已连接的真机,模拟器入口位于同一菜单;选择页面后会打开下方的 Web Inspector。点击图片可放大查看。

模拟器的远程检查能力默认开启,无需照搬真机的 Web Inspector 开关步骤。菜单中能否出现具体 App 页面,还取决于该 App 构建是否允许检查 WebView。WebKit 启用 Web Inspector 说明

想查什么 使用的面板/能力 Nonmotor 中的例子
打印的 Log、JS 错误 Console 查看初始化异常、字段联动日志和 Bridge 调用前后的输出
请求及响应 Network 核对接口参数、业务码、响应内容与耗时
DOM 节点和样式 Elements / Styles 找到实际渲染的节点,检查显隐、间距、遮挡和滚动布局
登录及页面存储 Storage / Cookies 等相关面板 核对当前域名的 Cookie、localStorage、sessionStorage;排查回退后旧数据或字段丢失
JS 执行过程 Sources / Debugger 设置断点,检查用户输入如何进入缓存和请求参数

这里的“缓存”需要分清:表单数据可能在页面存储中,JS/CSS 等资源还可能命中 HTTP 缓存。先核对当前页面和数据来源,再决定清理哪一项;清理存储可能同时清掉登录态或前序投保信息。

如果 Develop 中没有目标页面,先确认 App 已打开 H5、选对设备和页面,再核对测试包是否开放 WebView 检查。能检查模拟器 Safari 中的网页,不代表一定能检查 Shopee App 内的 WebView;需要时由客户端同学确认构建配置。WebKit App 内容检查说明

Safari Web Inspector 主要检查选中的 H5 页面;Whistle 用于观察经过代理的网络流量和执行转发规则。两者配合使用。Safari 的 DOM/样式面板不能直接检查 App 的 RN 或原生页面内部实现。

3.5 真机:验证完整用户交互#

可以直观理解为“把电脑里的模拟设备换成手里的真实手机”。真机能更接近用户实际操作,尤其适合检查触摸、键盘遮挡、滚动、返回手势和 App 页面切换。提测前优先使用真机完成本次需求的主流程自测。

使用目标市场、环境和测试版本的 Shopee App,从实际业务入口进入页面。调试本地代码时,按第 3.6 节配置手机代理及证书,并确认手机请求确实经过电脑上的 Whistle。

需要检查 iPhone 内的 H5 时,在 iPhone 设置中找到 Safari → Advanced(高级)→ Web Inspector(网页检查器),开启后连接 Mac 并完成设备信任,再从 Mac Safari 的 Develop 菜单选择该设备与可检查的 H5;较新 iOS 的 Safari 设置可能位于“设置 → App”内。此方式同样要求 App 开放对应 WebView 检查。iOS 远程检查说明

自测重点包括:

给 QA 的自测记录应写清设备/系统、App 版本、市场、环境、入口、执行场景和结果,区分浏览器验证、模拟器验证与真机验证。

3.6 Whistle 联调能力与代理收尾#

场景 用法
查看接口 在 Network 中查看 URL、请求/响应头、响应体和耗时
临时 mock 用限定范围的规则替换目标接口响应,模拟特定数据和错误
弱网验证 用延迟、限速规则检查 loading、超时与重试表现
页面远程调试 按需使用 Whistle 内置 Weinre、Console 能力

这些能力可以在不修改业务代码的情况下调整网络行为,规则使用后应关闭,避免影响下一轮真实接口验证。Whistle 快速上手

手机代理与证书#

手机调试时,手机与电脑需网络互通;将手机 Wi-Fi 的手动代理设为电脑的局域网 IP + 8899,不能填写手机自己的 127.0.0.1。手机也需要安装并信任该 Whistle 根证书,iOS 安装描述文件后还需开启完全信任。部分 App 的证书策略可能限制抓包,应以实际运行结果为准。移动端抓包说明

结束调试时,先将 ZeroOmega 切回原先的正常模式,再按需执行 w2 stop;手机或系统若设置了手动代理,也应恢复原配置。本文浏览器方案不要求同时开启系统代理,只有配置过的代理入口才需要恢复。

4. 接到需求:确认范围、配置与改动方案#

接到需求后,先确认目标产品与当前页面,再判断改动落在配置、接口还是共享组件。这个阶段要产出一份可执行的方案:改什么、在哪里改、影响谁、如何验证,以及交付时需要哪些配套配置。

确认范围与入口 → 核对当前数据 → 判断配置/代码边界 → 形成方案 → 在对应迭代开发。

4.1 确认业务范围与验收条件#

编码前,先确认以下信息:

维度 要明确的问题
范围 哪个市场、产品、渠道、App/浏览器场景?哪些不受影响?
页面 从哪里进入?经过哪些页面?返回、刷新、重新进入如何表现?
设计 默认、加载、空数据、错误、禁用状态如何展示?
数据 来源是接口、Journey、PFC、缓存还是用户输入?
契约 字段类型、枚举、空值、业务码、时间和金额口径是什么?
配置 当前产品的 Journey、翻译、图片、PFC key 和生效条件是什么?哪些需要修改?
验收 正常路径、异常路径、埋点和关联产品如何验证?

接口有某个字段,并不意味着前端该直接展示或提交它。要同时确定展示规则、交互规则和业务含义。

4.2 查清当前页面的配置与数据#

打开目标页面后,按来源收集与本次需求相关的事实。后台配置和页面实际收到的数据要对得上,才能确定正确的改动点。

来源 在哪里查看 要确认什么
Journey 产品工厂 + Network 的 query_product_factory_journey 产品 ID、版本,以及目标 page / block / entry 的当前配置
PFC PFC 后台 + HTML 注入或页面读取值 Key、目标值、命中条件、默认值与覆盖规则
Transify 页面 Key 调试工具 + 翻译平台与 PFC 当前 Key、语言和实际下发的 value
业务数据与缓存 Network、表单和售中缓存 来源、字段类型、写入时机及下游请求如何读取
运行环境 业务 URL、启动参数、账号与 App 市场、环境、应用、版本、产品及当前用户的灰度条件

记录有效入口和获取时间,分享时遮蔽 URL 中的会话等敏感参数。团队提供的 SG PA 快照用于理解数据结构;实操仍要取得目标环境当前的响应。浏览器不能验证的 App 跳转、支付和返回行为,应明确留到模拟器或真机检查。

4.3 判断修改配置还是代码#

需求情况 优先处理方式
已有字段的文案、显隐、支持范围内的校验调整 核对 Journey/i18n 和组件能力,优先配置
已有功能只需按市场或产品开启、关闭或调整参数 找到读取的 PFC key、默认值和命中范围,确认配置与代码消费方式
现有组件已有能力,但当前产品尚未启用 配置接入并验证数据契约
现有组件缺少交互或展示能力 评估扩展现有组件,列出其他调用方
独立业务区块 复用基础控件,新增或调整业务组件及配置接入
新页面或流程步骤 先评估现有模板,再处理入口、导航、缓存和埋点
接口新增或变更字段 对齐类型、请求映射、响应处理和全部消费方

如果需求只涉及 Journey,也要验证运行时页面和接口行为;如果修改公共组件,回归范围要覆盖复用方。

4.4 形成实现方案#

小需求可以用一份简明方案说明目标页面、字段映射、改动文件和验收场景。复杂需求需要 TD,把页面、组件、接口、配置、缓存和发布依赖拆清楚。

开发顺序建议为:确认业务规则和契约 → 获取当前产品 Journey 与 PFC 生效值 → 判断配置/代码边界 → 给 AI 提供明确输入并检查产物 → 联调、自测 → Review、提测。接口尚未就绪时,可以用明确契约的 mock 并行开发,真实接口就绪后补齐联调。

4.5 在对应迭代分支开展工作#

团队在 Casement 中建立迭代,迭代分支命名为 release-v1.x.xxx;本地开发分支命名为 dev-v1.x.xxx,版本号与目标迭代保持一致。例如,release-v1.3.318 对应 dev-v1.3.318。

分支 用途 代码流向
dev-v1.x.xxx 开发者本地开发、提交 commit 和自测 自测完成后发起 MR,合入对应 release 分支
release-v1.x.xxx 汇集当前迭代的改动,供版本发布与部署使用 合入并发布后,在 Casement 部署对应版本

完整流程如下:

流程示意
  1. Casement 建立 release 迭代
    1. dev 分支开发与提交 commit
      1. 本地自测完成
        1. 提交 MR:dev → release
          1. MR 合入 release 并发布
            1. Casement 部署对应版本
              1. 检查部署结果与页面行为

开始修改前检查工作区和当前分支,确认本次需求所属的迭代:

bash
git status --short
git branch --show-current

在对应的 dev-v1.x.xxx 分支完成开发和 commit,本地开发、自测完成后推送分支并提交 MR。MR 的 source 选择 dev-v1.x.xxx,target 选择同版本的 release-v1.x.xxx。

提交 MR 前同步目标分支并处理冲突,不把无关工作区变更混入本次需求。确认 MR 已成功合入 release 并完成发布后,再进入 Casement 部署;只有本地 commit 或 MR 尚未合入时,release 版本还不包含本次改动。

Reviewer、审批要求及多人同时使用开发分支时的远端协作约定,按团队安排执行,具体规则待补充。

4.6 源码入口:需要改代码时查这里#

页面注册图展示的是查找机制:filename 对应浏览器中的 HTML 文件名,chunks 关联 entry 的 key,entry 的值指向 src/pages/ 下的源码。下图截自 MY 配置,用来解释关系;核对 SG 页面时应打开 config/nonmotor/sg.json,不能把 MY 截图当作 SG 的运行证据。

页面注册配置:MY 市场中 HTML 文件名、chunk 与入口源码的对应关系

以当前 SG 的 factory-pdp6.html 为例,入口配置指向 factoryV2/pdp/index.tsx。找到入口后沿实际 import 阅读 App.tsx、Journey 请求和目标组件;同名目录不一定是当前页使用的实现。若修改共享组件,还要反查其他产品和市场的调用方。

config/nonmotor/ 是 nonmotor 应用的页面清单,config/common/ 是 common 应用的页面清单;src/pages/common/ 则只是源码目录。页面归属、源码路径和维护仓库是三个不同问题。按团队约定,nonmotor 应用页面在 nonmotor_h5 处理,common 应用页面在 ins_h5 处理。

5. 产品工厂:从 Journey 到页面与数据闭环#

本章聚焦产品工厂:先认识 Page → Block → Entry 与编辑界面,再用 SG PA 的真实 Journey 核对页面、字段和步骤,最后介绍配置导入、模板渲染与售中缓存。PFC 提供的开关与参数另在第 6 章独立说明;一项需求可能同时涉及两套配置和业务接口。

5.1 认识页面结构与编辑界面#

层次 含义 阅读重点
page 一个页面或配置中的页面节点 页面名、步骤、页面属性
block 页面中的业务区块 组件名、所在步骤、区块属性和字段集合
entry 区块中的字段或渲染元素 component_name、field_name、props、依赖和约束

可以将其理解为“配置描述界面需要什么,代码提供可执行的组件能力”。配置写入了某个 component_name,还需要确认目标页面能够解析并加载该组件。

产品工厂分享从 Admin 操作侧解释了这三层:左侧组件树选择 Page/Block/Entry,中间画布预览真实 H5,右侧属性面板编辑文案、图片、联动和数据组装。Admin 产出配置 JSON;H5 的 useGenerateComponents 根据 block 查同步或异步组件,并通过 props 转换、blocks 后处理生成 React 树。后台预览适合定位节点,但正式验收仍要在目标环境核对运行时 Journey 和真实操作。

产品工厂配置页面:左侧 Page 和 Block 树、中间 H5 预览、右侧 EN 与 SG 多语言属性

图 3:配置页面把结构、预览和文案并排展示。选中一个 Block 后,可以在右侧核对该区块的 EN/SG 文案、图片等 i18n props;截图中的 Apply & Preview 用于刷新中间预览,Save / Publish 是后续保存与发布动作。预览变化不等于目标环境已经生效,还要重新打开真实业务 URL 验证。

产品工厂 Journey 编辑器:Page、Block、Entry 树及字段 props、依赖和保存确认入口

图 4:另一编辑视图展开到 fillInfo 的具体 Entry,可检查字段属性、Pure Props、I18n Props 与 Dependencies。Pure Props 是传给已实现组件的配置参数,组件支持的参数以其代码契约为准;I18n Props 用于需要按语言配置的文案。截图提示手动编辑后先 Apply,再 Save / Confirm。这些按钮属于当前编辑视图,操作时要检查差异和实际状态,不能把图 3 的 Publish 与这里的 Confirm 当作同一个按钮。

拿到需求后,先按组件能力分成三类:

情况 产品工厂与代码怎么配合 重点验证
已存在组件,直接复用 在目标 Page/Block/Entry 引用已有 component_name,填入它已经支持的 props、字段和文案;无需复制一份组件代码 配置的组件名能被当前模板解析,目标产品的步骤、显隐和数据传递正确
已存在组件,需要新增 props 或功能 先找到组件及其他产品的调用方,明确新 prop 的含义和默认行为,再扩展组件消费该配置,并在目标 Journey 传入新值 未配置新 prop 的旧产品保持原行为;新旧配置、市场和多语言状态都覆盖到
没有可复用组件,需要新实现 先复用基础 UI 与表单能力,实现新的业务区块/字段组件;接入当前模板的组件映射,再在 Journey 引用并配置 props 当前代码包能加载新 component_name,配置与代码发布顺序匹配,完整交互与请求链路可用

判断依据是当前配置能否表达需求,以及当前组件是否已实现所需行为。只改文案、图片或现有参数时优先复用;新增 prop 时保留旧配置的默认行为;确实没有合适能力时才新增组件。给 AI 实现任务时一并提供组件代码位置、现有 props 契约、目标 Journey 节点和其他调用方,生成后仍要检查真实页面。

5.2 找到并核对当前 Journey#

以一个已经能打开的产品页面为起点,按下面的顺序查。产品工厂存在不同编辑视图,操作按钮见本章截图;实际权限、发布范围和审批仍按当前环境的团队约定核对。配置、运行时请求和仓库代码要交叉验证。

  1. 锁定对象。 记录市场、环境、产品 ID、业务入口和页面名称。只给 AI 一张页面截图,无法确定这几个维度。
  2. 取得配置。 在目标环境的产品工厂查该产品当前 Journey,保存修改前的配置与版本;在浏览器 Network 中对照 query_product_factory_journey 的实际响应,确认当前页面消费的是同一产品与页面。若两者不同,先排查环境、产品 ID、发布状态与缓存。
  3. 找到改动点。 在 pages 中找到目标 page,再定位 block、entry、字段属性、依赖和步骤。检查现有组件是否支持需求;必要时沿第 4 章的页面入口和第 5.3 节的解析链路查代码。
  4. 确定范围。 说明这次是只调整某个产品的配置,还是修改共享组件、接口或翻译;列出其他消费同一组件的产品与市场。
  5. 验证结果。 在目标环境重新进入业务页面,核对 Journey 响应、页面展示、前后步骤、返回修改和最终请求。后台“保存成功”不能代替页面行为验收。

做完这一步,应留下产品与环境、配置前后差异、代码能力判断、影响范围、运行时证据。这些事实也构成给 AI 的任务输入。

用 SG PA 的真实 Journey 读一次配置#

下面取自团队提供的一份 query_product_factory_journey 响应快照:product_id=2044008389641503267、lang=EN、rollout_journey_version=c0c7a22cae194e726b53c14780c6b13f。快照未附请求环境、获取时间与完整业务 URL,因此它能证明这份响应包含什么,不能单独证明当前 UAT/线上仍使用同一版本。实操时先记录 Network 中的请求环境、产品 ID、响应版本与登录状态,再到目标产品的 Admin 配置交叉核对。

在响应里看什么 SG PA 的实际值 接需求时怎么用
pages pdp 与 addInsured 两个 page 节点 不把通用的 PDP → Purchase → Confirmation 流程硬套到这个产品;addInsured 存在也不代表每位用户一定进入该页
pdp 页面 source=standalone_pdp,previewerPageName=factory-pdp6.html,next_route=/ins/checkout.html 先从 PDP6 入口和模板查起,再在真实 App 中确认点击后的跳转;next_route 是配置目标,不等于已完成端到端验证
pdp.blocks 10 个区块,包括 Header、VoucherCard2、Coverage2、FillInfo、FAQ 先找区块的 component_name,再判断是改这个产品的 props/entries,还是要修改共享组件
保障方案与期限 Coverage2 的 plan_id 提供 Basic / Gold 两档;period_unit 提供 6 / 12 Months 选项和默认值来自这份 Journey;保费仍要看实际试算结果,不能从文案推导
投保人邮箱 FillInfo → Policyholder_Info.Email:component_name=Input、field_name=policy_holder.email、cacheKey=pdpForm.Policyholder_Info/Email,并有 Ins_element_email 校验约束 一条字段同时涉及 UI 输入、校验、表单缓存和业务参数;查需求时逐项核对,避免再新增一个重复邮箱字段
被保人页面 addInsured 的 FillInfo 包含姓名、生日、关系、国籍、职业和证件等字段 与 PDP 的投保人字段分开看;是否打开、何时回写需跟随实际产品交互和代码验证

例如只拿到“调整 SG PA 的投保人邮箱校验”这个需求,定位路径是 product_id → pages.pdp → blocks.fillInfo → entries.Policyholder_Info.Email。这份数据已给出邮箱的组件、字段路径、缓存键和校验项;下一步应查 FillInfo/表单实现、当前环境下发值以及最终请求,而不是先修改一个通用表单控件。pages 中的 props、block/entry 的 props 在这份响应里是 JSON 字符串,分析前需要解析,不能把它们误当成已经展开的对象。

5.3 模板如何解析并渲染 Journey#

这里说的是前端把 Journey 结构解析并映射成 React 组件的运行机制。它包括页面容器、Journey 解析、区块组件注册、动态表单、步骤与路由处理;与 Webpack 生成 HTML 使用的 templateKey: appHtml 分属不同层次。

Nonmotor 模板渲染与数据流:Journey、React 区块、表单和 Checkout

图 5:产品工厂描述页面需要什么,前端代码实现这些能力,接口提供业务数据与校验结果。不同模板版本的实现路径略有不同。

用 PDP6 和 Purchase5 可以看到完整机制:

  1. 确认产品和页面。 URL 中的 product_id 标识产品;PDP6 默认调用 queryFactoryProductDetail('pdp') 获取对应 Journey,Purchase5 调用 queryFactoryProductDetail('purchase', true)。同一个 HTML 可以服务不同产品。
  2. 解析页面配置。 parseFactoryProductDetail 从 pages 中取出对应页面,把页面/区块的 props、字段的 field_name、dependencies、constraints 等转换成前端消费的数据。
  3. 生成业务区块。 PDP6 的 useGenerateComponents 遍历 blocks,根据 component_name(兼容 name)查找同步注册的组件,或加载对应异步组件。例如 Header、Coverage2、FillInfo、FAQ 都是已经实现的 React 能力。
  4. 生成字段并执行交互。 FillInfo 等区块继续消费 entries,结合 InsEntry 表单能力处理输入、字段值、联动与校验。Journey 描述选用哪些字段和规则,组件代码负责执行;配置里写一个名字,并不会自动生成尚未实现的新功能。
  5. 编排步骤和下一页。 Purchase5 根据 stepItems 建立步骤,并通过区块的 forkey 归入对应步骤,由 PurchaseStepBar 控制前进和返回。next_route 等配置参与跨页面导航;一个 HTML 内也可能包含多个投保步骤。
  6. 闭合业务数据。 输入需要按实现完成校验、转换和缓存写回,供确认页与 Checkout 消费;页面能显示字段,并不代表后端已经能收到它。

PDP6 使用 factoryV2/model/queryProductFactoryJourney.ts 和 Factory V2 的生成 Hook;Purchase5、Confirmation 中仍有对 factory/model 或 factory/hooks 的引用。新旧实现共存,定位时应跟随实际 import,而不是根据文件夹名猜测。

Purchase5 在解析 Journey 时传入 true,entry 的运行时 name 使用 field_name。排查联动时应核对表单实际标识,而不只看 Admin 中的 entry 名称。

5.4 导入配置与本地 mock#

产品工厂 Import Pages 弹窗:原始页面 JSON、新页面 JSON 与差异预览

图 6:Import Pages 提供批量调整页面 JSON 的入口。左侧是原始 Pages Data,右侧输入新的 Pages Data,下方先预览差异。适合在已有页面结构上调整多个节点;提交前要核对产品、环境、修改过的字段和未预期的差异,避免用旧快照覆盖他人刚更新的配置。导入后的保存、确认或发布仍按所在编辑视图执行,再以运行时 Journey 响应核实生效内容。

当前项目约定:

修改 Journey 时要同步源配置和生成的 view。找不到当前产品的配置时,应先取得有效配置来源,不能根据页面外观拼出一份“看起来合理”的配置。

图片使用经过指定上传流程得到的 CDN 地址;不把 Figma 临时链接或本地路径当作正式 Journey 图片。产品差异优先通过配置表达,配置确实不能承接时再说明代码适配的原因与范围。

5.5 数据闭环要在当前步骤完成#

新增字段时,至少追踪:输入值 → 校验结果 → 缓存位置 → 下游读取 → 展示值 → 请求值。

每个步骤负责把自己的输出处理成下游可直接消费的结构。不要把前序步骤遗漏的字段转换、默认值和业务规则统一堆到最后创单时补救。

项目已有存储工具和 Road Cache helper。阅读具体产品时还要核对缓存 key 与产品、流程、续保等参数的关系。返回修改、切换产品和重新进入,都可能暴露只验证单次向前流程时发现不了的问题。

前端售中流程页面缓存把售中缓存的主要用途归为表单回填和向 Checkout 交付试算/创单参数:新单由前序页面随操作组装,续保还需结合 policy_id 与原保单数据;Checkout 读取当前流程缓存。资料还区分“进入下一步时写入”与“校验成功后实时写入”,并指出公共参数只做 merge 容易留下旧值。SG PA 的 pdp 页面 props 中实际有 cacheOnFormEntryValidated=true,邮箱 entry 也指定了上述 cacheKey,因此验证邮箱改动要覆盖校验通过后的写入、返回回填、修改后的覆盖、Checkout 使用的值。

缓存资料中的 INSURANCE_CACHE_KEY_{user_id}_{product_id} 是当时的说明;当前 src/module/storage/helper.ts 的 getCacheKey 默认 custom_userid='',从 road_cache_key 或 product_id 取产品标识,续保时追加 policy_id,并保留旧用户 ID key 的兼容迁移。排障时以运行时实际 key 和当前代码为准,不按旧文档的格式直接删除或断言缓存。资料提及的默认 30 天有效期也应由目标调用与当前存储实现核实,不作为所有产品的统一保证。

6. PFC:配置下发、灰度与版本同步#

产品工厂决定页面结构,PFC 为已实现的代码提供配置片段、命中条件和发布版本。本章独立走完从 Key 到页面生效的流程;处理 Transify 页面文案时,再结合第 7 章使用 PFC 的相应功能。

6.1 认识入口与核心菜单#

环境 PFC 入口 使用时先核对
Test pfc.insurance.test.shopee.io 当前服务、页面路径、测试账号与权限
UAT pfc.insurance.uat.shopee.io 是否与正在验证的 UAT H5 和产品一致
Live pfc.insurance.shopee.io 目标版本、发布窗口及回退方案

PFC 左侧导航:Fragment V2、Page V2、White List V2、Schema Management、Transify Usage、Version Center、Dev Tools

PFC 菜单截图:菜单由权限控制;若看不到某项,先核对账号权限及所选服务,不要据此判断功能不存在。

菜单 主要作用 接 Nonmotor 需求时怎么用
Fragment V2 管理一个配置片段的 Data Key、类型、值、条件与发布方式 先从代码中的 PFC.getPFC('key') 反查 Data Key;看草稿与已发布值、Condition、Diff 和历史
Page V2 按 Page Path 查看页面下的 Condition 与 Fragment 绑定,以及 Redis Value、History 用实际路径如 /nonmotor/factory-pdp6.html 找到页面,再核对市场、App Type、白名单和最终页面值
White List V2 管理指定 User ID 或取模区间的灰度名单 只有目标 Condition 引用了名单,且当前用户命中时,灰度值才可能生效
Schema Management 给 Fragment 配置可视化表单结构 当配置值是复杂对象、数组等结构时,确认表单字段和数据类型;不是 H5 业务接口的 Schema
Transify Usage 按市场、页面、Key、版本查看文案使用情况 排查某条文案在哪些页面出现,或检查版本与未使用 Key;文案本身仍需核对实际下发值
Version Center 管理版本内的 Fragment,查看同步状态并向下一环境同步 将配置变更与迭代版本关联,检查哪些片段已发布、未同步、失败或冲突
Dev Tools 数据检查、Dispatcher 与 Nonmotor 页面同步等维护工具 主要用于专项排障或迁移;普通需求不要把它当作 Fragment 的常规发布入口

从仓库看,菜单分别注册在 src/components/Layout/config.tsx;Page V2 详情按区域展示 Condition List 和 Fragment List,Condition 含 page_path、region、app_type、white_list_key、params。这些字段共同决定“某页面向某用户下发哪份值”,Fragment 存在不等于当前页面一定拿到它。

6.2 从代码中的 Key 找到实际生效值#

PFC 的使用从“页面里哪个行为受控”出发。先在源码中找 PFC.getPFC('key') 的消费位置,读清楚返回值结构、缺省值以及何时读取;再确认目标服务、环境、市场和产品实际拿到什么配置值。项目通过 scripts/pfc.js 生成构建配置,config/webpack.config.js 使用 PFCSWebpackPlugin 注入相关配置,其中包含 BUILD_ENV、ENV、REGION 等维度。运行时仍要看真实下发值,不能仅凭后台表单或本地 JSON 判断命中。

需要确认 具体检查
谁消费 PFC key、读取位置、字段结构、默认值、页面是否需刷新后才重新读取
对谁生效 服务、环境、市场,以及代码里的产品 ID、用户或其他条件
与 Journey 的关系 PFC 是否只控制现有组件的开关/参数;若页面缺少区块或字段,还需检查 Journey
如何验证 记录预期命中与未命中的对象,对照实际 PFC 值、页面表现和请求结果
如何回退 保留旧值和影响范围,确认关闭或恢复配置后页面与相关产品的表现

例如,src/pages/factoryV2/common/tempInstallment.ts 同时读取 temp_installment 和 temp_installment_off 的 product_ids:目标产品在开启列表且不在关闭列表时,才启用对应展示。这说明“配置了开启列表”仍不足以断定该产品已命中;需要连同覆盖配置和代码条件一起检查。此例只用于说明查法,实施其他需求时应以它自己的 PFC key 和消费代码为准。

一个可操作的顺序是:确认 key 与代码条件 → 记录当前值和作用范围 → 准备目标值 → 在约定环境按团队流程配置 → 刷新并检查实际命中 → 验证开启/关闭两条路径 → 整理发布与回退信息。三个环境的入口见本章开头;当前账号权限、目标服务和审批状态仍需在平台核对。

PFC 系统分享把 PFC 解释为 Page Fragment Configuration:Admin 端管理 Schema、Fragment、白名单与发布,H5 端消费配置。Fragment 可承载 JSON、Transify/Transify Page、JS/CSS;后台支持 Diff、历史和回滚,白名单可按用户或比例做灰度。资料说明页面配置可在 HTML 返回前通过服务端嵌入,Webpack 插件生成本地/构建兜底数据,H5 再通过 SDK 读取。因此修改后还要分清发布目标、灰度命中、页面实际加载的配置与兜底值,不能以后台已保存作为生效证据。分享材料没有提供这份 SG PA 响应对应的 PFC key 或当前值;它的 is_user_whitelist=true 也不能替代 PFC 命中验证。

6.3 一次配置需求怎样走完#

流程示意
  1. 代码找到 PFC key
    1. Fragment V2 核对值与条件
      1. Page V2 核对页面绑定
        1. White List V2 核对灰度
          1. Submit 保存发布快照
            1. Batch Push 推送目标页面或 CDN
              1. 重新打开 H5 验证注入和业务行为
  1. 定对象。 先在 H5 源码查读取位置、默认值和分支条件,记录 PFC Data Key;再确定 Test/UAT/Live、服务、市场和目标 Page Path。同名 Key 的其他环境值不能当作本次结果。
  2. 看生效条件。 在 Fragment V2 查看配置类型、Publish Type(Only Page / Only CDN / Page And CDN)与 Condition;到 Page V2 对照页面绑定,涉及灰度时再到 White List V2 核对 User ID 或取模规则。用一个命中用户和一个未命中用户列出预期结果。
  3. 准备差异。 编辑前保存当前已发布值和条件;修改后检查 Diff、数据结构、受影响页面和复用方。Schema Management 解决编辑复杂值的表单表现,不会替代码补出尚不存在的消费逻辑。
  4. 按版本发布。 当前仓库的 Fragment V2 Submit 调用 publishConfig 保存发布快照;面向所选 Condition/Page 的 Batch Push 另调用 batchPushPage,按 Publish Type 还可能发布到 CDN。SPIN 服务的提交流程会选择版本;某些环境还可能有审批。应以界面状态、版本和发布结果为准,不能把“Save/Submit 成功”当成页面已生效。
  5. 验证与回退。 打开目标 H5 的完整业务 URL,核对 HTML 中的配置、运行时读取值和最终页面行为;同时验证未命中路径。保留旧值、目标页面、名单和版本,出问题时按当前环境的历史/回滚流程恢复并重新验证。

6.4 为什么打开 H5 就能读到 PFC#

PFC 分享资料描述了页面发布路径:配置发布到页面值后,服务端通过 OpenResty、SSI 和 Lua 在返回静态 HTML 时嵌入对应片段。pfc 仓库的 src/common/utils.ts 会把 JSON 片段生成类似 <script>window.PFC.__savePFC__("key", value)</script> 的内容;外链类型则生成带 src 的脚本或样式标签。H5 启动前已拿到的片段会进入全局 PFC 实例,业务代码再调用 PFC.getPFC('key')。项目构建中的 PFCSWebpackPlugin 还涉及本地/构建兜底数据;不同发布类型不保证都以同一种内联脚本出现。

浏览器 Elements 中,SG PA 页面 head 内的 PFC 初始化、注入脚本与外链资源

HTML 注入截图:在浏览器 Elements → head 可以看到 window.PFC.__savePFC__ 调用。截图中的 pcOn、ahTransify、userGlobal、nonmotorMigration 是该页面收到的配置 Key;看到某个 Key,只能说明它进入了页面,不能直接推断 SG PA 产品满足该 Key 的业务条件。

浏览器 Console 中查看全局 PFC store 与当前页面的配置键

Console 检查截图:可查看 window.PFC 与 PFC.__store__ 来定位页面实际持有的数据;__store__ 是调试时观察到的内部结构,业务代码应继续使用 PFC.getPFC,不要直接依赖内部存储字段。

排障时按顺序查:① Elements 中是否有目标 Key 的注入脚本或外链;② Console 中读取 PFC.getPFC('key') 是否得到预期结构;③ 代码中的产品 ID、默认值和覆盖条件是否真正命中;④ 页面展示及请求是否随之改变。若后台值与 HTML 不同,优先核对环境、Page Path、发布类型、Condition、白名单、版本和页面缓存。SG PA Journey 的 is_user_whitelist 是产品工厂响应字段,不能据此证明 PFC White List V2 命中。

6.5 Version Center:配置怎样跟随版本进入下一环境#

PFC 的版本用来归集一次迭代提交的 Fragment 变更,并跟踪它们在环境间的同步状态。它与 Casement 的迭代及 H5 release-v1.x.xxx 分支需要对应核对,但PFC 同步配置不是部署 H5 代码。下图是 Version Center 的示例:上半部分按 Release Gantt 展示发布批次、Release Branch、包含的版本和同步摘要;展开后可以看每个版本的状态。下半部分是某个版本的 Fragment History 和同步前差异检查。

PFC Version Center:按发布批次查看版本与同步状态,并在 Fragment History 中比较差异、选择跨环境同步范围

  1. 在 Release Gantt 找到当前迭代的 Release Branch 和版本;也可用 Pending / All Versions 及 Version Name、Sync Status 筛选。批次可能包含多个版本,先确认目标版本,不要只看分支名。
  2. 展开批次查看各版本的 Sync Status / Sync Result。Pending、Not Synced、Sync Partially 都不是全量同步成功;需要点开结果查未完成或失败的 Fragment。
  3. 在非 Live 环境点击单版本 Sync 或批次 Sync Batch To 下一环境。弹窗按版本列出待同步 Fragment;先看 Step 1 当前环境版本前后对比,再看 Step 2 下一环境应用前后对比,最后检查可编辑的 Step 3 最终推送数据。共享配置或目标环境已有改动时,差异审核尤其重要。
  4. 确认范围后用 Sync Current / Sync Selected / Sync All 同步当前、已选或全部 Fragment。Ignore 会将当前 Fragment 标为已处理但不推送;“同步白名单”开关也需要按需求决定。操作结束再检查每个 Fragment 的结果,并在目标环境重新打开页面验证 HTML 中的 PFC 值和文案。

截图中的版本号和状态仅用于理解界面,不代表当前迭代已同步。执行顺序仍是:确认迭代版本 → 提交与发布目标环境的 Fragment → 审差异并同步到下一环境 → 检查结果与真实页面;进入 Live 前遵循团队发布流程。

7. Transify:让多语言文案从 Key 走到页面#

接手一个“改文案”的需求,先分清 H5 调用、Transify 翻译值、PFC 页面下发 三件事。翻译人员在 Transify 填完文案,不表示用户页面已经更新;前端代码出现一个 Key,也不表示该页面的所有路径都会用到它。

位置 负责什么 需求中要核对什么
H5 通过 formatMsg(key, params?) 取得多语言文案,并在符合条件的非线上环境上报实际使用的 Key Key 是否正确、调用分支是否执行、占位符是否传值、目标页面路径是什么
Transify 项目资源 维护各语言的 Key 与 value 目标市场语言是否填好、占位符是否保留、翻译审核是否完成;本文仅列入口,不描述未核实的平台按钮
PFC 记录页面使用情况,维护并向页面下发 transify_page Fragment 页面与市场是否绑定正确、目标版本是否刷新/推送、H5 最终拿到什么值
流程示意
  1. H5 调用 formatMsg
    1. 上报实际使用的 Key
      1. PFC Transify Usage 记录页面与版本
        1. 同步页面 Transify Page Fragment
          1. Transify 补齐各语言 value
            1. PFC 刷新并推送页面翻译
              1. 重新打开 H5 验证文案

7.1 H5 怎样取到翻译#

页面和组件里的可翻译文案使用 formatMsg。例如 PDP6 的标题有 formatMsg('factorypdp.productdetail') 兜底,其他组件也通过它获取按钮、提示和错误文案。需要插入变量时传第二个参数;翻译 value 中的 {name} 或 {{name}} 会按同名参数替换。

tsx
formatMsg('common.coupon.sgmaid', { discount: '30%' });

src/locales/index.ts 将 formatMsg 交给 src/locales/i18n.ts;后者读取 PFC 的通用 transify 和当前路径的 transify_page_${location.pathname},页面级值覆盖通用值。查找时先尝试市场前缀 Key(如 SG.xxx、sg.xxx),再查原 Key。因此“Transify 平台有值”与“当前市场、页面拿到值”要分别核对。产品工厂 Journey 中配置的 Key 最终也需要由对应渲染逻辑取译文;不能仅凭配置字段的名字断定它已被翻译。

本项目的 H5 多语言文案应通过 formatMsg 接入。不要把某一市场的中文或英文直接写进共享组件,也不要用原始 Key 在页面上长期代替翻译。缺失翻译时,代码会按市场和环境回退成 Key、带方括号的 Key、末段名称或空串,页面“看起来有文字”并不能证明翻译已经下发。

7.2 本地打开自动采集#

在 ins_h5 仓库执行 npm run dev,交互项依次选择开发 → test(或目标 UAT)→ Transify usage 上报 on → 目标地区 → 目标服务。要调 Nonmotor 就选 nonmotor;若需要同时访问多个应用,可按场景选 all。下图是团队提供的启动示例,重点是第三项选 on。选择会写入本地 .env 的 TRANSIFY_REPORT,重新启动时检查当前值,不要只凭上一次终端选择记忆。

npm run dev 交互式选择开发环境、Transify usage 上报和服务

然后用已配置代理的完整业务 URL 打开目标页面,实际走到需要文案的交互分支。formatMsg 执行时,非 Live 的 Test/UAT 构建会记录该 Key;当 TRANSIFY_REPORT=on,且不是 Admin/自动化排除场景时,src/locales/report.ts 用 navigator.sendBeacon 向 PFC Test 的 /api/nologin/transify_usage/report 上报 Key、市场、location.pathname 和可能的版本号。它有去重与批量发送;只浏览首屏,不能采集尚未渲染的弹窗、错误提示或后续步骤。sendBeacon 返回成功只表示浏览器接受发送请求,仍应去 PFC 查记录。

7.3 从 Usage 到页面翻译 Fragment#

到 PFC 的 Transify Usage 菜单,用 Region、Path Name、Transify Key、Version 筛选刚访问的页面。这里展示的是使用记录,不是翻译 value。PFC 的同步流程按页面路径整理使用过的 Key,创建或更新该市场的 transify_page Fragment,显示名使用 [page_name]_auto_collect_transify_page 规则;实际生成逻辑会将路径中的 / 替换为 _、去掉 .html,因此查找时要同时核对原始 Page Path 与 Fragment 名。同步还与版本关联,访问页面后的 usage 记录和页面 Fragment 更新是两个阶段。

如果 Usage 已有 Key、Fragment 却没有,先检查市场、页面路径、版本和同步结果,不要在 Transify 平台重复造 Key。反过来,Fragment 中有 Key,也不保证这个分支在本次访问中执行过。

7.4 填写 value 后在 PFC 推送#

开发者或本地化负责人在 Transify 项目资源 补齐目标语言 value,保留与代码参数匹配的占位符。接下来先决定按 Fragment 处理,还是按页面刷新。下图上半部分以 _common_policy-list_auto_collect_transify_page 为例,下半部分以 /common/policy-list.html 为例;它们展示 PFC 的两种操作入口,不是 SG PA 页面的实际配置。

PFC 更新 Transify 的两个入口:Fragment V2 单个片段的 Edit、Submit、Publish,以及 Page V2 按页面路径执行 Update Transify

入口 适用场景 操作与核对点
Fragment V2 → 单个 transify_page 需要查看或调整某个自动采集的页面翻译 Fragment 按 Region、Name/Data Key 找准 Fragment;Edit 核对内容及页面条件,Submit 选择所属版本并提交,待所需审批完成后 Publish 到选中的页面条件。Submit 只是提交版本快照,不等于已经下发;发布后检查状态与目标页面。
Page V2 → Update Transify Transify 的 value 已更新,需要刷新某个 Page Path 所绑定的页面翻译 按 Page Path 找到页面,点击 Update Transify,选择 Region 和版本,再查看 updated、unchanged、failed。当前 PFC 实现会拉取最新翻译,并对有变化的已绑定 Fragment 执行发布与推送;这是页面级刷新入口,无须先逐个点上述三个按钮。

如果同一 Fragment 还绑定别的页面,页面级刷新会提示跨页面影响,需要先核对范围;没有绑定的 Transify Page Fragment 时无法刷新,应回到 8.3 节完成 Usage 到 Fragment 的同步。手动发布时也要检查所选页面条件,避免把共享 Fragment 推给非目标页面。

不要把“Transify value 已保存”“PFC Fragment 已更新”和“H5 已显示新文案”当作同一个状态。PFC 的目标环境、服务、页面路径、版本及当前用户看到的 HTML 都要一致;Live 还需遵循既定发布与审批流程;配置跨环境同步见第 6.5 节。

7.5 用一个页面验证整条链路#

以 SG PA 的 /nonmotor/factory-pdp6.html 为查找示例,先在代码中找到目标 formatMsg Key,再在页面实际触发它。依次检查:

  1. 采集: 本地 TRANSIFY_REPORT=on,PFC Test 的 Transify Usage 能按 SG、该 Path Name、Key 查到记录;只出现使用记录时不要宣称 value 已发布。
  2. 配置: 页面绑定的 transify_page Fragment 含该 Key,Transify 已填对应语言 value,PFC Page V2 的 Update Transify 已按目标 Region/版本完成且没有失败项。
  3. 下发: 重新打开业务 URL,在 Elements 或 Console 检查该页面的 PFC 翻译数据;PFC.getPFC('transify') 与 PFC.getPFC('transify_page_' + location.pathname) 能帮助区分通用值与页面值。
  4. 展示: 切到目标语言、触发目标分支,核对文案与占位符;同时检查同一共享组件的其他产品、市场是否受到影响。

页面内快速查 Key(非 Live): 在页面的 PFB 调试入口打开 Select PFB 抽屉,截图中的 Transify Debug Mode 与 Transify Key Panel 是同一抽屉里的两个工具。前者开启后会刷新页面,把经 formatMsg 渲染的文案显示为 [key],方便直接对照页面位置;它用当前会话的 transify_debug 标记控制,调试完成再点一次关闭并刷新。看到 [key] 是调试模式的预期效果,不能据此判断翻译缺失。

SG PA 页面中的 Transify 调试入口:打开 PFB 抽屉,使用 Transify Debug Mode 和 Transify Key Panel 查看文案 Key

Transify Key Panel 可搜索、复制当前页面已执行的 formatMsg Key,并标出当前下发翻译中该 Key 是否有非空 value。它只统计实际走到的代码分支;弹窗、错误态和后续步骤要触发后再查看。这个面板用于定位 Key 和检查当前页面数据,仍需按上面的采集、Fragment、下发与目标语言展示四步确认需求完成。截图是调试状态,不代表正式用户看到的文案。

若页面仍是旧文案,优先按 Key/语言 → Usage → Fragment 与页面绑定 → 版本与推送结果 → HTML/PFC 实际值 → formatMsg 调用分支 逐层定位。动态拼接的 Key、未触发的分支和被产品工厂配置直接写死的展示文本,需要额外检查,不能仅依赖一次自动采集。

8. AI 协作:准备输入、选择 Skill 与检查产物#

ins_h5 和 nonmotor_h5 当前各有 50 个 .agents/skills/spin-fe-*/SKILL.md,名称与文件内容一致。它们把常见工作拆成可执行的任务流程:分析需求、查询产品配置、生成代码、准备与执行自测、排查监控、Review 和交付。接手 nonmotor 需求时,按任务选择当前仓库的 Skill;平台入口、产品事实和最终验收仍要由负责人确认。完整触发条件以当前仓库的 SKILL.md 为准。

8.1 给 AI 的输入要覆盖开发上下文#

可以使用下面的任务描述模板:

text
请在 nonmotor_h5 中协助完成以下需求。
市场、环境、构建环境:……
产品与完整页面入口:……
需求正文、设计来源:……
当前 Journey 来源、版本与修改前快照:……
相关 PFC key、当前生效值、目标值及命中范围:……
接口协议、字段与业务码:……
预期交互、错误和返回行为:……
影响范围与不应改动的部分:……
验收场景:……

先判断 Journey、PFC、翻译、接口与代码的改动边界,列出影响范围和数据流;
按仓库 AGENTS.md 与本地 Skills 实现,分别报告代码检查、实际运行验证和未解决项。

仓库已有需求分析、TD、代码生成、Journey 查询/更新、mock、UI 验证、Runbook 和代码 Review 等 Skills。根据任务选择相应入口,编码前仍需应用完整工程规范。开发者应亲自确认业务规则、Journey/PFC 的实际生效范围、App 内结果与发布依赖;AI 的代码生成和静态检查无法单独证明这些结论。

8.2 从需求到交付,怎样选择 Skill#

遇到的工作 常用 Skill 它帮助完成什么
梳理需求与方案 spin-fe-requirement-analysis-generator、spin-fe-td-generator;Journey 页面再看 spin-fe-userjourney-td-generator 区分 H5 范围、页面状态、接口与配置依赖,形成可评审的 RA/TD;复杂变更也可用 spin-fe-openspec-* 逐步管理方案与实现
查当前产品配置 spin-fe-sync-product-factory-config 先查本地配置知识库,再从 Admin 只读获取产品、Journey 和 i18n;对照目标环境与产品 ID,不凭相似页面猜配置
修改产品工厂配置 spin-fe-update-product-factory-config 只有明确要写入或发布 Journey/i18n 时才走预检、差异确认、备份、发布和复核流程;只查配置时不用它
让 AI 实现页面与接口 spin-fe-fe-code-generator 或 spin-fe-fe-fast-generator,配合 spin-fe-code-generation-standards 从 TD/需求生成代码;编码前的总入口会加载架构、React、Service、样式、运行时、质量、MoneeDesign、Journey 和埋点九个规范
开发与交接埋点 spin-fe-tracking-development、spin-fe-tracking-report-generator;已有定义再用 spin-fe-tms-tracking 查询 实现页面、点击、模块曝光时同步补齐埋点;代码完成后汇总受影响页面的最终有效埋点,生成文档交 BI Review,再按 BI 录入的 TMS 定义核对实现
准备与执行验证 spin-fe-api-mock-artifact / spin-fe-api-mock-execution、spin-fe-fe-ai-self-test-authoring、spin-fe-ui-automation-execution、spin-fe-component-runbook-execution 先准备 mock 或用例,再按 Runbook 的 executionOwner 执行对应链路;生成用例与执行用例是不同任务
对照设计与检查改动 spin-fe-figma-ui-verify、spin-fe-ai-code-review 核对页面实际渲染与设计,并 Review 代码差异、共享组件影响和合并处理结果
排查与交付 spin-fe-tms-tracking、spin-fe-idap-data-query、spin-fe-fe-monitor-alert-investigation、spin-fe-confluence、spin-fe-commit-cmd / spin-fe-commit-push-cmd 查询埋点和前端监控、处理告警、整理文档;提交与推送只在本次任务明确要求时进行

实际需求先确认产品和接口契约,用只读 Skill 查当前 Journey;需要设计时生成 Journey TD,再交给 AI 实现,并用目标产品的真实页面和请求验收。只有明确要更新 Admin Journey/i18n 时,才进入配置写入 Skill 的差异预检与发布流程。PFC 当前没有单独的 spin-fe-pfc-* Skill;按第 6.2 节从消费代码找 key、核对生效值与命中条件,代码变更继续遵循通用工程规范。

8.3 AI 产物需要检查哪些边界#

工程细节由当前仓库的规范 Skill 约束。开发者 Review 时,重点检查这些会直接影响需求交付的边界:

检查点 核对内容
复用与影响范围 优先复用已有业务组件、MoneeDesign 与表单能力;扩展 props 后,旧配置的默认行为是否保持一致
页面注册 目标市场的 config/nonmotor/{region}.json 是否包含入口;现有 npm run template 仍写入 config/bizConfig/{country}.json,生成后需检查归属并重启开发服务
接口与数据 使用统一 @/common/request,核对业务码、字段类型、请求映射与消费方;Service 不承担 Toast、跳转或 React 逻辑,大整数 ID 不随意转为 Number
文案与展示 formatMsg、Journey 文案及 Transify 下发是否对应;检查长文案、多语言、键盘、滚动和底部按钮
导航与缓存 通过 Bridge 保留产品与来源参数;输入、校验、缓存、返回回填和最终请求是否一致
迁移与真实请求 nonmotorMigration 可改写部分旧页面/API 地址;结合实际 Network 核对,避免全局替换 /ins/ 或 standalone 路径
验证结论 区分代码检查、Mock、真实接口和 App 实测,保留未验证项与阻塞原因

新增、生成或修改业务代码时,仍按仓库的完整工程规范执行。这里保留 Review 关注点,具体目录、React、样式和接口写法由相应 Skill 提供。

8.4 开发埋点并交接 BI#

埋点由开发在开发阶段主导,随功能代码一起实现。 项目代码生成规范已要求检查埋点:新增页面或改变组件、交互、展示行为时,按 spin-fe-tracking-development 核对页面初始化、每个用户点击和一级业务模块曝光;已有 TMS 定义时优先遵循已确认的名称与参数口径。页面入口只初始化一次;点击在对应回调中上报一次;曝光应稳定,避免重复渲染造成重复上报。page_type 和 URL 自动填充的公共字段不要在事件里重复传入。

这项工作从编码一直延续到 BI 接收,按以下顺序交付:

阶段 负责人和动作 留下的结果
开发中 开发核对需求涉及的页面、点击、模块曝光;确定 page_type、target_type、必要的 page_section、operation 和业务 data,用 @/common/track 实现并在页面上验证触发时机、参数与重复/漏报。若已有 TMS ticket 或 point ID,可用 spin-fe-tms-tracking 查询既有定义。 与功能一起提交的埋点代码,以及页面/Network 等验证证据。
代码完成后 开发使用 spin-fe-tracking-report-generator 生成埋点文档,提供给 BI Review。报告以当前分支相对目标集成分支的完整需求改动为范围,列出受影响页面最终有效的全部埋点;历史或复用埋点也列出,并逐条标明“是否本需求新增”。 按页面组织的中英双语文档,包含页面/组件截图、事件标识、字段含义及新增标记;MR 中附文档链接。
BI Review 与录入 BI 审核事件的业务含义、命名、参数口径和覆盖范围,确认后由 BI 录入 TMS。开发根据 Review 意见修正代码或文档。 BI 确认的埋点定义及对应 TMS 记录。
交付前复核 开发对照最终 TMS 定义检查代码和文档,并用目标页面实际操作验证页面、点击、曝光事件的上报值;记录尚未完成的 BI/TMS 项及其负责人。 MR、埋点文档、TMS 定义与实际上报一致,可供 BI 和 QA 复查。

报告不能只列“本次新增的几条”:BI 需要看到受影响页面当前实际会产生哪些事件,也需要分清新埋点与已有埋点。埋点报告 Skill 规定了报告范围和格式;“开发输出 → BI Review → BI 录入 TMS”是当前团队交接流程。

性能链路按项目约定覆盖 JS_START、BEFORE_MAIN、AFTER_MAIN、RENDER。业务异常使用带稳定 unique_key 的日志,记录定位所需上下文,避免静默吞错或记录凭证、敏感表单原文。

9. 联调与排障:真实接口、App 流程与 Mock#

自测按“目标页面交互 → 真实接口 → App 主流程 → 复用方回归”逐步完成。检查范围由需求决定,已有证据通过后不必重复扩大测试。

记录维度 至少写清
环境 市场、产品、入口、前后端环境/PFB、前端版本
设备 浏览器/模拟器/真机、系统与 App 版本
场景 正常、无效输入、接口异常、返回修改、重新进入、受影响产品
证据 预期与实际结果、截图、请求参数/响应;注明 mock 或真实接口
未完成项 阻塞原因、尚未验证的范围与下一步

9.1 先分清在哪一层失败#

先按第 3 章选择调试环境:浏览器用于快速定位 H5 问题,模拟器配合 Safari 检查 App 内 H5,真机优先用于完整主流程自测。涉及支付、OTP 或地址选择等 App 页面时,不能以浏览器验证代替 App 链路验收。

现象 首先检查
页面 404 当前 APP_NAME、市场入口、路径前缀、是否重启开发服务
页面白屏 Console、JS 资源、初始化异常和主请求结果
修改没有生效 是否运行本地版本、代理规则、当前产品配置、缓存
请求未命中预期服务 ENV、代理目标、PFB、迁移配置和实际请求 URL
HTTP 200 但页面报错 业务码、响应结构、必需数据与调用方处理
字段不出现 Journey 数据、组件匹配、显隐依赖、当前步骤
输入正确但请求值错误 field_name、缓存路径、类型转换和下游组装
返回后信息丢失 步骤离开时写回、返回时读取、缓存 key 和清理时机
浏览器正常、App 异常 Bridge、WebView 返回行为、登录和真实运行环境
某一市场正常、其他市场异常 市场入口、条件编译、区域配置、翻译和组件依赖

先复现并确认请求、响应和状态,再决定改动层次。不要因为错误出现在页面上就直接修改组件。

9.2 Mock 与真实联调#

Mock 用于接口未完成时的并行开发,以及稳定复现空数据、异常和特定分支。响应需要遵守真实契约,并把作用范围限定到目标接口/产品。

下面两种方法都在网络响应层临时替换接口返回,适合调试 query_product_factory_journey 这类请求;与第 5.4 节从 Journey 配置源生成的仓库本地 mock 不同,不会修改产品工厂或后端的真实数据。

用 Whistle 替换响应#

按第 2.4 节启动 Whistle,并确认浏览器或设备流量确实经过 127.0.0.1:8899。打开 http://127.0.0.1:8899/#network,在 Network 中找到目标请求,例如当前 SG PA 页面的 query_product_factory_journey,右键选择 +Rule → Response。在弹出的规则编辑器中核对 URL Pattern,勾选 Modify Response Body,选择 Replace Body,通过 + File 准备本地 JSON 响应,最后点击 Save As Rules。回到页面重新触发请求,在 Whistle Network 中确认命中该规则,检查返回体和页面行为。规则预览中通常可以看到对应的 resBody 映射;Whistle 响应体规则说明。

Whistle Network 中从目标请求创建 Response 规则,并用本地文件替换接口响应体

这条规则对经过 Whistle 且匹配 URL Pattern 的请求生效,因此可以用于已配置代理的浏览器、模拟器或真机。图中的 resBody 是收到后端响应后再替换响应体;如果接口尚无可用响应,需改用直接返回本地内容的 file 规则或项目已有的本地 mock 服务。匹配范围应尽量限定到目标环境、域名和接口;验证结束后停用或删除规则,避免后续联调继续读到旧数据。

用 Chrome DevTools 覆盖响应#

在 Chrome 打开目标页面和开发者工具,进入 Network → Fetch/XHR,找到目标请求并右键选择 Override content。首次使用时,按提示选一个存放 Overrides 的本地文件夹并授权;DevTools 会在 Sources → Overrides 打开该响应的副本。修改并保存 JSON 后刷新页面,回到 Network 的 Response 核对实际覆盖结果,再检查页面表现。Chrome 的本地覆盖说明也给出了 XHR/fetch 响应的操作步骤。

Chrome DevTools Network 中对 query_product_factory_journey 请求使用 Override content

这种方式适合只在当前 Chrome 浏览器快速试一个返回值,无需改 Whistle 规则;它不会替代模拟器或真机里的请求。结束后到 Sources → Overrides 关闭 Local Overrides,避免下一次刷新仍使用本地副本。

无论选哪一种方式,都先保留原始响应,只改本次要验证的字段,保持 code、data、字段类型和嵌套结构符合接口契约。自测记录里注明被替换的接口、mock 文件/规则、验证场景和实际响应;接口可用后再关闭 mock,用真实请求复验。

验证记录应写清哪些结果来自 mock、哪些已经通过真实接口。Mock 成功只能证明页面在该响应下的行为;真实登录、网关、PFB、后端校验和 App 行为需要相应环境的证据。

10. 交付与发布:BI、MR、Casement 与验收#

本章接续第 4 章的迭代分支流程:本地自测完成 → 提交 MR → Review 与合入 → 按团队流程提测/发布 → Casement 部署 → 检查实际页面。代码、配置与接口是同一次交付的组成部分。

10.1 准备 MR 与 QA 交接资料#

MR 描述应包含业务问题、最终行为、影响页面/产品/市场、代码与配置改动,以及验证结果。涉及公共能力时列明调用方影响,涉及协议时说明字段变化。

涉及页面、组件或交互变化时,MR 还应链接开发生成的埋点文档,说明 BI Review、TMS 录入与实际上报验证的状态;未完成项明确负责人和后续动作,避免埋点代码已合入但定义与文档未对齐。

提交前检查:有无无关文件、临时日志、账号或凭证;新增类型与真实数据是否一致;配置与 mock 是否按约定同步;自测是否覆盖用户回退和错误路径。

给 QA 的交接资料应包含完整入口、市场/产品、环境与版本、账号获取方式、需求范围、验收场景、自测结果及已知限制。验证记录格式见第 9 章。

10.2 前端交付物不只有代码#

物料 交付时核对
前端代码包 分支、版本、APP_NAME、市场、环境
Journey 目标产品、配置版本、组件兼容性、发布状态
i18n / Transify key、目标语言、插值和实际下发
图片 正式 CDN 地址、尺寸、加载效果
PFC 下发范围、字段结构、预期命中行为
后端接口 环境、版本、字段契约和发布依赖
埋点文档 / TMS 受影响页面的最终有效埋点、是否本需求新增、截图与参数说明;BI Review 结果、TMS 录入状态和实际触发证据
QA 验证资料 完整入口、场景、预期、自测证据与限制

物料范围按实际产品和市场确定,不照搬 Admin 后端所有物料全地区同步的要求。

10.3 在 Casement 部署迭代版本#

部署前先完成第 4.5 节的开发、自测、MR 合入与发布流程。然后在 Casement 中选择 nonmotor_h5 应用,进入对应 release-v1.x.xxx 迭代,部署该迭代对应的分支代码版本。

Casement 中选择 nonmotor_h5 应用、release 迭代并查看部署记录

图为用户提供的 release-v1.3.318 Test 环境示例。使用时替换为当前迭代和目标环境,不直接沿用截图中的版本、PFB 或部署状态。

操作顺序:

  1. 在 My Application 中选择 nonmotor_h5,进入本次迭代的 release 页面。
  2. 确认当前环境,并检查本次需求需要的配置、Release Note 等发布物料。
  3. 在 Deployment → Service Deployment 中找到目标服务,使用 Deploy 进入部署操作,核对本次版本和目标环境后提交。
  4. 在部署记录中核对 Region、Env 和 Parameters (Git/PFB/ImageTag),确认版本、PFB 与本次联调或验证计划一致。
  5. 观察 Status,必要时通过 Detail 查看详情。deploying 表示仍在部署,不能视为完成;部署成功后再验证目标页面及业务链路。

MR 合入、版本发布、部署成功和业务验收分别是不同检查点。部署记录中的 Git/版本、PFB 和镜像信息应与预期对应,避免代码已合入但实际验证的仍是其他版本。

部署负责人、审批要求,以及发布版本/Tag 的具体生成操作仍需按团队约定补充。截图中的 Rollback 是平台入口,实际回滚前仍需检查代码与配置的兼容关系。

10.4 构建产物与市场范围#

deploy/nonmotor.json 定义了 nonmotor 部署模块。deploy/space_build.sh 读取部署环境中的 CID 作为 REGION,并设置 APP_NAME 进行构建;产物目录为 dist/nonmotor,部署使用 /nonmotor/ 页面路径,静态资源路径也包含环境和市场信息。

这意味着发布时要核对目标市场与应用,不能仅凭某一次构建完成就认定所有市场都已覆盖。Casement 的一条部署记录可以包含多个 Region,也可以只包含一个市场;以本次选择和部署结果为准,不要求开发者机械地逐市场点击部署。

10.5 发布顺序与回退#

发布前把代码、配置和接口依赖放在一起 Review。例如,Journey 引用了新组件时,需要确保目标代码包能够加载它;接口字段变化时,需要确认前后端版本组合的兼容性。

回退方案也要覆盖配置和接口配套关系。不能只回退前端包,却保留仅新包能处理的 Journey。

上线后检查目标入口、主流程、资源加载、业务错误和关键埋点。监控与验收范围应对应本次改动的市场、产品和场景。

10.6 交付前的完成检查#

完成第一个需求时,逐项检查以下结果;“代码写完”只是其中一部分。

11. 补充内容#

前面的章节已经走完日常开发闭环。本章简要区分几个接需求时常遇到的控制点:市场和产品差异、灰度与放量、埋点与日志。具体命中范围仍以当前代码和目标环境的实际配置为准。

11.1 差异化开发#

内容 当前机制 开发时先核对
市场差异(条件编译) REGION 在构建时决定某段代码是否进入目标市场产物 目标市场是否命中条件,以及公共代码对其他市场的影响
产品差异 Journey 描述页面结构;需要代码扩展时,可按市场和产品 ID 加载配置 现有配置与组件能否表达需求,改动影响哪些产品

市场差异:构建时选择代码。 下图是 src/pages/checkoutV2/App.tsx 的实际片段:/* #if (REGION == 'th' || REGION == 'ph' || REGION == 'sg' || REGION == 'id') */ 到 /* #end */ 之间的优惠券入口逻辑,只进入条件命中的市场构建产物。项目的 config/webpack/conditionLoader.js 在构建时根据 REGION 处理这些标记;它不是页面打开后再判断市场的运行时 if。修改这一块时,先确认目标市场是否在条件内,再检查对应市场的构建和实际交互;公共逻辑放在条件块外时,也要评估其他市场。

Checkout 中按 REGION 条件编译优惠券入口逻辑的代码截图

产品差异:同一市场下选择产品配置。 下图展示 src/pages/factoryV2/pdp/config/my/ 按产品 ID 拆分的文件,以及某个产品提供的 bottomBarConfig、queryUserInfoConfig。入口 config/my/index.ts 从 URL 的 product_id 加载对应文件,PDP 的 config/index.ts 再将市场/产品配置与基础配置合并,供共享组件消费。这类配置用于产品特有的数据预处理、接口查询或底部栏行为;若需求可以由 Journey 的 Page/Block/Entry 和现有 props 表达,应先走产品工厂配置,只有共享能力无法覆盖时才检查是否需要这种代码级差异。改动后要核对当前产品 ID、目标市场、默认配置及同市场其他产品的行为。

MY PDP 按产品 ID 组织差异配置,并提供 bottomBarConfig 与 queryUserInfoConfig 的代码截图

这两张图说明的是不同的选择时机:REGION 条件编译决定代码是否进入某市场的构建产物;按 product_id 加载的配置决定同一市场内某个产品如何使用共享 PDP 能力。截图中的产品文件只是代码结构示例,不代表所有产品都必须建专属配置文件。

11.2 配置与上线控制#

内容 简要说明 核对点
灰度功能 开关或命中条件决定能力对哪些对象生效 查实际配置值和命中条件,分别验证开启、关闭与回退路径
产品工厂放量 关注 Journey 配置对目标产品、市场和版本的生效范围 核对配置版本、页面实际结果及与前端代码包的兼容性;操作入口和审批按团队约定执行

11.3 观测与排障#

内容 简要说明 核对点
TMS 埋点平台 开发随代码实现埋点,生成文档交 BI Review,由 BI 录入 TMS;完整交付顺序见第 8.4 节 对照最终定义检查事件时机、参数和重复或漏报
IDAP 平台 按环境、市场、时间和页面等线索查询接口或自定义日志 将日志与浏览器 Network、页面状态及必要的后端日志对齐;访问权限按团队信息确认

这几类能力控制的对象不同:条件编译影响市场构建产物,产品配置影响某个产品的页面行为,灰度与放量影响开放范围;TMS 和 IDAP 分别帮助核对用户行为上报与运行问题。Transify 的操作链路见第 7 章。

附录 A:团队操作信息待补充#

这些信息影响实际操作,在确认前不将示例或历史约定作为当前流程:

信息 当前状态 需要补齐的内容
分支与 Review dev/release 命名和 MR 方向已确认 Reviewer、审批要求、多人开发分支的远端协作约定
本地代理 ZeroOmega、Whistle、证书和市场规则已整理 按目标环境实测;确认 TH/SG/PH 浏览器域名与 API 目标的对应关系
iOS 模拟器 Xcode、Simulator App 安装和系统代理步骤已整理 当前推荐的 App 构建、iOS runtime、Mac 架构兼容性及目标 App 业务入口
本地登录 待补充 测试账号获取、目标域名登录和登录态验证步骤
PFB 联调 需按目标环境确认 设置方式、有效性检查、后端命中验证
部署与回滚 Casement 应用、迭代入口及部署流程已确认 平台 URL、操作人、审批、版本/Tag 生成与具体回滚步骤
培训演示产品 待选定 市场、产品、完整入口、设计截图和演示数据
常用平台 产品工厂分享指向 Insurance Admin 的 Product Center;PFC 的 Test、UAT、Live 入口已列在第 6.1 节;Transify 项目链接已列在第 7 章;TMS 与 IDAP 入口已由团队提供 核实各平台当前登录权限、服务与审批状态;KMS 入口仍待补齐

附录 B:依据与维护范围#

主要核对文件:.nvmrc、package.json、scripts/prompt.js、scripts/start.js、scripts/create-template.js、config/bizConfig.js、config/paths.js、config/webpack.config.js、config/nonmotor/my.json、deploy/nonmotor.json、deploy/space_build.sh、deploy/space_install.sh。

页面与数据流依据:src/pages/factoryV2/purchase5/index.tsx、App.tsx、src/pages/factory/model/queryProductFactoryJourney.ts、src/common/request.ts、src/common/nonmotor.ts、src/module/storage/helper.ts、src/InsEntry/validate/email.ts。

页面入口介绍补充核对:config/nonmotor/my.json、config/nonmotor/sg.json、config/common/my.json、config/ec/my.json、config/bizConfig/my.json、src/pages/factoryV2/pdp/index.tsx、src/pages/factoryV2/pdp/App.tsx、src/pages/factoryV2/model/queryProductFactoryJourney.ts;配置组装和输出规则核对 config/bizConfig.js、config/webpack.config.js 与 config/paths.js。common 应用的仓库维护约定来自团队提供的页面注册截图。

项目介绍补充核对(2026-10-10):Motor 流程基于 ins_h5 当前工作区的 config/bizConfig/{region}.json,以及 src/pages/id/motor/carPdp/components/GetQuoteBtn/index.tsx、quote/components/QuoteAddonPanel/index.tsx、quote/components/BottomBar/index.tsx、confirmPersonalInfo/components/ConfirmBtn/index.tsx;MY 的 carPdp/components/BottomBar、quoteList/App.tsx、common/components/QuoteCard、quoteDetail2/components/BottomBar;SG 的 carPdp/components/BottomBar、quoteList/components/QuoteCard、quoteDetail/components/BottomBar、quoteAddOn/components/BottomBar、applicationForm/App.tsx。上述 MY/SG 路径分别以 src/pages/my/、src/pages/sg/ 为前缀。

Nonmotor 复用机制基于 nonmotor_h5 当前工作区的七个 config/nonmotor/{region}.json、src/pages/factoryV2/hooks/useGenerateComponents.tsx、model/queryProductFactoryJourney.ts、pdp/syncComponents/index.ts、pdp/config/pdpConfig.tsx、purchase5/App.tsx、purchase5/config/index.ts、confirmInfo/App.tsx,以及 src/pages/factory/model/queryProductFactoryJourney.ts、src/pages/checkoutV2/App.tsx 和 model/{region}。Factory V2 的缩略路径均以 src/pages/factoryV2/ 为前缀。组织方式的业务原因结合团队本次说明整理;流程图是源码导航与配置的教学示意,未冒充所有市场产品的端到端实测结果。

PFC 使用路径补充核对(2026-10-14):nonmotor_h5 的 scripts/pfc.js、config/webpack.config.js、src/common/pfc.ts、src/pages/factoryV2/common/tempInstallment.ts 和 src/pages/factoryV2/pdp/config/productConfig.ts;pfc 仓库的 src/components/Layout/config.tsx、src/common/utils.ts、Fragment/Page/Whitelist V2 页面、ConditionDetail、Version Center 与发布 service。PFC 三个入口及菜单、HTML 注入、Console、Version Center 截图由团队提供;测试环境网页在本机访问时被 Whistle 转发到未启动的本地服务,因此本文的菜单和流程依据源码与截图整理,没有把现场登录或发布结果当成已验证事实。

SG PA 示例与参考材料补充核对(2026-10-14):团队粘贴的 query_product_factory_journey 响应快照(产品 2044008389641503267)、PFC 系统分享、产品工厂分享和前端售中流程页面缓存。缓存键另对照 nonmotor_h5/src/module/storage/helper.ts 与 constant.ts 的当前实现。响应快照未提供环境与获取时间,三篇分享材料也不证明 SG PA 当前 PFC 值或真实下单结果;这些仍需运行时核对。

开发规范依据:本仓库 AGENTS.md 及 .agents/skills/ 下的工程、Journey、Service、React、样式、MoneeDesign、运行时集成与埋点规范。后续维护应以当前源码和规范为准。

Transify 与版本流程补充核对(2026-10-14):ins_h5/nonmotor_h5 的 scripts/prompt.js、src/locales/index.ts、i18n.ts、report.ts,以及 pfc 的 Transify Usage、src/app/service/transify/index.ts、Fragment V2 的 Submit/Publish、Page V2 Update Transify、pfc-version/page.tsx 与 PatchFragmentModal。Transify 平台链接、启动与更新截图,以及 PFC Version Center 截图由团队提供;本文没有登录 Transify 平台,也没有实际写入翻译、推送 PFC 配置或执行跨环境同步。

Skills 章节补充核对(2026-10-14):逐一比较 ins_h5 与 nonmotor_h5 的 .agents/skills/spin-fe-*/SKILL.md,两边当前各有 50 个文件,文件名和内容一致。第 8 章仅介绍常用任务入口和职责边界;具体触发条件与执行限制以工作时所在仓库的 Skill 为准。

文档编排参考:admin后端开发流程,内容由用户提供的 HTML 读取。代理章节结合用户材料、ZeroOmega 安装页和随文引用的 Whistle 官方说明整理。本文未执行真实产品配置修改、业务操作或发布,也未代用户安装插件、根证书或切换代理。

分支及部署流程依据:用户确认的 dev-v1.x.xxx → release-v1.x.xxx → Casement 部署 流程,以及随文保存的 Casement 截图。截图仅用作操作位置说明,不作为当前部署结果或权限状态的证明。

模拟器流程依据:用户提供的模拟器安装截图,以及随文引用的 Apple 和 Whistle 官方说明;内部下载入口来自截图正文,版本与页面可用性未独立验证。

附录 C:市场代理规则#

以下按用户提供的域名整理,保留原有整站转发意图,目标统一为本地 HTTP 3000 服务;没有实际联网验证这些业务域名。每个市场/环境单独保存为规则组,按本次开发选择启用,不要把所有环境同时指向一套本地构建后混用。

text
# BR UAT
protection.uat.shopee.com.br http://localhost:3000

# TH Test
protection.test.shopee.co.th http://localhost:3000

# TH UAT
protection.uat.seainsurebroker.co.th http://localhost:3000

# SG Test
test.moneeinsureagency.sg http://localhost:3000

# SG UAT
uat.moneeinsureagency.sg http://localhost:3000

# MY Test
protection.test.shopee.com.my http://localhost:3000

# MY UAT
protection.uat.shopee.com.my http://localhost:3000

# VN Test
insurance.test.shopee.vn http://localhost:3000

# VN UAT
insurance.uat.shopee.vn http://localhost:3000

# ID Test
insurance.test.shopee.co.id http://localhost:3000

# ID UAT
insurance.uat.shopee.co.id http://localhost:3000

# PH Test
protection.test.moneeinsurebroker.com.ph http://localhost:3000

# PH UAT
protection.uat.moneeinsurebroker.com.ph http://localhost:3000

整理时处理了以下重复与不一致:

附录 D:Motor 市场流程与目录详解#

本附录供需要对照车险页面的同学深入阅读。第 1 章讲业务差异;这里保留 ID、MY、SG 的具体链路、团队目录截图,以及七个市场的入口示例。源码中存在历史与可选分支,表格不代表所有产品的固定步骤。

ID:车辆与报价逻辑分开,附加保障作为报价页分支#

当前 id/motor/ 的主链路可以沿以下页面阅读:

car-pdp.html → quote2.html → confirm-personal-info2.html → checkout.html

页面/分支 作用与代码位置
车险 PDP id/motor/carPdp/;填写/选择车辆相关信息,GetQuoteBtn 成功后进入 quote2.html
报价页 id/motor/quote/;展示和调整报价、保障方案,BottomBar 进入个人信息确认
车辆配件、附加保障 QuoteAddonPanel 分别打开 add-car-accessories2.html、add-additional-coverage2.html;返回报价页后读取缓存、更新选项,相关处理会触发重新报价
个人信息确认 id/motor/confirmPersonalInfo/;确认车主等资料,写入 createPolicyParams、calcPremiums 后进入 Checkout

车辆品牌和地区选择也有独立入口,例如 car-information.html、region-code-selector.html。这些是用户操作触发的辅助页面,不是每次投保都要依次经过的主步骤。

MY:从车辆信息获取报价列表,再进入报价详情#

当前汽车报价路径可读作:

car-pdp.html / car-pdp2.html → quote-list.html → quote-detail2.html → checkout.html

PDP 的 my/carPdp/components/BottomBar 进行预检、请求报价卡片,并把车辆信息和报价结果写入缓存;my/quoteList/App.tsx 读取缓存并展示卡片;my/common/components/QuoteCard 进入报价详情;my/quoteDetail2/components/BottomBar 处理进入 Checkout 前的业务逻辑。

报价详情还可打开 vehicle-info.html 修改车辆信息。摩托车与部分历史路径存在分支,例如 motorcycle-quote-list.html、quote-detail.html,因此不能把汽车示例原样套到所有 MY Motor 产品。

SG:报价详情之后,按保障内容决定是否进入 Add-ons#

SG 的报价列表路径可读作:

car-pdp.html → quote-list.html → quote-detail.html → [quote-addon.html] → application-form.html → checkout.html

sg/quoteDetail/components/BottomBar 根据当前方案的可用附加保障计算 hasAddOns:有附加保障时进入 quote-addon.html,否则直接进入投保表单。PDP 还保留进入 quote.html 等路径,续保也有专属分支;上面的列表路径用于说明当前代码中的一种业务编排。

这类差异解释了为什么不能简单把某市场的 Motor 页面复制后只换翻译:页面拆分、字段、报价前提、附加保障、缓存结构与下一步条件都可能变化。

不同市场的入口目录#

Motor 页面源码目录:ID motor 子目录与 MY、PH、SG、TH、VN 市场目录

团队提供的目录截图:src/pages/id/motor/ 集中放置 ID 的车险主流程页面;其他市场在各自目录维护。截图中同时能看到 factory、factoryV2 和 checkoutV2,分别对应产品工厂模板与收银台。

以下是当前 config/bizConfig/{region}.json 已登记的代表页面,不表示它们全部属于同一条顺序流程。

市场 主要源码目录(相对 src/pages/) 已登记的页面示例
MY my/ carPdp、quoteList、quoteDetail2、vehicleInfo
ID id/motor/,以及部分 id/ 辅助页 carPdp、quote、addAdditionalCoverage、confirmPersonalInfo;carInformation
SG sg/ carPdp、quoteList、quoteDetail、quoteAddOn、applicationForm、driverInfo
TH th/ carPdp、quoteList、coverageDetail、applicationForm、confirmInfo、carPhoto
PH ph/ carPdp2、quoteList、coverageDetail、vehicleInformation2、reviewConfirm、kyc
VN vn/ carPdp、carInformation、applicationForm、confirmInfo
BR br/ carPdp、selectCoverageInsurer、quote、selectPlan、applicationForm
↑