@hd-front-end/jsbridge-sdk 1.0.2 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -2
- package/dist/index.d.ts +201 -2
- package/dist/index.esm.js +444 -1
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +446 -0
- package/dist/index.js.map +1 -1
- package/dist/index.umd.js +446 -0
- package/dist/index.umd.js.map +1 -1
- package/docs/00-/351/241/271/347/233/256/346/246/202/350/247/210.md +282 -0
- package/docs/01-/346/236/266/346/236/204/350/256/276/350/256/241.md +623 -0
- package/docs/02-/346/212/200/346/234/257/345/256/236/347/216/260.md +867 -0
- package/docs/03-API/344/275/277/347/224/250/346/226/207/346/241/243.md +1104 -0
- package/docs/04-/346/265/213/350/257/225/346/226/271/346/241/210.md +360 -0
- package/docs/05-/350/277/201/347/247/273/346/214/207/345/215/227.md +181 -0
- package/docs/06-/346/236/266/346/236/204/345/233/276/351/233/206.md +738 -0
- package/docs/07-/346/226/260/346/241/245/346/216/245/346/226/271/346/263/225/346/211/251/345/261/225/350/257/264/346/230/216.md +139 -0
- package/docs/CODE_REVIEW.md +65 -0
- package/docs/EVALUATION.md +72 -0
- package/docs/README.md +258 -0
- package/docs//345/205/263/351/224/256/351/227/256/351/242/230/350/247/243/347/255/224.md +495 -0
- package/docs//346/226/207/346/241/243/346/225/264/345/220/210/350/257/264/346/230/216.md +265 -0
- package/docs//346/233/264/346/226/260/346/227/245/345/277/227.md +669 -0
- package/docs//347/224/237/344/272/247/347/272/247-/345/277/253/351/200/237/345/274/200/345/247/213-v2.md +673 -0
- package/docs//347/224/237/344/272/247/347/272/247-/346/236/266/346/236/204/350/256/276/350/256/241-v2.md +730 -0
- package/docs//350/256/276/350/256/241/347/220/206/345/277/265/350/257/264/346/230/216.md +438 -0
- package/package.json +3 -2
|
@@ -0,0 +1,738 @@
|
|
|
1
|
+
# JSBridge SDK 架构图集(生产级 v2)
|
|
2
|
+
|
|
3
|
+
> **当前版本**:生产级 v2 - 完整架构图集
|
|
4
|
+
|
|
5
|
+
## 1. 整体架构图
|
|
6
|
+
|
|
7
|
+
### 1.1 三层架构
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
┌─────────────────────────────────────────────────────┐
|
|
11
|
+
│ 子应用层 │
|
|
12
|
+
│ │
|
|
13
|
+
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐│
|
|
14
|
+
│ │ SOA 项目 │ │ MPA-Mini-V3 │ │ 其他项目 ││
|
|
15
|
+
│ └─────────────┘ └─────────────┘ └─────────────┘│
|
|
16
|
+
│ │
|
|
17
|
+
│ 使用方式(由子应用决定): │
|
|
18
|
+
│ 1. 直接使用 SDK API │
|
|
19
|
+
│ 2. 调用 JSBridge.log.info(...) │
|
|
20
|
+
│ 3. 可选封装适配层 │
|
|
21
|
+
└─────────────────────────────────────────────────────┘
|
|
22
|
+
↓
|
|
23
|
+
┌─────────────────────────────────────────────────────┐
|
|
24
|
+
│ SDK 层 │
|
|
25
|
+
│ │
|
|
26
|
+
│ ┌───────────────────────────────────────────────┐ │
|
|
27
|
+
│ │ 核心通信(Bridge) │ │
|
|
28
|
+
│ │ - 平台检测(Android/iOS/Unknown) │ │
|
|
29
|
+
│ │ - 平台特定初始化 │ │
|
|
30
|
+
│ │ - 统一的 call/register 接口 │ │
|
|
31
|
+
│ │ - 超时处理 │ │
|
|
32
|
+
│ └───────────────────────────────────────────────┘ │
|
|
33
|
+
│ ↓ │
|
|
34
|
+
│ ┌───────────────────────────────────────────────┐ │
|
|
35
|
+
│ │ API 层 │ │
|
|
36
|
+
│ │ ├── device - 扫码、振动、设备信息 │ │
|
|
37
|
+
│ │ ├── media - 选择媒体、上传、预览 │ │
|
|
38
|
+
│ │ ├── router - 标题、关闭、路由回调 │ │
|
|
39
|
+
│ │ ├── storage - 获取/设置存储 │ │
|
|
40
|
+
│ │ ├── system - 打电话、PDA 扫码 │ │
|
|
41
|
+
│ │ └── log - 日志上传 ← 新增 │ │
|
|
42
|
+
│ └───────────────────────────────────────────────┘ │
|
|
43
|
+
│ ↓ │
|
|
44
|
+
│ ┌───────────────────────────────────────────────┐ │
|
|
45
|
+
│ │ 监控层(Monitor) │ │
|
|
46
|
+
│ │ - 自动记录 API 调用性能 │ │
|
|
47
|
+
│ │ - 自动记录错误信息 │ │
|
|
48
|
+
│ │ - 定时通过 log API 上报 │ │
|
|
49
|
+
│ │ - 错误立即通过 log API 上报 │ │
|
|
50
|
+
│ └───────────────────────────────────────────────┘ │
|
|
51
|
+
│ ↓ │
|
|
52
|
+
│ ┌───────────────────────────────────────────────┐ │
|
|
53
|
+
│ │ Debug 层(Debug) │ │
|
|
54
|
+
│ │ - vconsole 集成(移动端调试) │ │
|
|
55
|
+
│ │ - 调用追踪(查看调用栈) │ │
|
|
56
|
+
│ │ - 日志记录(分级记录) │ │
|
|
57
|
+
│ └───────────────────────────────────────────────┘ │
|
|
58
|
+
└─────────────────────────────────────────────────────┘
|
|
59
|
+
↓
|
|
60
|
+
┌─────────────────────────────────────────────────────┐
|
|
61
|
+
│ 原生层 │
|
|
62
|
+
│ │
|
|
63
|
+
│ ┌───────────────────────────────────────────────┐ │
|
|
64
|
+
│ │ Android │ │
|
|
65
|
+
│ │ - InjectJavascript.init() 触发初始化 │ │
|
|
66
|
+
│ │ - LogUtil (SLF4J + Logback) │ │
|
|
67
|
+
│ │ - 写入日志文件到 logs 目录 │ │
|
|
68
|
+
│ └───────────────────────────────────────────────┘ │
|
|
69
|
+
│ │
|
|
70
|
+
│ ┌───────────────────────────────────────────────┐ │
|
|
71
|
+
│ │ iOS │ │
|
|
72
|
+
│ │ - iframe 触发初始化 │ │
|
|
73
|
+
│ │ - LogUtil (OSLog) │ │
|
|
74
|
+
│ │ - 写入日志文件 │ │
|
|
75
|
+
│ └───────────────────────────────────────────────┘ │
|
|
76
|
+
│ │
|
|
77
|
+
│ ┌───────────────────────────────────────────────┐ │
|
|
78
|
+
│ │ 统一日志管理 │ │
|
|
79
|
+
│ │ - 收集日志文件 │ │
|
|
80
|
+
│ │ - 压缩、加密 │ │
|
|
81
|
+
│ │ - 批量上传到服务器 │ │
|
|
82
|
+
│ └───────────────────────────────────────────────┘ │
|
|
83
|
+
└─────────────────────────────────────────────────────┘
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## 2. 核心流程图
|
|
87
|
+
|
|
88
|
+
### 2.1 初始化流程
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
开始
|
|
92
|
+
↓
|
|
93
|
+
平台检测
|
|
94
|
+
├─ Android → 设置 Platform.Android
|
|
95
|
+
├─ iOS → 设置 Platform.iOS
|
|
96
|
+
└─ 其他 → 设置 Platform.Unknown
|
|
97
|
+
↓
|
|
98
|
+
检查是否在 App 中?
|
|
99
|
+
├─ 否 → 返回 false(结束)
|
|
100
|
+
└─ 是 ↓
|
|
101
|
+
配置 Debug
|
|
102
|
+
├─ enabled? → 启用 debug
|
|
103
|
+
└─ useVConsole? → 加载 vconsole
|
|
104
|
+
↓
|
|
105
|
+
配置 Monitor
|
|
106
|
+
├─ enabled? → 启用监控
|
|
107
|
+
└─ autoReport? → 启动定时上报
|
|
108
|
+
↓
|
|
109
|
+
初始化 Bridge
|
|
110
|
+
├─ Android → InjectJavascript.init()
|
|
111
|
+
└─ iOS → 创建 iframe 触发
|
|
112
|
+
↓
|
|
113
|
+
等待 Bridge 注入
|
|
114
|
+
├─ 成功 → isInitialized = true
|
|
115
|
+
└─ 超时(10s) → 抛出异常
|
|
116
|
+
↓
|
|
117
|
+
记录初始化日志
|
|
118
|
+
└─ JSBridge.log.info('初始化成功')
|
|
119
|
+
↓
|
|
120
|
+
返回 true(成功)
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### 2.2 API 调用流程
|
|
124
|
+
|
|
125
|
+
```
|
|
126
|
+
子应用调用 JSBridge.scan()
|
|
127
|
+
↓
|
|
128
|
+
API 层(device.ts)
|
|
129
|
+
↓
|
|
130
|
+
Monitor 记录开始
|
|
131
|
+
└─ recordStart(api, platform, params)
|
|
132
|
+
↓
|
|
133
|
+
Debug 追踪
|
|
134
|
+
└─ trace(api, params)
|
|
135
|
+
↓
|
|
136
|
+
Bridge 调用
|
|
137
|
+
└─ bridge.call('scan', data)
|
|
138
|
+
↓
|
|
139
|
+
原生处理
|
|
140
|
+
└─ 扫码、选择媒体等
|
|
141
|
+
↓
|
|
142
|
+
原生返回结果
|
|
143
|
+
↓
|
|
144
|
+
Monitor 记录结束
|
|
145
|
+
└─ recordEnd(record, success, result, error)
|
|
146
|
+
↓
|
|
147
|
+
Debug 记录日志
|
|
148
|
+
└─ debug.log('info', message)
|
|
149
|
+
↓
|
|
150
|
+
返回给子应用
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### 2.3 监控上报流程
|
|
154
|
+
|
|
155
|
+
```
|
|
156
|
+
SDK API 调用
|
|
157
|
+
↓
|
|
158
|
+
Monitor 自动记录
|
|
159
|
+
├─ 记录性能数据
|
|
160
|
+
├─ 记录成功/失败
|
|
161
|
+
└─ 缓存到 records[]
|
|
162
|
+
↓
|
|
163
|
+
定时任务触发(1 分钟)
|
|
164
|
+
↓
|
|
165
|
+
Monitor.report()
|
|
166
|
+
├─ 汇总 records 和 stats
|
|
167
|
+
└─ 构造 JSON 数据
|
|
168
|
+
↓
|
|
169
|
+
调用 bridge.call('log', {...})
|
|
170
|
+
├─ tag: 'JSBridge-Monitor'
|
|
171
|
+
├─ level: 'INFO'
|
|
172
|
+
└─ message: '[MONITOR] {...}'
|
|
173
|
+
↓
|
|
174
|
+
原生 LogUtil 处理
|
|
175
|
+
├─ 写入日志文件
|
|
176
|
+
└─ 标记为待上传
|
|
177
|
+
↓
|
|
178
|
+
原生统一上传
|
|
179
|
+
├─ 压缩日志文件
|
|
180
|
+
├─ 加密(可选)
|
|
181
|
+
└─ 批量上传到服务器
|
|
182
|
+
↓
|
|
183
|
+
服务器接收和分析
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### 2.4 日志上传流程
|
|
187
|
+
|
|
188
|
+
```
|
|
189
|
+
子应用调用 JSBridge.log.info('用户行为', 'UserBehavior')
|
|
190
|
+
↓
|
|
191
|
+
Log API 层(log.ts)
|
|
192
|
+
├─ 构造 LogRequest
|
|
193
|
+
└─ tag: 'UserBehavior'
|
|
194
|
+
└─ level: 'INFO'
|
|
195
|
+
└─ message: '用户行为'
|
|
196
|
+
↓
|
|
197
|
+
Monitor 记录(可选)
|
|
198
|
+
└─ recordStart('log', platform)
|
|
199
|
+
↓
|
|
200
|
+
调用 bridge.call('log', {...})
|
|
201
|
+
↓
|
|
202
|
+
原生 log handler
|
|
203
|
+
├─ 解析 LogRequest
|
|
204
|
+
└─ 根据 level 调用 LogUtil
|
|
205
|
+
↓
|
|
206
|
+
LogUtil 写入日志文件
|
|
207
|
+
├─ Android: SLF4J + Logback
|
|
208
|
+
└─ iOS: OSLog
|
|
209
|
+
↓
|
|
210
|
+
Monitor 记录结束(可选)
|
|
211
|
+
└─ recordEnd(record, success)
|
|
212
|
+
↓
|
|
213
|
+
原生统一上传到服务器
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
### 2.5 错误上报流程(立即)
|
|
217
|
+
|
|
218
|
+
```
|
|
219
|
+
API 调用失败
|
|
220
|
+
↓
|
|
221
|
+
Bridge 捕获错误
|
|
222
|
+
↓
|
|
223
|
+
Monitor 记录失败
|
|
224
|
+
└─ recordEnd(record, false, undefined, error)
|
|
225
|
+
↓
|
|
226
|
+
Monitor 立即上报错误
|
|
227
|
+
└─ reportError(api, error, detail)
|
|
228
|
+
↓
|
|
229
|
+
调用 bridge.call('log', {...})
|
|
230
|
+
├─ tag: 'JSBridge-Monitor'
|
|
231
|
+
├─ level: 'ERROR' ← 错误级别
|
|
232
|
+
└─ message: '[ERROR] {...}'
|
|
233
|
+
↓
|
|
234
|
+
原生 LogUtil 写入(ERROR 级别)
|
|
235
|
+
↓
|
|
236
|
+
原生可以立即上传 ERROR 日志
|
|
237
|
+
└─ 不等待定时任务,立即处理
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
## 3. 模块交互图
|
|
241
|
+
|
|
242
|
+
### 3.1 模块依赖关系
|
|
243
|
+
|
|
244
|
+
```
|
|
245
|
+
┌─────────────┐
|
|
246
|
+
│ index.ts │ 统一导出
|
|
247
|
+
└──────┬──────┘
|
|
248
|
+
│
|
|
249
|
+
├─────────────────────────────┐
|
|
250
|
+
↓ ↓
|
|
251
|
+
┌─────────────┐ ┌─────────────┐
|
|
252
|
+
│ Bridge.ts │ │ Monitor.ts │
|
|
253
|
+
│ 核心通信 │◄─────────────│ 监控 │
|
|
254
|
+
└──────┬──────┘ └──────┬──────┘
|
|
255
|
+
│ │
|
|
256
|
+
│ ↓
|
|
257
|
+
│ ┌─────────────┐
|
|
258
|
+
│ │ Debug.ts │
|
|
259
|
+
│ │ 调试 │
|
|
260
|
+
│ └─────────────┘
|
|
261
|
+
│
|
|
262
|
+
├────────────┬────────────┬────────────┐
|
|
263
|
+
↓ ↓ ↓ ↓
|
|
264
|
+
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
|
|
265
|
+
│device.ts │ │ media.ts │ │router.ts │ │ log.ts │
|
|
266
|
+
│设备 API │ │媒体 API │ │路由 API │ │日志 API │
|
|
267
|
+
└──────────┘ └──────────┘ └──────────┘ └──────────┘
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
### 3.2 调用链路图
|
|
271
|
+
|
|
272
|
+
```
|
|
273
|
+
子应用
|
|
274
|
+
↓
|
|
275
|
+
JSBridge.scan()
|
|
276
|
+
↓
|
|
277
|
+
device.scan()
|
|
278
|
+
↓
|
|
279
|
+
┌─────────────────────────────────┐
|
|
280
|
+
│ Monitor.recordStart() │ → 记录开始
|
|
281
|
+
└─────────────────────────────────┘
|
|
282
|
+
↓
|
|
283
|
+
┌─────────────────────────────────┐
|
|
284
|
+
│ Debug.trace() │ → 追踪调用
|
|
285
|
+
└─────────────────────────────────┘
|
|
286
|
+
↓
|
|
287
|
+
bridge.call('scan', data)
|
|
288
|
+
↓
|
|
289
|
+
WKWebViewJavascriptBridge
|
|
290
|
+
↓
|
|
291
|
+
原生处理
|
|
292
|
+
↓
|
|
293
|
+
返回结果
|
|
294
|
+
↓
|
|
295
|
+
┌─────────────────────────────────┐
|
|
296
|
+
│ Monitor.recordEnd() │ → 记录结束
|
|
297
|
+
└─────────────────────────────────┘
|
|
298
|
+
↓
|
|
299
|
+
┌─────────────────────────────────┐
|
|
300
|
+
│ Debug.log() │ → 记录日志
|
|
301
|
+
└─────────────────────────────────┘
|
|
302
|
+
↓
|
|
303
|
+
返回给子应用
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
## 4. 日志管理架构
|
|
307
|
+
|
|
308
|
+
### 4.1 统一日志流
|
|
309
|
+
|
|
310
|
+
```
|
|
311
|
+
┌─────────────────────────────────────┐
|
|
312
|
+
│ 日志来源 │
|
|
313
|
+
│ │
|
|
314
|
+
│ ┌─────────────┐ ┌─────────────┐ │
|
|
315
|
+
│ │ SDK 监控日志 │ │子应用业务日志│ │
|
|
316
|
+
│ │ │ │ │ │
|
|
317
|
+
│ │- 性能数据 │ │- 用户行为 │ │
|
|
318
|
+
│ │- 调用统计 │ │- 业务错误 │ │
|
|
319
|
+
│ │- 错误信息 │ │- 性能数据 │ │
|
|
320
|
+
│ └──────┬──────┘ └──────┬──────┘ │
|
|
321
|
+
│ │ │ │
|
|
322
|
+
│ └────────┬───────┘ │
|
|
323
|
+
└──────────────────┼─────────────────┘
|
|
324
|
+
↓
|
|
325
|
+
┌─────────────────┐
|
|
326
|
+
│ log API │
|
|
327
|
+
│ bridge.call() │
|
|
328
|
+
└────────┬────────┘
|
|
329
|
+
↓
|
|
330
|
+
┌─────────────────────────────────────┐
|
|
331
|
+
│ 原生日志系统 │
|
|
332
|
+
│ │
|
|
333
|
+
│ ┌─────────────┐ ┌─────────────┐ │
|
|
334
|
+
│ │ Android │ │ iOS │ │
|
|
335
|
+
│ │ │ │ │ │
|
|
336
|
+
│ │ LogUtil │ │ LogUtil │ │
|
|
337
|
+
│ │ (SLF4J) │ │ (OSLog) │ │
|
|
338
|
+
│ └──────┬──────┘ └──────┬──────┘ │
|
|
339
|
+
│ │ │ │
|
|
340
|
+
│ └────────┬───────┘ │
|
|
341
|
+
│ ↓ │
|
|
342
|
+
│ ┌─────────────────┐ │
|
|
343
|
+
│ │ 日志文件 │ │
|
|
344
|
+
│ │ logs/*.log │ │
|
|
345
|
+
│ └────────┬────────┘ │
|
|
346
|
+
│ ↓ │
|
|
347
|
+
│ ┌─────────────────┐ │
|
|
348
|
+
│ │ 统一上传 │ │
|
|
349
|
+
│ │ - 压缩 │ │
|
|
350
|
+
│ │ - 加密(可选) │ │
|
|
351
|
+
│ │ - 批量上传 │ │
|
|
352
|
+
│ └────────┬────────┘ │
|
|
353
|
+
└──────────────────┼─────────────────┘
|
|
354
|
+
↓
|
|
355
|
+
┌─────────────────┐
|
|
356
|
+
│ 服务器 │
|
|
357
|
+
│ - 接收日志 │
|
|
358
|
+
│ - 分析数据 │
|
|
359
|
+
│ - 监控告警 │
|
|
360
|
+
└─────────────────┘
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
### 4.2 日志分类
|
|
364
|
+
|
|
365
|
+
```
|
|
366
|
+
日志类型
|
|
367
|
+
├── SDK 监控日志
|
|
368
|
+
│ ├── 性能数据
|
|
369
|
+
│ │ ├── API 调用次数
|
|
370
|
+
│ │ ├── 成功/失败次数
|
|
371
|
+
│ │ └── 平均/最大/最小耗时
|
|
372
|
+
│ │
|
|
373
|
+
│ ├── 调用记录
|
|
374
|
+
│ │ ├── api 名称
|
|
375
|
+
│ │ ├── 平台
|
|
376
|
+
│ │ ├── 耗时
|
|
377
|
+
│ │ └── 成功/失败
|
|
378
|
+
│ │
|
|
379
|
+
│ └── 错误信息
|
|
380
|
+
│ ├── 错误 API
|
|
381
|
+
│ ├── 错误消息
|
|
382
|
+
│ └── 错误详情
|
|
383
|
+
│
|
|
384
|
+
└── 子应用业务日志
|
|
385
|
+
├── 用户行为
|
|
386
|
+
│ ├── 页面访问
|
|
387
|
+
│ ├── 按钮点击
|
|
388
|
+
│ └── 操作完成
|
|
389
|
+
│
|
|
390
|
+
├── 业务错误
|
|
391
|
+
│ ├── 订单失败
|
|
392
|
+
│ ├── 支付失败
|
|
393
|
+
│ └── 其他错误
|
|
394
|
+
│
|
|
395
|
+
├── 性能数据
|
|
396
|
+
│ ├── 页面加载
|
|
397
|
+
│ ├── API 响应
|
|
398
|
+
│ └── 资源加载
|
|
399
|
+
│
|
|
400
|
+
└── API 调用
|
|
401
|
+
├── 请求开始
|
|
402
|
+
├── 请求成功
|
|
403
|
+
└── 请求失败
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
## 5. 平台兼容架构
|
|
407
|
+
|
|
408
|
+
### 5.1 双平台统一接口
|
|
409
|
+
|
|
410
|
+
```
|
|
411
|
+
子应用调用
|
|
412
|
+
↓
|
|
413
|
+
JSBridge.scan() ← 统一接口
|
|
414
|
+
↓
|
|
415
|
+
┌─────────────────────────────────┐
|
|
416
|
+
│ Bridge 层 │
|
|
417
|
+
│ │
|
|
418
|
+
│ 检测平台:getPlatform() │
|
|
419
|
+
│ ├─ Android │
|
|
420
|
+
│ └─ iOS │
|
|
421
|
+
│ │
|
|
422
|
+
│ 平台特定初始化 │
|
|
423
|
+
│ ├─ Android: InjectJavascript│
|
|
424
|
+
│ └─ iOS: iframe 触发 │
|
|
425
|
+
│ │
|
|
426
|
+
│ 统一调用接口 │
|
|
427
|
+
│ └─ callHandler(method, data)│
|
|
428
|
+
└─────────────────────────────────┘
|
|
429
|
+
↓
|
|
430
|
+
原生处理(平台特定)
|
|
431
|
+
├─ Android: Java/Kotlin 实现
|
|
432
|
+
└─ iOS: Swift/ObjC 实现
|
|
433
|
+
↓
|
|
434
|
+
返回统一格式
|
|
435
|
+
```
|
|
436
|
+
|
|
437
|
+
## 6. 监控数据流
|
|
438
|
+
|
|
439
|
+
### 6.1 监控数据收集
|
|
440
|
+
|
|
441
|
+
```
|
|
442
|
+
API 调用
|
|
443
|
+
↓
|
|
444
|
+
自动记录
|
|
445
|
+
├─ api: 'scan'
|
|
446
|
+
├─ platform: 'android'
|
|
447
|
+
├─ startTime: 1706859600000
|
|
448
|
+
├─ duration: 1234
|
|
449
|
+
├─ success: true
|
|
450
|
+
└─ error: null
|
|
451
|
+
↓
|
|
452
|
+
缓存到内存
|
|
453
|
+
└─ records[] (最多 100 条)
|
|
454
|
+
↓
|
|
455
|
+
定时任务(1 分钟)
|
|
456
|
+
↓
|
|
457
|
+
汇总统计
|
|
458
|
+
├─ totalCalls
|
|
459
|
+
├─ successCalls
|
|
460
|
+
├─ failedCalls
|
|
461
|
+
├─ avgDuration
|
|
462
|
+
├─ maxDuration
|
|
463
|
+
└─ minDuration
|
|
464
|
+
↓
|
|
465
|
+
通过 log API 上报
|
|
466
|
+
└─ bridge.call('log', {
|
|
467
|
+
tag: 'JSBridge-Monitor',
|
|
468
|
+
level: 'INFO',
|
|
469
|
+
message: '[MONITOR] {...}'
|
|
470
|
+
})
|
|
471
|
+
↓
|
|
472
|
+
原生写入日志文件
|
|
473
|
+
↓
|
|
474
|
+
原生上传到服务器
|
|
475
|
+
```
|
|
476
|
+
|
|
477
|
+
### 6.2 错误上报(立即)
|
|
478
|
+
|
|
479
|
+
```
|
|
480
|
+
API 调用失败
|
|
481
|
+
↓
|
|
482
|
+
捕获错误
|
|
483
|
+
↓
|
|
484
|
+
Monitor.reportError()
|
|
485
|
+
↓
|
|
486
|
+
立即调用 log API
|
|
487
|
+
└─ bridge.call('log', {
|
|
488
|
+
tag: 'JSBridge-Monitor',
|
|
489
|
+
level: 'ERROR',
|
|
490
|
+
message: '[ERROR] {...}'
|
|
491
|
+
})
|
|
492
|
+
↓
|
|
493
|
+
原生写入日志文件(ERROR 级别)
|
|
494
|
+
↓
|
|
495
|
+
原生立即上传
|
|
496
|
+
└─ 不等待定时任务
|
|
497
|
+
```
|
|
498
|
+
|
|
499
|
+
## 7. Debug 模式架构
|
|
500
|
+
|
|
501
|
+
### 7.1 Debug 流程
|
|
502
|
+
|
|
503
|
+
```
|
|
504
|
+
开发环境
|
|
505
|
+
↓
|
|
506
|
+
配置 debug: { enabled: true, useVConsole: true }
|
|
507
|
+
↓
|
|
508
|
+
初始化时
|
|
509
|
+
├─ 动态加载 vconsole
|
|
510
|
+
└─ 创建 Debug 实例
|
|
511
|
+
↓
|
|
512
|
+
API 调用时
|
|
513
|
+
├─ Debug.trace() → 显示调用栈
|
|
514
|
+
└─ Debug.log() → 记录到 logs[]
|
|
515
|
+
↓
|
|
516
|
+
vconsole 显示
|
|
517
|
+
├─ console.log
|
|
518
|
+
├─ console.error
|
|
519
|
+
└─ 调用栈信息
|
|
520
|
+
↓
|
|
521
|
+
可以查看
|
|
522
|
+
├─ Debug.getLogs('error')
|
|
523
|
+
└─ Debug.getLogs(undefined, 10)
|
|
524
|
+
```
|
|
525
|
+
|
|
526
|
+
## 8. 代码组织架构
|
|
527
|
+
|
|
528
|
+
### 8.1 目录结构
|
|
529
|
+
|
|
530
|
+
```
|
|
531
|
+
src/
|
|
532
|
+
├── core/
|
|
533
|
+
│ └── Bridge.ts
|
|
534
|
+
│ ├─ class Bridge
|
|
535
|
+
│ ├─ detectPlatform()
|
|
536
|
+
│ ├─ init()
|
|
537
|
+
│ ├─ call()
|
|
538
|
+
│ └─ register()
|
|
539
|
+
│
|
|
540
|
+
├── monitor/
|
|
541
|
+
│ └── Monitor.ts
|
|
542
|
+
│ ├─ class Monitor
|
|
543
|
+
│ ├─ recordStart()
|
|
544
|
+
│ ├─ recordEnd()
|
|
545
|
+
│ ├─ report() ← 通过 log
|
|
546
|
+
│ └─ reportError() ← 通过 log
|
|
547
|
+
│
|
|
548
|
+
├── debug/
|
|
549
|
+
│ └── Debug.ts
|
|
550
|
+
│ ├─ class Debug
|
|
551
|
+
│ ├─ initVConsole()
|
|
552
|
+
│ ├─ log()
|
|
553
|
+
│ └─ trace()
|
|
554
|
+
│
|
|
555
|
+
├── api/
|
|
556
|
+
│ ├── device.ts
|
|
557
|
+
│ │ ├─ scan()
|
|
558
|
+
│ │ ├─ vibrate()
|
|
559
|
+
│ │ ├─ getDeviceInfo()
|
|
560
|
+
│ │ └─ getNetworkType()
|
|
561
|
+
│ │
|
|
562
|
+
│ ├── media.ts
|
|
563
|
+
│ │ ├─ chooseMedia()
|
|
564
|
+
│ │ ├─ uploadFile()
|
|
565
|
+
│ │ ├─ previewImage()
|
|
566
|
+
│ │ └─ getImageInfo()
|
|
567
|
+
│ │
|
|
568
|
+
│ ├── log.ts ← 新增
|
|
569
|
+
│ │ ├─ writeLog()
|
|
570
|
+
│ │ └─ log { debug, info, warn, error }
|
|
571
|
+
│ │
|
|
572
|
+
│ └── ...
|
|
573
|
+
│
|
|
574
|
+
├── types/
|
|
575
|
+
│ └── index.ts
|
|
576
|
+
│ ├─ interface ScanOptions
|
|
577
|
+
│ ├─ interface ScanResult
|
|
578
|
+
│ ├─ interface LogRequest ← 新增
|
|
579
|
+
│ └─ ...
|
|
580
|
+
│
|
|
581
|
+
└── index.ts
|
|
582
|
+
├─ init()
|
|
583
|
+
├─ JSBridge { scan, log, ... }
|
|
584
|
+
├─ Monitor { getStats, report, ... }
|
|
585
|
+
└─ Debug { trace, getLogs, ... }
|
|
586
|
+
```
|
|
587
|
+
|
|
588
|
+
## 9. 数据格式图
|
|
589
|
+
|
|
590
|
+
### 9.1 监控数据格式
|
|
591
|
+
|
|
592
|
+
```json
|
|
593
|
+
{
|
|
594
|
+
"records": [
|
|
595
|
+
{
|
|
596
|
+
"api": "scan",
|
|
597
|
+
"platform": "android",
|
|
598
|
+
"startTime": 1706859600000,
|
|
599
|
+
"endTime": 1706859601234,
|
|
600
|
+
"duration": 1234,
|
|
601
|
+
"success": true,
|
|
602
|
+
"params": { "scanType": ["qrCode"] },
|
|
603
|
+
"result": { "resp_code": 1000, "resp_result": "xxx" }
|
|
604
|
+
}
|
|
605
|
+
],
|
|
606
|
+
"stats": [
|
|
607
|
+
{
|
|
608
|
+
"api": "scan",
|
|
609
|
+
"totalCalls": 150,
|
|
610
|
+
"successCalls": 145,
|
|
611
|
+
"failedCalls": 5,
|
|
612
|
+
"avgDuration": 1234,
|
|
613
|
+
"maxDuration": 3000,
|
|
614
|
+
"minDuration": 500
|
|
615
|
+
}
|
|
616
|
+
],
|
|
617
|
+
"timestamp": 1706859601234
|
|
618
|
+
}
|
|
619
|
+
```
|
|
620
|
+
|
|
621
|
+
### 9.2 日志数据格式
|
|
622
|
+
|
|
623
|
+
```json
|
|
624
|
+
{
|
|
625
|
+
"tag": "UserBehavior",
|
|
626
|
+
"level": "INFO",
|
|
627
|
+
"message": "用户点击了购买按钮"
|
|
628
|
+
}
|
|
629
|
+
```
|
|
630
|
+
|
|
631
|
+
### 9.3 错误数据格式
|
|
632
|
+
|
|
633
|
+
```json
|
|
634
|
+
{
|
|
635
|
+
"type": "error",
|
|
636
|
+
"api": "scan",
|
|
637
|
+
"error": "扫码失败",
|
|
638
|
+
"detail": {
|
|
639
|
+
"errorCode": "E001",
|
|
640
|
+
"reason": "相机权限被拒绝"
|
|
641
|
+
},
|
|
642
|
+
"platform": "android",
|
|
643
|
+
"timestamp": 1706859601234
|
|
644
|
+
}
|
|
645
|
+
```
|
|
646
|
+
|
|
647
|
+
## 10. 扩展架构
|
|
648
|
+
|
|
649
|
+
### 10.1 新增 API 流程
|
|
650
|
+
|
|
651
|
+
```
|
|
652
|
+
1. 在 api/ 目录创建新文件
|
|
653
|
+
└─ src/api/newFeature.ts
|
|
654
|
+
|
|
655
|
+
2. 实现 API 函数
|
|
656
|
+
└─ export async function newFeature(options) {...}
|
|
657
|
+
|
|
658
|
+
3. 在 types/index.ts 添加类型
|
|
659
|
+
└─ export interface NewFeatureOptions {...}
|
|
660
|
+
|
|
661
|
+
4. 在 index.ts 导出
|
|
662
|
+
└─ export const JSBridge = { ..., newFeature }
|
|
663
|
+
|
|
664
|
+
5. 原生端实现
|
|
665
|
+
└─ webView.registerHandler("newFeature") {...}
|
|
666
|
+
```
|
|
667
|
+
|
|
668
|
+
### 10.2 新增监控指标
|
|
669
|
+
|
|
670
|
+
```
|
|
671
|
+
1. 在 Monitor.ts 添加新指标
|
|
672
|
+
└─ interface PerformanceStats { ..., newMetric }
|
|
673
|
+
|
|
674
|
+
2. 在 updateStats() 中计算
|
|
675
|
+
└─ stats.newMetric = calculate(...)
|
|
676
|
+
|
|
677
|
+
3. 在 report() 中上报
|
|
678
|
+
└─ 自动包含在 JSON 中
|
|
679
|
+
```
|
|
680
|
+
|
|
681
|
+
## 11. 部署架构
|
|
682
|
+
|
|
683
|
+
### 11.1 npm 发布流程
|
|
684
|
+
|
|
685
|
+
```
|
|
686
|
+
开发
|
|
687
|
+
↓
|
|
688
|
+
构建
|
|
689
|
+
├─ rollup -c
|
|
690
|
+
└─ 生成 dist/
|
|
691
|
+
↓
|
|
692
|
+
测试
|
|
693
|
+
├─ npm test
|
|
694
|
+
└─ 手动测试
|
|
695
|
+
↓
|
|
696
|
+
发布
|
|
697
|
+
├─ npm version patch/minor/major
|
|
698
|
+
└─ npm publish
|
|
699
|
+
↓
|
|
700
|
+
子应用更新
|
|
701
|
+
└─ npm install @hd-front-end/jsbridge-sdk@latest
|
|
702
|
+
```
|
|
703
|
+
|
|
704
|
+
### 11.2 子应用集成流程
|
|
705
|
+
|
|
706
|
+
```
|
|
707
|
+
子应用
|
|
708
|
+
↓
|
|
709
|
+
安装 SDK
|
|
710
|
+
└─ npm install @hd-front-end/jsbridge-sdk
|
|
711
|
+
↓
|
|
712
|
+
修改代码
|
|
713
|
+
├─ 修改 App.vue 初始化
|
|
714
|
+
├─ 修改业务组件调用
|
|
715
|
+
└─ 添加日志记录
|
|
716
|
+
↓
|
|
717
|
+
测试验证
|
|
718
|
+
├─ 功能测试
|
|
719
|
+
├─ 日志测试
|
|
720
|
+
└─ 平台测试
|
|
721
|
+
↓
|
|
722
|
+
上线
|
|
723
|
+
└─ 发布到生产环境
|
|
724
|
+
```
|
|
725
|
+
|
|
726
|
+
## 12. 文档导航
|
|
727
|
+
|
|
728
|
+
- **[00-项目概览.md](./00-项目概览.md)** - 项目概述
|
|
729
|
+
- **[01-架构设计.md](./01-架构设计.md)** - 架构设计
|
|
730
|
+
- **[02-技术实现.md](./02-技术实现.md)** - 技术实现
|
|
731
|
+
- **[03-API使用文档.md](./03-API使用文档.md)** - API 文档
|
|
732
|
+
- **[04-测试方案.md](./04-测试方案.md)** - 测试方案
|
|
733
|
+
- **[05-迁移指南.md](./05-迁移指南.md)** - 迁移指南
|
|
734
|
+
|
|
735
|
+
---
|
|
736
|
+
|
|
737
|
+
**完整的架构图集,清晰易懂** 🎯
|
|
738
|
+
|