# 混合体验架构方案
> 文档版本：v1.0
> 最后更新：2026-04-02 08:28:05


本文档用于说明当前项目在 **结果页、文创内容页、客户定制体验页** 上的长期承载方案。

核心结论：

**不做“原生还是 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 承担高定制内容。**

这三层结合起来，既能保证核心体验稳定，也能承接客户高频变化需求。

---

## 13. 当前运行时分层

结合目前已经落地的实现，当前项目的运行时分工已经比较明确：

### 13.1 游戏中途内容

- 即时弹出的内容：原生内容卡
- 内容卡模板：原生模板系统
- 内容卡上的 CTA：再进入 H5 详情页或互动任务页

也就是：

```text
控制点触发
  ↓
原生内容卡
  ↓
查看详情 / 开始互动
  ↓
H5 详情页或任务页
```

### 13.2 结果页

- 原生结果页始终保底
- H5 结果页只做增强版
- H5 打不开时，结果仍然可在原生层完整查看

### 13.3 H5 壳子

经过真机验证，`web-view` 不再承担局部弹窗职责。

当前应统一按：

- 内容详情页：整页 H5
- 互动任务页：整页 H5
- 定制结果页：整页 H5

来理解它。

---

## 14. 当前主文档与归档关系

当前建议优先阅读：

- [hybrid-experience-architecture.md](D:/dev/cmr-mini/doc/experience/混合体验架构方案.md)
- [native-h5-bridge-spec.md](D:/dev/cmr-mini/doc/experience/原生与H5桥接规范.md)

已归档但仍可回看的阶段性方案：

- [content-experience-layer-proposal.md](/D:/dev/cmr-mini/doc/archive/experience/内容体验层方案.md)
- [result-scene-proposal.md](/D:/dev/cmr-mini/doc/archive/experience/结果页方案.md)
- [experience-shell-proposal.md](/D:/dev/cmr-mini/doc/archive/experience/体验壳子方案.md)
- [h5-experience-integration-proposal.md](/D:/dev/cmr-mini/doc/archive/experience/H5体验接入方案.md)



