@hd-front-end/jsbridge-sdk 1.0.1 → 1.0.3

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.
Files changed (26) hide show
  1. package/README.md +4 -2
  2. package/dist/index.d.ts +204 -2
  3. package/dist/index.esm.js +556 -9
  4. package/dist/index.esm.js.map +1 -1
  5. package/dist/index.js +558 -8
  6. package/dist/index.js.map +1 -1
  7. package/dist/index.umd.js +560 -12
  8. package/dist/index.umd.js.map +1 -1
  9. package/docs/00-/351/241/271/347/233/256/346/246/202/350/247/210.md +282 -0
  10. package/docs/01-/346/236/266/346/236/204/350/256/276/350/256/241.md +623 -0
  11. package/docs/02-/346/212/200/346/234/257/345/256/236/347/216/260.md +867 -0
  12. package/docs/03-API/344/275/277/347/224/250/346/226/207/346/241/243.md +1104 -0
  13. package/docs/04-/346/265/213/350/257/225/346/226/271/346/241/210.md +360 -0
  14. package/docs/05-/350/277/201/347/247/273/346/214/207/345/215/227.md +181 -0
  15. package/docs/06-/346/236/266/346/236/204/345/233/276/351/233/206.md +738 -0
  16. 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
  17. package/docs/CODE_REVIEW.md +65 -0
  18. package/docs/EVALUATION.md +72 -0
  19. package/docs/README.md +258 -0
  20. package/docs//345/205/263/351/224/256/351/227/256/351/242/230/350/247/243/347/255/224.md +495 -0
  21. package/docs//346/226/207/346/241/243/346/225/264/345/220/210/350/257/264/346/230/216.md +265 -0
  22. package/docs//346/233/264/346/226/260/346/227/245/345/277/227.md +669 -0
  23. 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
  24. 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
  25. package/docs//350/256/276/350/256/241/347/220/206/345/277/265/350/257/264/346/230/216.md +438 -0
  26. package/package.json +3 -2
@@ -0,0 +1,623 @@
1
+ # JSBridge SDK 架构设计(生产级 v2)
2
+
3
+ > **架构设计思路和接口定义(不含完整代码)**
4
+
5
+ ## 1. 设计目标
6
+
7
+ 设计一个**生产可用**的 JSBridge SDK,实现 H5 与原生应用的高效通信。
8
+
9
+ ### 核心原则
10
+
11
+ - **职责单一**:SDK 聚焦于 bridge API
12
+ - **统一日志**:监控和业务日志都通过原生 log
13
+ - **双平台兼容**:自动兼容 Android 和 iOS
14
+ - **稳定可观测**:完善的错误处理和监控
15
+
16
+ ### 两个目的
17
+
18
+ 1. ✅ **监控 SDK 稳定性** - SDK 自动记录并上报
19
+ 2. ✅ **提供日志能力** - 子应用可上传日志
20
+
21
+ ## 2. 整体架构
22
+
23
+ ### 2.1 三层架构
24
+
25
+ ```
26
+ ┌─────────────────────────────────────┐
27
+ │ 子应用层 │
28
+ │ - 直接使用 SDK API │
29
+ │ - 调用 JSBridge.log.info(...) │
30
+ │ - 可选封装适配层(自己决定) │
31
+ └─────────────────────────────────────┘
32
+
33
+ ┌─────────────────────────────────────┐
34
+ │ SDK 层 │
35
+ │ │
36
+ │ ┌─────────────────────────────┐ │
37
+ │ │ 核心通信(Bridge) │ │
38
+ │ │ - 平台检测 │ │
39
+ │ │ - Android/iOS 兼容 │ │
40
+ │ │ - 超时处理 │ │
41
+ │ └─────────────────────────────┘ │
42
+ │ │
43
+ │ ┌─────────────────────────────┐ │
44
+ │ │ API 层 │ │
45
+ │ │ - device/media/router │ │
46
+ │ │ - storage/system │ │
47
+ │ │ - log ← 新增 │ │
48
+ │ └─────────────────────────────┘ │
49
+ │ │
50
+ │ ┌─────────────────────────────┐ │
51
+ │ │ 监控层(Monitor) │ │
52
+ │ │ - 性能监控 │ │
53
+ │ │ - 通过 log 上报 ← v2 │ │
54
+ │ └─────────────────────────────┘ │
55
+ │ │
56
+ │ ┌─────────────────────────────┐ │
57
+ │ │ Debug 层 │ │
58
+ │ │ - vconsole 集成 │ │
59
+ │ │ - 调用追踪 │ │
60
+ │ └─────────────────────────────┘ │
61
+ └─────────────────────────────────────┘
62
+
63
+ ┌─────────────────────────────────────┐
64
+ │ 原生层 │
65
+ │ - Android: InjectJavascript │
66
+ │ - iOS: iframe 触发 │
67
+ │ - 统一 log handler │
68
+ │ - LogUtil 写入日志文件 │
69
+ │ - 统一上传到服务器 │
70
+ └─────────────────────────────────────┘
71
+ ```
72
+
73
+ ### 2.2 核心模块
74
+
75
+ | 模块 | 职责 | 代码量 |
76
+ |------|------|--------|
77
+ | **Bridge** | 核心通信、平台兼容 | 200 行 |
78
+ | **Monitor** | 性能监控、通过 log 上报 | 180 行 |
79
+ | **Debug** | vconsole、调用追踪 | 150 行 |
80
+ | **Log API** | 提供日志上传能力 | 80 行 |
81
+ | **device/media/router等** | 各类 API | 320 行 |
82
+ | **types** | 类型定义 | 120 行 |
83
+ | **index** | 统一导出 | 100 行 |
84
+ | **总计** | | **~1150 行** |
85
+
86
+ ## 3. 核心模块设计
87
+
88
+ ### 3.1 Bridge 核心通信层
89
+
90
+ #### 设计职责
91
+
92
+ - 平台检测:Android/iOS/Unknown
93
+ - 平台特定初始化
94
+ - 统一的 call/register 接口
95
+ - 超时处理
96
+
97
+ #### 关键接口
98
+
99
+ ```typescript
100
+ enum Platform {
101
+ Android = 'android',
102
+ iOS = 'ios',
103
+ Unknown = 'unknown'
104
+ }
105
+
106
+ class Bridge {
107
+ // 初始化(平台特定)
108
+ async init(): Promise<boolean>
109
+
110
+ // 调用原生方法
111
+ call<T>(method: string, data?: any): Promise<T>
112
+
113
+ // 注册方法供原生调用
114
+ register(method: string, handler: Function): void
115
+
116
+ // 获取平台
117
+ getPlatform(): Platform
118
+
119
+ // 是否在原生 App 中
120
+ inApp(): boolean
121
+ }
122
+ ```
123
+
124
+ #### 平台检测逻辑
125
+
126
+ ```typescript
127
+ private detectPlatform(): void {
128
+ const ua = navigator.userAgent
129
+ // Android: /SoaAndroid|HDApp.*Android/i
130
+ // iOS: /iPhone|iPad|iPod/i && /HDApp/i
131
+ // Unknown: 其他
132
+ }
133
+ ```
134
+
135
+ #### 初始化逻辑
136
+
137
+ ```typescript
138
+ // Android: window.InjectJavascript.init()
139
+ // iOS: 创建 iframe,src = 'https://__bridge_loaded__'
140
+ // 超时: 10 秒
141
+ ```
142
+
143
+ ### 3.2 Monitor 监控层
144
+
145
+ #### 设计职责
146
+
147
+ - 自动记录 API 调用性能
148
+ - 自动记录错误信息
149
+ - 定时通过 log API 上报
150
+ - 错误立即通过 log API 上报
151
+
152
+ #### 关键接口
153
+
154
+ ```typescript
155
+ interface ApiCallRecord {
156
+ api: string
157
+ platform: string
158
+ startTime: number
159
+ duration?: number
160
+ success: boolean
161
+ error?: string
162
+ }
163
+
164
+ interface PerformanceStats {
165
+ totalCalls: number
166
+ successCalls: number
167
+ failedCalls: number
168
+ avgDuration: number
169
+ maxDuration: number
170
+ minDuration: number
171
+ }
172
+
173
+ class Monitor {
174
+ // 记录调用
175
+ recordStart(api: string, platform: string, params?: any): ApiCallRecord
176
+ recordEnd(record: ApiCallRecord, success: boolean, result?, error?): void
177
+
178
+ // 上报(通过 log API)
179
+ async report(): Promise<void>
180
+
181
+ // 立即上报错误
182
+ async reportError(api: string, error: string, detail?): Promise<void>
183
+
184
+ // 查询统计
185
+ getStats(api?: string): PerformanceStats | Map<string, PerformanceStats>
186
+ getRecords(limit?: number): ApiCallRecord[]
187
+ }
188
+ ```
189
+
190
+ #### 上报机制
191
+
192
+ **v2 版本(正确)**:
193
+ ```typescript
194
+ // 定时上报
195
+ await bridge.call('log', {
196
+ tag: 'JSBridge-Monitor',
197
+ level: 'INFO',
198
+ message: `[MONITOR] ${JSON.stringify(data)}`
199
+ })
200
+
201
+ // 错误立即上报
202
+ await bridge.call('log', {
203
+ tag: 'JSBridge-Monitor',
204
+ level: 'ERROR',
205
+ message: `[ERROR] ${JSON.stringify(errorData)}`
206
+ })
207
+ ```
208
+
209
+ ### 3.3 Debug 调试层
210
+
211
+ #### 设计职责
212
+
213
+ - vconsole 集成
214
+ - 调用追踪
215
+ - 日志记录
216
+ - 开发/生产分离
217
+
218
+ #### 关键接口
219
+
220
+ ```typescript
221
+ interface DebugConfig {
222
+ enabled: boolean
223
+ useVConsole?: boolean
224
+ logLevel?: 'debug' | 'info' | 'warn' | 'error'
225
+ }
226
+
227
+ class Debug {
228
+ // 初始化 vconsole
229
+ async initVConsole(): Promise<void>
230
+
231
+ // 记录日志
232
+ log(level: string, message: string, data?: any): void
233
+
234
+ // 追踪 API 调用
235
+ trace(api: string, params?: any): void
236
+
237
+ // 查询日志
238
+ getLogs(level?: string, limit?: number): any[]
239
+ }
240
+ ```
241
+
242
+ ### 3.4 Log API 层(新增)
243
+
244
+ #### 设计职责
245
+
246
+ - 提供简单的日志 API
247
+ - 将日志写入原生
248
+ - 支持不同级别
249
+
250
+ #### 关键接口
251
+
252
+ ```typescript
253
+ enum LogLevel {
254
+ DEBUG = 'DEBUG',
255
+ INFO = 'INFO',
256
+ WARN = 'WARN',
257
+ ERROR = 'ERROR'
258
+ }
259
+
260
+ interface LogRequest {
261
+ tag?: string
262
+ level: LogLevel
263
+ message: string
264
+ }
265
+
266
+ // 通用方法
267
+ async function writeLog(request: LogRequest): Promise<void>
268
+
269
+ // 便捷方法
270
+ const log = {
271
+ debug: (message: string, tag?: string) => Promise<void>
272
+ info: (message: string, tag?: string) => Promise<void>
273
+ warn: (message: string, tag?: string) => Promise<void>
274
+ error: (message: string, tag?: string) => Promise<void>
275
+ }
276
+ ```
277
+
278
+ ## 4. 数据流设计
279
+
280
+ ### 4.1 API 调用流程
281
+
282
+ ```
283
+ 子应用调用
284
+
285
+ SDK API 层
286
+
287
+ Monitor 记录开始
288
+
289
+ Debug 追踪
290
+
291
+ Bridge 调用
292
+
293
+ 原生处理
294
+
295
+ Bridge 返回
296
+
297
+ Monitor 记录结束
298
+
299
+ Debug 记录日志
300
+
301
+ 返回给子应用
302
+ ```
303
+
304
+ ### 4.2 监控上报流程
305
+
306
+ ```
307
+ API 调用(自动记录)
308
+
309
+ Monitor 记录性能数据
310
+
311
+ 定时任务(1 分钟)
312
+
313
+ Monitor.report()
314
+
315
+ 调用 bridge.call('log', {...})
316
+
317
+ 原生 LogUtil 写入日志文件
318
+
319
+ 原生统一上传到服务器
320
+ ```
321
+
322
+ ### 4.3 日志上传流程
323
+
324
+ ```
325
+ 子应用调用 JSBridge.log.info(...)
326
+
327
+ SDK log API
328
+
329
+ 调用 bridge.call('log', {...})
330
+
331
+ 原生 LogUtil 写入日志文件
332
+
333
+ 原生统一上传到服务器
334
+ ```
335
+
336
+ ### 4.4 错误上报流程(立即)
337
+
338
+ ```
339
+ API 调用失败
340
+
341
+ Monitor 捕获错误
342
+
343
+ Monitor.reportError()
344
+
345
+ 立即调用 bridge.call('log', {level: 'ERROR', ...})
346
+
347
+ 原生 LogUtil 写入(ERROR 级别)
348
+
349
+ 原生立即上传 ERROR 日志
350
+ ```
351
+
352
+ ## 5. 接口设计
353
+
354
+ ### 5.1 初始化接口
355
+
356
+ ```typescript
357
+ interface JSBridgeConfig {
358
+ debug?: Partial<DebugConfig>
359
+ monitor?: Partial<MonitorConfig>
360
+ }
361
+
362
+ interface MonitorConfig {
363
+ enabled: boolean
364
+ autoReport?: boolean // 自动上报
365
+ reportInterval?: number // 上报间隔(ms)
366
+ maxCacheSize?: number // 最大缓存条数
367
+ logTag?: string // 日志 TAG
368
+ }
369
+
370
+ // 使用示例
371
+ await init({
372
+ debug: {
373
+ enabled: isDev,
374
+ useVConsole: isDev
375
+ },
376
+ monitor: {
377
+ enabled: !isDev,
378
+ autoReport: !isDev,
379
+ reportInterval: 60000,
380
+ logTag: 'JSBridge-Monitor'
381
+ }
382
+ })
383
+ ```
384
+
385
+ ### 5.2 Bridge API 接口
386
+
387
+ ```typescript
388
+ // 设备能力
389
+ JSBridge.scan(options?: ScanOptions): Promise<ScanResult>
390
+ JSBridge.vibrate(duration?: number): Promise<void>
391
+ JSBridge.getDeviceInfo(): Promise<DeviceInfo>
392
+ JSBridge.getNetworkType(): Promise<string>
393
+
394
+ // 媒体能力
395
+ JSBridge.chooseMedia(options: MediaOptions): Promise<MediaResult>
396
+ JSBridge.uploadFile(options: UploadOptions): Promise<UploadResult>
397
+ JSBridge.previewImage(options: PreviewOptions): Promise<void>
398
+ JSBridge.getImageInfo(options: ImageInfoOptions): Promise<ImageInfo>
399
+ JSBridge.bluetoothPrint(options: PrintOptions): Promise<PrintResult>
400
+
401
+ // 路由能力
402
+ JSBridge.setNavigationBar(options: NavBarOptions): Promise<void>
403
+ JSBridge.closeWebView(): Promise<void>
404
+ JSBridge.onRoute(handler: RouteHandler): void
405
+ JSBridge.onGetRouteInfo(handler: RouteInfoHandler): void
406
+ JSBridge.notifyRouteChange(data: RouteChangeData): Promise<void>
407
+
408
+ // 存储能力
409
+ JSBridge.getStorage(key?: string): Promise<any>
410
+ JSBridge.setStorage(data: any): Promise<void>
411
+ JSBridge.getAppInfo(): Promise<AppInfo>
412
+ JSBridge.onRefreshStore(handler: RefreshHandler): void
413
+ JSBridge.notifyAppOnload(data: any): Promise<void>
414
+
415
+ // 系统能力
416
+ JSBridge.makePhoneCall(options: PhoneCallOptions): Promise<void>
417
+ JSBridge.onPdaScan(handler: PdaScanHandler): void
418
+ ```
419
+
420
+ ### 5.3 Log API 接口(新增)
421
+
422
+ ```typescript
423
+ // Log API
424
+ JSBridge.log.debug(message: string, tag?: string): Promise<void>
425
+ JSBridge.log.info(message: string, tag?: string): Promise<void>
426
+ JSBridge.log.warn(message: string, tag?: string): Promise<void>
427
+ JSBridge.log.error(message: string, tag?: string): Promise<void>
428
+
429
+ // 通用方法
430
+ JSBridge.writeLog(request: LogRequest): Promise<void>
431
+ ```
432
+
433
+ ### 5.4 Monitor API 接口
434
+
435
+ ```typescript
436
+ Monitor.getStats(api?: string): PerformanceStats | Map<string, PerformanceStats>
437
+ Monitor.getRecords(limit?: number): ApiCallRecord[]
438
+ Monitor.clear(): void
439
+ Monitor.report(): Promise<void> // 手动上报(通过 log)
440
+ Monitor.reportError(api, error, detail?): Promise<void> // 错误上报
441
+ ```
442
+
443
+ ### 5.5 Debug API 接口
444
+
445
+ ```typescript
446
+ Debug.trace(api: string, params?: any): void
447
+ Debug.getLogs(level?: string, limit?: number): any[]
448
+ Debug.clearLogs(): void
449
+ ```
450
+
451
+ ## 6. 原生端接口设计
452
+
453
+ ### 6.1 Android 端
454
+
455
+ ```kotlin
456
+ // 注册 log handler
457
+ webView.registerHandler("log") { data, callback ->
458
+ val request = Gson().fromJson(data, UniLog::class.java)
459
+ // request.tag, request.level, request.message
460
+
461
+ LogUtil.info(request.tag, request.message)
462
+ callback?.invoke(null)
463
+ }
464
+ ```
465
+
466
+ ### 6.2 iOS 端
467
+
468
+ ```swift
469
+ // 注册 log handler
470
+ bridge.registerHandler("log") { data, callback in
471
+ let tag = request["tag"] as? String ?? "JSBridge"
472
+ let level = request["level"] as? String
473
+ let message = request["message"] as? String
474
+
475
+ os_log(.info, log: OSLog(...), "%{public}@", message)
476
+ callback?(nil)
477
+ }
478
+ ```
479
+
480
+ ## 7. 安全性设计
481
+
482
+ ### 7.1 超时机制
483
+
484
+ ```typescript
485
+ call<T>(method: string, data?: any): Promise<T> {
486
+ return Promise.race([
487
+ this.callBridge(method, data),
488
+ this.timeout(10000) // 10 秒超时
489
+ ])
490
+ }
491
+ ```
492
+
493
+ ### 7.2 错误处理
494
+
495
+ ```typescript
496
+ try {
497
+ const result = await bridge.call(method, data)
498
+ monitor.recordEnd(record, true, result)
499
+ return result
500
+ } catch (error) {
501
+ monitor.recordEnd(record, false, undefined, error.message)
502
+ monitor.reportError(method, error.message) // 立即上报
503
+ throw error
504
+ }
505
+ ```
506
+
507
+ ## 8. 性能优化
508
+
509
+ ### 8.1 代码体积
510
+
511
+ - ✅ 核心代码 ~1150 行
512
+ - ✅ 打包体积 ~20KB
513
+ - ✅ gzip 后 ~7KB
514
+
515
+ ### 8.2 运行性能
516
+
517
+ - ✅ 初始化 < 100ms
518
+ - ✅ API 调用 < 50ms
519
+ - ✅ 日志写入 < 10ms(异步)
520
+
521
+ ### 8.3 内存优化
522
+
523
+ - ✅ 监控缓存限制(默认 100 条)
524
+ - ✅ Debug 日志限制
525
+ - ✅ 定时清理
526
+
527
+ ## 9. 扩展性设计
528
+
529
+ ### 9.1 新增 API
530
+
531
+ ```typescript
532
+ // 1. 新建 src/api/newFeature.ts
533
+ export async function newFeature(options): Promise<Result> {
534
+ return bridge.call('newFeature', options)
535
+ }
536
+
537
+ // 2. 在 index.ts 中导出
538
+ export const JSBridge = {
539
+ // ... 现有 API
540
+ newFeature
541
+ }
542
+
543
+ // 3. 原生端实现
544
+ webView.registerHandler("newFeature") { data, callback ->
545
+ // 处理逻辑
546
+ callback?.invoke(result)
547
+ }
548
+ ```
549
+
550
+ ### 9.2 新增监控指标
551
+
552
+ ```typescript
553
+ interface PerformanceStats {
554
+ // ... 现有指标
555
+ newMetric: number // 新增指标
556
+ }
557
+ ```
558
+
559
+ ## 10. 部署架构
560
+
561
+ ### 10.1 npm 发布
562
+
563
+ ```json
564
+ {
565
+ "name": "@hd-front-end/jsbridge-sdk",
566
+ "version": "2.0.0",
567
+ "main": "dist/index.cjs.js",
568
+ "module": "dist/index.esm.js",
569
+ "types": "dist/types/index.d.ts"
570
+ }
571
+ ```
572
+
573
+ ### 10.2 子应用集成
574
+
575
+ ```typescript
576
+ // 1. 安装
577
+ npm install @hd-front-end/jsbridge-sdk
578
+
579
+ // 2. 初始化
580
+ import { init } from '@hd-front-end/jsbridge-sdk'
581
+ await init({...})
582
+
583
+ // 3. 使用
584
+ import { JSBridge } from '@hd-front-end/jsbridge-sdk'
585
+ await JSBridge.scan()
586
+ ```
587
+
588
+ ## 11. 设计特点总结
589
+
590
+ ### 11.1 v2 关键改进
591
+
592
+ **监控上报机制**:
593
+ - ❌ v1:直接发送 HTTP(错误)
594
+ - ✅ v2:通过 log API 上报(正确)
595
+
596
+ **日志能力**:
597
+ - ❌ v1:没有 log API
598
+ - ✅ v2:提供 log API
599
+
600
+ **统一日志管理**:
601
+ - SDK 监控 + 子应用日志
602
+ - 都通过原生 log handler
603
+ - 原生统一写入和上传
604
+
605
+ ### 11.2 设计亮点
606
+
607
+ ✅ **职责单一** - SDK 只做原生 API 封装
608
+ ✅ **统一日志** - 监控和业务日志统一管理
609
+ ✅ **双平台兼容** - 自动兼容 Android/iOS
610
+ ✅ **自动监控** - 无感知性能监控
611
+ ✅ **易于扩展** - 新增 API 简单
612
+
613
+ ## 12. 相关文档
614
+
615
+ - **[00-项目概览.md](./00-项目概览.md)** - 项目概览
616
+ - **[02-技术实现.md](./02-技术实现.md)** - **完整代码实现**
617
+ - **[03-API使用文档.md](./03-API使用文档.md)** - API 详细文档
618
+ - **[06-架构图集.md](./06-架构图集.md)** - 更多架构图
619
+
620
+ ---
621
+
622
+ **清晰的架构设计,完整代码见02** 🎯
623
+