@hd-front-end/jsbridge-sdk 1.0.2 → 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 +446 -1
  4. package/dist/index.esm.js.map +1 -1
  5. package/dist/index.js +448 -0
  6. package/dist/index.js.map +1 -1
  7. package/dist/index.umd.js +450 -4
  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,360 @@
1
+ # JSBridge SDK 测试方案(生产级 v2)
2
+
3
+ > **当前版本**:生产级 v2 - 测试方案
4
+
5
+ ## 1. 测试目标
6
+
7
+ - ✅ **功能完整性**:确保所有 API 正常工作
8
+ - ✅ **平台兼容性**:Android 和 iOS 双平台测试
9
+ - ✅ **监控准确性**:验证监控数据正确性
10
+ - ✅ **日志功能**:验证 log API 正常工作
11
+ - ✅ **稳定性**:错误处理、超时机制
12
+
13
+ ## 2. 测试矩阵
14
+
15
+ ### 2.1 平台测试矩阵
16
+
17
+ | 功能 | Android | iOS | 说明 |
18
+ |------|---------|-----|------|
19
+ | **核心通信** | ✅ | ✅ | Bridge 初始化 |
20
+ | **扫码** | ✅ | ✅ | scan() |
21
+ | **选择媒体** | ✅ | ✅ | chooseMedia() |
22
+ | **上传文件** | ✅ | ✅ | uploadFile() |
23
+ | **设备信息** | ✅ | ✅ | getDeviceInfo() |
24
+ | **日志上传** | ✅ | ✅ | log API |
25
+ | **监控上报** | ✅ | ✅ | 通过 log 上报 |
26
+ | **Debug 模式** | ✅ | ✅ | vconsole |
27
+
28
+ ### 2.2 设备测试矩阵
29
+
30
+ | 平台 | 设备 | 系统版本 | 测试项 |
31
+ |------|------|---------|--------|
32
+ | Android | 小米 | Android 11+ | 全功能 |
33
+ | Android | 华为 | Android 10+ | 全功能 |
34
+ | Android | OPPO | Android 11+ | 全功能 |
35
+ | iOS | iPhone 12+ | iOS 14+ | 全功能 |
36
+ | iOS | iPad | iOS 14+ | 全功能 |
37
+
38
+ ## 3. 测试用例
39
+
40
+ ### 3.1 初始化测试
41
+
42
+ ```typescript
43
+ describe('初始化测试', () => {
44
+ test('默认配置初始化成功', async () => {
45
+ const success = await init()
46
+ expect(success).toBe(true)
47
+ expect(inApp()).toBe(true)
48
+ })
49
+
50
+ test('完整配置初始化成功', async () => {
51
+ const success = await init({
52
+ debug: { enabled: true, useVConsole: true },
53
+ monitor: { enabled: true, autoReport: true }
54
+ })
55
+ expect(success).toBe(true)
56
+ })
57
+
58
+ test('平台检测正确', () => {
59
+ const platform = getPlatform()
60
+ expect(['android', 'ios']).toContain(platform)
61
+ })
62
+ })
63
+ ```
64
+
65
+ ### 3.2 API 功能测试
66
+
67
+ ```typescript
68
+ describe('API 功能测试', () => {
69
+ test('扫码功能', async () => {
70
+ const result = await JSBridge.scan()
71
+ expect(result.resp_code).toBe(1000)
72
+ expect(result.resp_result).toBeDefined()
73
+ })
74
+
75
+ test('选择媒体', async () => {
76
+ const result = await JSBridge.chooseMedia({ count: 1 })
77
+ expect(result.tempFilePaths).toBeDefined()
78
+ expect(result.tempFilePaths.length).toBeGreaterThan(0)
79
+ })
80
+
81
+ test('获取设备信息', async () => {
82
+ const info = await JSBridge.getDeviceInfo()
83
+ expect(info.brand).toBeDefined()
84
+ expect(info.model).toBeDefined()
85
+ })
86
+ })
87
+ ```
88
+
89
+ ### 3.3 日志功能测试
90
+
91
+ ```typescript
92
+ describe('日志功能测试', () => {
93
+ test('info 日志', async () => {
94
+ await expect(
95
+ JSBridge.log.info('测试日志', 'Test')
96
+ ).resolves.toBeUndefined()
97
+ })
98
+
99
+ test('error 日志', async () => {
100
+ await expect(
101
+ JSBridge.log.error('错误日志', 'Test')
102
+ ).resolves.toBeUndefined()
103
+ })
104
+
105
+ test('通用 writeLog', async () => {
106
+ await expect(
107
+ JSBridge.writeLog({
108
+ level: LogLevel.INFO,
109
+ message: '测试',
110
+ tag: 'Test'
111
+ })
112
+ ).resolves.toBeUndefined()
113
+ })
114
+ })
115
+ ```
116
+
117
+ ### 3.4 监控功能测试
118
+
119
+ ```typescript
120
+ describe('监控功能测试', () => {
121
+ test('记录 API 调用', async () => {
122
+ await JSBridge.scan()
123
+
124
+ const stats = Monitor.getStats('scan')
125
+ expect(stats.totalCalls).toBeGreaterThan(0)
126
+ })
127
+
128
+ test('获取调用记录', async () => {
129
+ const records = Monitor.getRecords(10)
130
+ expect(records.length).toBeGreaterThan(0)
131
+ expect(records[0].api).toBeDefined()
132
+ })
133
+
134
+ test('手动上报', async () => {
135
+ await expect(Monitor.report()).resolves.toBeUndefined()
136
+ })
137
+ })
138
+ ```
139
+
140
+ ### 3.5 错误处理测试
141
+
142
+ ```typescript
143
+ describe('错误处理测试', () => {
144
+ test('API 调用失败', async () => {
145
+ // 模拟失败场景
146
+ await expect(
147
+ JSBridge.call('invalidMethod')
148
+ ).rejects.toThrow()
149
+ })
150
+
151
+ test('未初始化调用', async () => {
152
+ // 重置初始化状态
153
+ await expect(
154
+ JSBridge.scan()
155
+ ).rejects.toThrow('JSBridge 未初始化')
156
+ })
157
+ })
158
+ ```
159
+
160
+ ## 4. 测试执行
161
+
162
+ ### 4.1 单元测试
163
+
164
+ ```bash
165
+ # 运行所有测试
166
+ npm test
167
+
168
+ # 运行特定测试
169
+ npm test -- --grep "初始化测试"
170
+
171
+ # 生成覆盖率报告
172
+ npm test -- --coverage
173
+ ```
174
+
175
+ ### 4.2 集成测试
176
+
177
+ ```bash
178
+ # Android 真机测试
179
+ npm run test:android
180
+
181
+ # iOS 真机测试
182
+ npm run test:ios
183
+ ```
184
+
185
+ ### 4.3 手动测试清单
186
+
187
+ **扫码测试**:
188
+ - [ ] 扫码成功
189
+ - [ ] 用户取消
190
+ - [ ] 相机权限拒绝
191
+ - [ ] 超时处理
192
+
193
+ **媒体测试**:
194
+ - [ ] 选择图片成功
195
+ - [ ] 选择多张图片
196
+ - [ ] 选择视频
197
+ - [ ] 上传文件成功
198
+
199
+ **日志测试**:
200
+ - [ ] info 日志写入
201
+ - [ ] error 日志写入
202
+ - [ ] 监控数据上报
203
+ - [ ] 原生日志文件存在
204
+
205
+ **平台测试**:
206
+ - [ ] Android 平台正常
207
+ - [ ] iOS 平台正常
208
+ - [ ] 平台检测正确
209
+
210
+ ## 5. 性能测试
211
+
212
+ ### 5.1 性能指标
213
+
214
+ | 指标 | 目标 | 实际 | 说明 |
215
+ |------|------|------|------|
216
+ | 初始化时间 | < 100ms | | 首次初始化 |
217
+ | API 调用延迟 | < 50ms | | 不含原生处理 |
218
+ | 日志写入延迟 | < 10ms | | 异步写入 |
219
+ | 包体积 | < 10KB | | gzip 后 |
220
+
221
+ ### 5.2 性能测试用例
222
+
223
+ ```typescript
224
+ describe('性能测试', () => {
225
+ test('初始化性能', async () => {
226
+ const start = Date.now()
227
+ await init()
228
+ const duration = Date.now() - start
229
+
230
+ expect(duration).toBeLessThan(100)
231
+ })
232
+
233
+ test('API 调用性能', async () => {
234
+ const start = Date.now()
235
+ await JSBridge.getDeviceInfo()
236
+ const duration = Date.now() - start
237
+
238
+ expect(duration).toBeLessThan(50)
239
+ })
240
+ })
241
+ ```
242
+
243
+ ## 6. 兼容性测试
244
+
245
+ ### 6.1 Android 兼容性
246
+
247
+ - [ ] Android 9.0
248
+ - [ ] Android 10
249
+ - [ ] Android 11
250
+ - [ ] Android 12+
251
+
252
+ ### 6.2 iOS 兼容性
253
+
254
+ - [ ] iOS 13
255
+ - [ ] iOS 14
256
+ - [ ] iOS 15
257
+ - [ ] iOS 16+
258
+
259
+ ## 7. 监控数据验证
260
+
261
+ ### 7.1 验证监控数据格式
262
+
263
+ ```typescript
264
+ test('监控数据格式正确', async () => {
265
+ await JSBridge.scan()
266
+
267
+ const stats = Monitor.getStats('scan')
268
+
269
+ expect(stats).toMatchObject({
270
+ totalCalls: expect.any(Number),
271
+ successCalls: expect.any(Number),
272
+ failedCalls: expect.any(Number),
273
+ avgDuration: expect.any(Number),
274
+ maxDuration: expect.any(Number),
275
+ minDuration: expect.any(Number)
276
+ })
277
+ })
278
+ ```
279
+
280
+ ### 7.2 验证日志上报
281
+
282
+ ```typescript
283
+ test('监控数据通过 log 上报', async () => {
284
+ const spy = jest.spyOn(bridge, 'call')
285
+
286
+ await Monitor.report()
287
+
288
+ expect(spy).toHaveBeenCalledWith('log', {
289
+ tag: 'JSBridge-Monitor',
290
+ level: 'INFO',
291
+ message: expect.stringContaining('[MONITOR]')
292
+ })
293
+ })
294
+ ```
295
+
296
+ ## 8. 测试报告模板
297
+
298
+ ```markdown
299
+ # JSBridge SDK 测试报告
300
+
301
+ ## 测试信息
302
+ - 测试日期:2026-02-02
303
+ - 测试版本:v2.0.0
304
+ - 测试人员:XXX
305
+
306
+ ## 测试结果
307
+
308
+ ### 功能测试
309
+ - 通过:50 / 50
310
+ - 失败:0 / 50
311
+
312
+ ### 性能测试
313
+ - 初始化时间:85ms ✅
314
+ - API 调用延迟:35ms ✅
315
+ - 包体积:6.5KB (gzip) ✅
316
+
317
+ ### 兼容性测试
318
+ - Android:✅ (测试 4 个版本)
319
+ - iOS:✅ (测试 4 个版本)
320
+
321
+ ### 问题列表
322
+
323
+
324
+ ## 结论
325
+ 所有测试通过,可以发布。
326
+ ```
327
+
328
+ ## 9. 持续集成
329
+
330
+ ### 9.1 CI 配置
331
+
332
+ ```yaml
333
+ # .github/workflows/test.yml
334
+ name: Test
335
+
336
+ on: [push, pull_request]
337
+
338
+ jobs:
339
+ test:
340
+ runs-on: ubuntu-latest
341
+ steps:
342
+ - uses: actions/checkout@v3
343
+ - uses: actions/setup-node@v3
344
+ - run: npm install
345
+ - run: npm test
346
+ - run: npm run build
347
+ ```
348
+
349
+ ## 10. 文档导航
350
+
351
+ - **[00-项目概览.md](./00-项目概览.md)** - 项目概述
352
+ - **[01-架构设计.md](./01-架构设计.md)** - 架构设计
353
+ - **[02-技术实现.md](./02-技术实现.md)** - 技术实现
354
+ - **[03-API使用文档.md](./03-API使用文档.md)** - API 文档
355
+ - **[05-迁移指南.md](./05-迁移指南.md)** - 迁移指南
356
+
357
+ ---
358
+
359
+ **完善的测试方案,保证质量** 🎯
360
+
@@ -0,0 +1,181 @@
1
+ # JSBridge SDK 迁移指南(生产级 v2)
2
+
3
+ > **当前版本**:生产级 v2 - 如何从现有项目迁移到 SDK
4
+
5
+ ## 1. 迁移概述
6
+
7
+ ### 1.1 迁移目标
8
+
9
+ 将现有项目(SOA、MPA-Mini-V3)中的 JSBridge 代码迁移到使用 `@hd-front-end/jsbridge-sdk`。
10
+
11
+ ### 1.2 迁移收益
12
+
13
+ ✅ **代码更简洁** - 移除项目中的 JSBridge 实现
14
+ ✅ **统一维护** - SDK 统一维护和升级
15
+ ✅ **新增能力** - 监控、debug、log API
16
+ ✅ **类型安全** - TypeScript 完整支持
17
+ ✅ **高性能** - 内置初始化竞态处理,消除 10s 延迟
18
+
19
+ ## 2. 集成指南
20
+
21
+ ### 2.1 Vue 2 + UniApp (如 SOA)
22
+
23
+ **步骤 1:安装 SDK**
24
+
25
+ ```bash
26
+ npm install @hd-front-end/jsbridge-sdk
27
+ ```
28
+
29
+ **步骤 2:全局挂载 (main.js)**
30
+
31
+ ```javascript
32
+ import Vue from 'vue'
33
+ import { JSBridge } from '@hd-front-end/jsbridge-sdk'
34
+
35
+ // 挂载到 Vue 原型,方便页面通过 this.$bridge 调用
36
+ Vue.prototype.$bridge = JSBridge
37
+ ```
38
+
39
+ **步骤 3:初始化 (App.vue)**
40
+
41
+ ```javascript
42
+ import { init } from '@hd-front-end/jsbridge-sdk'
43
+
44
+ export default {
45
+ onLaunch() {
46
+ // 建议尽早初始化
47
+ init({
48
+ debug: { enabled: process.env.NODE_ENV === 'development' },
49
+ monitor: { enabled: true, autoReport: true }
50
+ })
51
+ }
52
+ }
53
+ ```
54
+
55
+ **步骤 4:页面调用**
56
+
57
+ ```javascript
58
+ methods: {
59
+ async handleScan() {
60
+ try {
61
+ // 直接调用,无需手动检查初始化状态
62
+ const res = await this.$bridge.scan()
63
+ console.log('扫码结果', res)
64
+ } catch (e) {
65
+ console.error('扫码失败', e)
66
+ }
67
+ }
68
+ }
69
+ ```
70
+
71
+ ---
72
+
73
+ ### 2.2 Vue 3 + UniApp (如 MPA-Mini-V3)
74
+
75
+ **步骤 1:创建插件 (src/plugins/jsbridge.ts)**
76
+
77
+ ```typescript
78
+ import { init, JSBridge } from '@hd-front-end/jsbridge-sdk'
79
+ import type { App } from 'vue'
80
+
81
+ export default {
82
+ install: async (app: App) => {
83
+ // 1. Provide (推荐,配合 Composition API)
84
+ app.provide('jsbridge', JSBridge)
85
+
86
+ // 2. 全局挂载 (可选,兼容 Options API)
87
+ app.config.globalProperties.$bridge = JSBridge
88
+
89
+ // 3. 初始化 SDK
90
+ const isDev = process.env.NODE_ENV === 'development'
91
+
92
+ // 异步初始化,不阻塞应用启动
93
+ init({
94
+ debug: { enabled: isDev },
95
+ monitor: { enabled: !isDev, autoReport: true }
96
+ }).then(() => {
97
+ console.log('✅ JSBridge Ready')
98
+ })
99
+ }
100
+ }
101
+ ```
102
+
103
+ **步骤 2:注册插件 (main.ts)**
104
+
105
+ ```typescript
106
+ import { createSSRApp } from 'vue'
107
+ import App from './App.vue'
108
+ import JsBridgePlugin from './plugins/jsbridge'
109
+
110
+ export function createApp() {
111
+ const app = createSSRApp(App)
112
+ app.use(JsBridgePlugin)
113
+ return { app }
114
+ }
115
+ ```
116
+
117
+ **步骤 3:页面调用 (Composition API)**
118
+
119
+ ```vue
120
+ <script setup lang="ts">
121
+ import { JSBridge } from '@hd-front-end/jsbridge-sdk' // 推荐:直接引入,Tree-shaking 友好
122
+
123
+ const handleScan = async () => {
124
+ const res = await JSBridge.scan()
125
+ console.log(res)
126
+ }
127
+ </script>
128
+ ```
129
+
130
+ ---
131
+
132
+ ### 2.3 纯 Vue 3 项目 (如 Report-Mobile)
133
+
134
+ **步骤 1:直接引入使用**
135
+
136
+ 无需复杂的插件封装,直接在需要的地方引入即可。
137
+
138
+ ```typescript
139
+ // main.ts
140
+ import { init } from '@hd-front-end/jsbridge-sdk'
141
+
142
+ init({ monitor: { enabled: true } })
143
+ ```
144
+
145
+ ```vue
146
+ <!-- Component.vue -->
147
+ <script setup>
148
+ import { JSBridge } from '@hd-front-end/jsbridge-sdk'
149
+
150
+ const call = () => {
151
+ JSBridge.makePhoneCall({ phoneNumber: '10086' })
152
+ }
153
+ </script>
154
+ ```
155
+
156
+ ## 3. 常见问题 (FAQ)
157
+
158
+ ### Q1: 需要手动安装 vConsole 吗?
159
+ **需要**。SDK 为了保持轻量和纯净,不再内置 vConsole。如果你需要在开发环境调试,请在你的项目中自行安装 `vconsole` npm 包。
160
+
161
+ ### Q2: 初始化需要 await 吗?
162
+ **不需要**。SDK 内部实现了 `waitForReady` 机制。你可以调用 `init()` 而不等待它完成,立即调用 `JSBridge.scan()` 等 API,SDK 会自动挂起请求直到 Bridge 就绪。
163
+
164
+ ### Q3: 为什么扫码等接口不需要传 callback 了?
165
+ SDK 将所有异步 API 封装成了 **Promise**。你可以使用 `await` 语法,避免回调地狱。
166
+
167
+ ```typescript
168
+ // ✅ 推荐
169
+ try {
170
+ const res = await JSBridge.scan()
171
+ } catch (e) {
172
+ // 处理错误
173
+ }
174
+
175
+ // ❌ 旧方式
176
+ JsBridge.scan({
177
+ success: (res) => {},
178
+ fail: (err) => {}
179
+ })
180
+ ```
181
+