# 混合体验架构方案 本文档用于说明当前项目在 **结果页、文创内容页、客户定制体验页** 上的长期承载方案。 核心结论: **不做“原生还是 H5 二选一”,而是采用三层混合方案:** - 原生模板 - 原生有限 DSL - H5 扩展页 当前阶段已经进一步定案: - **即时内容弹窗:原生** - **详情页 / 互动任务页:H5** - **结算页:原生兜底 + H5 全屏增强** --- ## 1. 为什么需要混合方案 当前项目已经确认: - 结果页经常会变 - 打点弹出内容经常会变 - 样式、内容、交互形式会随着客户需求变化 - 有些内容还会带动作: - 拍照上传 - 语音留言 - 小游戏 - 表单与任务 如果全部原生写死: - 改版成本高 - 每次都要改页面代码 - 客户变化一多就会拖慢开发 如果全部交给 H5: - 核心体验不稳 - 地图主流程会割裂 - 性能和权限整合更麻烦 因此最适合的方案是: **核心高频体验保留原生,灵活变化部分分层处理。** --- ## 2. 总体结构 建议未来的体验承载层分成三层: ### 2.1 原生模板层 用于承接: - 最小结果页 - 最小内容卡 - 高频、必须稳的体验页 特点: - 结构固定 - 数据可变 - 主题可换 - 性能最好 - 原生能力最完整 ### 2.2 原生有限 DSL 层 用于承接: - 结构变化较多,但组件种类有限的页面 - 结果页区块组合 - 内容页区块组合 特点: - 不是万能布局引擎 - 只支持有限区块和有限顺序配置 - 比固定模板灵活 - 比 H5 更稳 ### 2.3 H5 扩展层 用于承接: - 强定制内容 - 富图文内容 - 品牌化包装 - 富交互任务页 - 定制结算页 特点: - 自由度最高 - 改版速度最快 - 最适合客户高频定制 - 但必须有原生兜底 --- ## 3. 三层分别适合什么 ## 3.1 原生模板适合 - 高频结果页 - 高频内容卡 - 游戏过程中的即时反馈页 - 必须流畅、必须可离线的页面 示例: - 最小顺序赛结算页 - 最小积分赛结算页 - 控制点原生内容卡 - 默认结束页 ## 3.2 原生有限 DSL 适合 - 区块顺序常变 - 字段组合常变 - 样式变化不至于重做到 H5 示例: - 结果页: - 先显示成绩还是先显示摘要 - 哪些统计项出现 - 操作区放几个按钮 - 内容页: - 是否显示图片 - 是否显示引用说明 - 是否显示附加说明区块 ## 3.3 H5 适合 - 品牌化结算页 - 长图文故事页 - 原生内容卡上的“查看详情”页 - 拍照上传任务 - 语音留言页 - 小游戏互动页 - 活动专题页 - 高自由度客户定制页 --- ## 4. 边界原则 ## 4.1 原生负责核心游戏体验 原生必须继续负责: - 地图 - GPS / 指北针 / 自动转图 - 打点逻辑 - HUD - 核心状态机 - 最小结果页 - 最小内容页 ## 4.2 H5 只负责增强体验 H5 不应该负责: - 打点是否成功 - 比赛是否结束 - 核心状态推进 - 实时地图交互 H5 只负责: - 内容展示 - 任务互动 - 品牌包装 - 富交互增强体验 ## 4.3 原生永远保底 无论 H5 是否接入,原生都必须保证: - 打点后至少能看到原生内容 - 结束后至少能看到原生结果页 - H5 打不开时,主流程不受影响 ## 4.4 不再尝试 H5 弹窗本体 真机验证后,当前项目已经明确: - 小程序 `web-view` 不适合作为“原生弹窗里的局部 H5 内容区” - 它更适合作为整页/全屏体验容器来使用 因此这条边界正式定为: - 原生内容卡负责即时弹窗体验 - H5 不直接顶替原生弹窗 - H5 只通过原生 CTA 进入详情页/任务页 --- ## 5. 推荐的数据流 建议统一做成: ```text 游戏状态 / 内容数据 / 结果数据 ↓ ViewModel ↓ Native Template / Native DSL / H5 ↓ 用户界面 ``` 这里最关键的是: - 数据模型稳定 - 展示方式可换 也就是: **先稳定 ViewModel,再让模板与承载方式变化。** 当前内容体验链已经调整成: ```text 控制点触发 ↓ 原生内容卡(template) ↓ CTA: 查看详情(可选) ↓ H5 详情页 / 互动任务页 ``` --- ## 6. ViewModel 的作用 ViewModel 是原生模板、原生 DSL、H5 都共用的中间层。 例如结果页: ```json { "type": "result-summary", "title": "比赛结束", "subtitle": "校园积分赛", "hero": { "label": "总分", "value": "120" }, "stats": [ { "key": "duration", "label": "用时", "value": "23:18" }, { "key": "distance", "label": "里程", "value": "3.2km" }, { "key": "controls", "label": "完成点", "value": "8/8" } ], "actions": [ { "key": "restart", "label": "再来一局" }, { "key": "close", "label": "返回地图" } ] } ``` 例如内容页: ```json { "type": "content-card", "title": "湖边步道", "body": "这里适合短暂停留观察周边地形。", "image": "", "cta": "继续" } ``` 这样以后无论: - 原生模板 - 原生 DSL - H5 都可以消费同一份结构化数据。 --- ## 7. 原生模板层建议 建议先做有限几个模板: ### 结果页模板 - `result-minimal` - `result-rich` ### 内容页模板 - `content-card-minimal` - `content-card-story` 模板负责: - 布局 - 区块顺序 - 基础动画与交互 模板不负责: - 业务逻辑 - 数据计算 --- ## 8. 原生有限 DSL 建议 不要做万能布局引擎,只做有限区块编排。 例如结果页: ```json { "templateType": "result-native-dsl", "sections": [ { "type": "hero", "field": "score" }, { "type": "stats-grid", "fields": ["duration", "distance", "controls"] }, { "type": "actions", "items": ["restart", "close"] } ] } ``` 例如内容页: ```json { "templateType": "content-native-dsl", "sections": [ { "type": "title" }, { "type": "body" }, { "type": "image" }, { "type": "actions", "items": ["continue", "openH5"] } ] } ``` 原则是: - 区块种类有限 - 顺序可配置 - 不支持无限自由布局 --- ## 9. H5 扩展层建议 H5 主要用于高自由度需求。 建议先只承接两类页面: ### 9.1 Content Experience Page 用于: - 打点后的定制内容页 - 富图文详情 - 拍照上传任务 - 语音留言 - 小游戏互动 ### 9.2 Result Experience Page 用于: - 定制结算页 - 成绩包装页 - 奖章 / 排名 / 分享页 但要注意: - H5 只是增强页 - 原生始终保留最小兜底 --- ## 10. 推荐优先级 不建议直接跳到 H5 大量实现。 推荐顺序: ### 第一步 先把原生模板层打稳: - 原生最小结果页 - 原生最小内容卡 ### 第二步 再做原生有限 DSL: - 支撑中等复杂的客户差异化需求 ### 第三步 最后再把 H5 扩展层接稳: - 处理真正高自由度场景 --- ## 11. 对当前项目的建议 结合当前项目现状,建议: ### 当前优先做 - 原生内容卡继续完善 - 原生结果页继续完善 - 先把 ViewModel 定稳 ### 中期做 - 原生结果页的有限 DSL - 原生内容页的有限 DSL ### 后期做 - H5 内容页 - H5 结果页 - Bridge 能力逐步扩充 --- ## 12. 一句话结论 最适合当前项目的长期方案不是单押 H5,也不是所有东西都原生写死,而是: **原生模板保底、原生有限 DSL 承担中度变化、H5 承担高定制内容。** 这三层结合起来,既能保证核心体验稳定,也能承接客户高频变化需求。