@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.
- package/README.md +4 -2
- package/dist/index.d.ts +204 -2
- package/dist/index.esm.js +446 -1
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +448 -0
- package/dist/index.js.map +1 -1
- package/dist/index.umd.js +450 -4
- 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,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
|
+
|