Files
cmr-mini/doc/hybrid-experience-architecture.md

454 lines
7.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 混合体验架构方案
本文档用于说明当前项目在 **结果页、文创内容页、客户定制体验页** 上的长期承载方案。
核心结论:
**不做“原生还是 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 承担高定制内容。**
这三层结合起来,既能保证核心体验稳定,也能承接客户高频变化需求。