gc_i18n 1.5.1 → 1.5.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/.qoder/repowiki/zh/content//346/225/205/351/232/234/346/216/222/351/231/244.md +424 -30
- package/.qoder/repowiki/zh/content//351/241/271/347/233/256/347/256/200/344/273/213.md +164 -77
- package/.qoder/repowiki/zh/content//351/253/230/347/272/247/347/224/250/346/263/225/Vue 2 /351/233/206/346/210/220/346/214/207/345/215/227.md" +29 -11
- package/.qoder/repowiki/zh/meta/repowiki-metadata.json +1 -1
- package/example/vue3-test/src/views/Home.vue +1 -0
- package/lib/gc_i18n.css +1 -1
- package/lib/gc_i18n.es.js +388 -387
- package/lib/gc_i18n.umd.js +39 -39
- package/package.json +2 -5
- package/packages/index.js +25 -11
- package/packages/swal.css +14 -0
|
@@ -10,14 +10,16 @@
|
|
|
10
10
|
- [gc_i18n.js](file://lib/gc_i18n.js)
|
|
11
11
|
- [config.vue](file://packages/components/config.vue)
|
|
12
12
|
- [App.vue](file://src/App.vue)
|
|
13
|
-
- [utils.js](file://packages/libs/utils.js)
|
|
13
|
+
- [utils.js](file://packages/libs/utils.js)
|
|
14
|
+
- [package.json](file://package.json)
|
|
14
15
|
</cite>
|
|
15
16
|
|
|
16
17
|
## 更新摘要
|
|
17
18
|
**变更内容**
|
|
18
|
-
-
|
|
19
|
-
-
|
|
20
|
-
-
|
|
19
|
+
- 更新了"消息事件处理错误"章节,反映1.5.2版本中改进的跨域消息处理机制
|
|
20
|
+
- 新增了"跨域消息处理安全检查"章节,专门介绍1.5.2版本的try-catch包装机制
|
|
21
|
+
- 更新了"调试模式与日志查看"部分,增加了跨域消息处理的安全性日志输出
|
|
22
|
+
- 在"配置有效性验证"中添加了跨域消息处理的安全性验证要点
|
|
21
23
|
- 保持了原有文档结构和未受影响部分的完整性
|
|
22
24
|
|
|
23
25
|
## 目录
|
|
@@ -25,9 +27,11 @@
|
|
|
25
27
|
2. [语言不切换问题](#语言不切换问题)
|
|
26
28
|
3. [翻译文本显示为键名](#翻译文本显示为键名)
|
|
27
29
|
4. [加载失败问题](#加载失败问题)
|
|
28
|
-
5. [
|
|
29
|
-
6. [
|
|
30
|
-
7. [
|
|
30
|
+
5. [消息事件处理错误](#消息事件处理错误)
|
|
31
|
+
6. [跨域消息处理安全检查](#跨域消息处理安全检查)
|
|
32
|
+
7. [调试模式与日志查看](#调试模式与日志查看)
|
|
33
|
+
8. [配置有效性验证](#配置有效性验证)
|
|
34
|
+
9. [测试策略建议](#测试策略建议)
|
|
31
35
|
|
|
32
36
|
## 常见问题汇总
|
|
33
37
|
|
|
@@ -37,8 +41,10 @@
|
|
|
37
41
|
- **加载失败**:语言包无法正确加载,导致翻译功能失效
|
|
38
42
|
- **异步组件问题**:动态加载的组件中翻译键未被正确收集
|
|
39
43
|
- **缓存问题**:旧的语言数据未被清除,影响新语言的加载
|
|
44
|
+
- **消息事件处理错误**:跨域消息通信时出现安全错误或异常
|
|
45
|
+
- **跨域消息处理安全问题**:1.5.2版本中新增的跨域消息处理安全检查
|
|
40
46
|
|
|
41
|
-
|
|
47
|
+
这些问题通常源于配置错误、异步处理不当或依赖关系未正确处理。1.5.2版本特别加强了跨域消息处理的安全性和稳定性。以下将针对每个问题提供详细的根因分析和解决方案。
|
|
42
48
|
|
|
43
49
|
## 语言不切换问题
|
|
44
50
|
|
|
@@ -91,8 +97,8 @@ this.router.beforeEach(async (to, from, next) => {
|
|
|
91
97
|
```
|
|
92
98
|
|
|
93
99
|
**Section sources**
|
|
94
|
-
- [packages/index.js](file://packages/index.js#L231-L277)
|
|
95
|
-
- [packages/index.js](file://packages/index.js#L160-L194)
|
|
100
|
+
- [packages/index.js:231-277](file://packages/index.js#L231-L277)
|
|
101
|
+
- [packages/index.js:160-194](file://packages/index.js#L160-L194)
|
|
96
102
|
|
|
97
103
|
## 翻译文本显示为键名
|
|
98
104
|
|
|
@@ -167,7 +173,7 @@ globalThis.$clearI18n();
|
|
|
167
173
|
store2.namespace(`I18N_${appCode.toUpperCase()}`).clearAll();
|
|
168
174
|
```
|
|
169
175
|
|
|
170
|
-
|
|
176
|
+
```mermaid
|
|
171
177
|
flowchart TD
|
|
172
178
|
A[开始] --> B{翻译键存在?}
|
|
173
179
|
B --> |是| C[返回翻译文本]
|
|
@@ -185,12 +191,12 @@ D --> |否| M[返回原始键名]
|
|
|
185
191
|
```
|
|
186
192
|
|
|
187
193
|
**Diagram sources**
|
|
188
|
-
- [packages/index.js](file://packages/index.js#L200-L230)
|
|
194
|
+
- [packages/index.js:200-230](file://packages/index.js#L200-L230)
|
|
189
195
|
|
|
190
196
|
**Section sources**
|
|
191
|
-
- [packages/index.js](file://packages/index.js#L200-L230)
|
|
192
|
-
- [packages/libs/i18nUtils.ts](file://packages/libs/i18nUtils.ts#L0-L52)
|
|
193
|
-
- [packages/libs/service.js](file://packages/libs/service.js#L65-L123)
|
|
197
|
+
- [packages/index.js:200-230](file://packages/index.js#L200-L230)
|
|
198
|
+
- [packages/libs/i18nUtils.ts:0-52](file://packages/libs/i18nUtils.ts#L0-L52)
|
|
199
|
+
- [packages/libs/service.js:65-123](file://packages/libs/service.js#L65-L123)
|
|
194
200
|
|
|
195
201
|
## 加载失败问题
|
|
196
202
|
|
|
@@ -305,9 +311,265 @@ async setLanguage(language) {
|
|
|
305
311
|
```
|
|
306
312
|
|
|
307
313
|
**Section sources**
|
|
308
|
-
- [packages/index.js](file://packages/index.js#L250-L277)
|
|
309
|
-
- [packages/libs/service.js](file://packages/libs/service.js#L65-L123)
|
|
310
|
-
- [packages/libs/utils.js](file://packages/libs/utils.js#L9-L28)
|
|
314
|
+
- [packages/index.js:250-277](file://packages/index.js#L250-L277)
|
|
315
|
+
- [packages/libs/service.js:65-123](file://packages/libs/service.js#L65-L123)
|
|
316
|
+
- [packages/libs/utils.js:9-28](file://packages/libs/utils.js#L9-L28)
|
|
317
|
+
|
|
318
|
+
## 消息事件处理错误
|
|
319
|
+
|
|
320
|
+
**更新** 新增此章节,反映1.5.1版本中改进的消息事件处理错误处理机制
|
|
321
|
+
|
|
322
|
+
### 根本原因分析
|
|
323
|
+
|
|
324
|
+
消息事件处理错误主要出现在跨域通信场景中,1.5.1版本之前可能存在以下问题:
|
|
325
|
+
1. **跨域安全错误**:直接访问 `event.origin` 导致 SecurityError
|
|
326
|
+
2. **未捕获的异常**:try-catch 机制不完善,导致错误传播到控制台
|
|
327
|
+
3. **调试困难**:跨域错误与业务逻辑错误混合,难以区分
|
|
328
|
+
4. **性能影响**:频繁的跨域错误导致不必要的日志输出
|
|
329
|
+
|
|
330
|
+
### 具体解决方案
|
|
331
|
+
|
|
332
|
+
1. **启用跨域安全检查**
|
|
333
|
+
```javascript
|
|
334
|
+
// 1.5.1版本中改进的消息事件处理
|
|
335
|
+
window.top.addEventListener("message", (event) => {
|
|
336
|
+
try {
|
|
337
|
+
// 跨域检查:如果源不匹配,跳过处理以避免安全错误
|
|
338
|
+
if (!event.origin || event.origin === "null") {
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
341
|
+
console.log("打印接收到的数据message:", event.data);
|
|
342
|
+
if (event.data && event.data.type === "updateLanguage") {
|
|
343
|
+
location.reload();
|
|
344
|
+
} else if (event.data && event.data.type === "closeModal") {
|
|
345
|
+
if (this.swalInstance) {
|
|
346
|
+
this.swalInstance.close();
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
} catch (error) {
|
|
350
|
+
// 静默处理跨域错误,不在控制台显示
|
|
351
|
+
if (error.name !== "SecurityError") {
|
|
352
|
+
console.warn("Message event handler error:", error);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
});
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
2. **验证跨域配置**
|
|
359
|
+
```javascript
|
|
360
|
+
// 确保正确的跨域配置
|
|
361
|
+
const allowedOrigins = [
|
|
362
|
+
"https://trusted-domain.com",
|
|
363
|
+
"https://*.ihotel.cn",
|
|
364
|
+
window.location.origin
|
|
365
|
+
];
|
|
366
|
+
|
|
367
|
+
// 在发送消息时指定正确的目标源
|
|
368
|
+
iframe.contentWindow.postMessage(data, targetOrigin);
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
3. **检查消息事件监听器**
|
|
372
|
+
```javascript
|
|
373
|
+
// 验证消息事件监听器的正确性
|
|
374
|
+
if (window.top && window.top !== window) {
|
|
375
|
+
window.top.addEventListener("message", messageHandler);
|
|
376
|
+
} else {
|
|
377
|
+
console.warn("无法设置跨域消息监听器");
|
|
378
|
+
}
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
4. **实现优雅降级**
|
|
382
|
+
```javascript
|
|
383
|
+
// 如果跨域检查失败,使用替代方案
|
|
384
|
+
function handleMessage(event) {
|
|
385
|
+
try {
|
|
386
|
+
// 1.5.1版本的改进检查
|
|
387
|
+
if (!event.origin || event.origin === "null") {
|
|
388
|
+
// 静默忽略,不输出错误日志
|
|
389
|
+
return;
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
// 处理消息事件
|
|
393
|
+
processMessage(event.data);
|
|
394
|
+
} catch (error) {
|
|
395
|
+
// 只记录非跨域相关的错误
|
|
396
|
+
if (error.name !== "SecurityError") {
|
|
397
|
+
console.warn("消息处理错误:", error);
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
```
|
|
402
|
+
|
|
403
|
+
5. **监控消息事件状态**
|
|
404
|
+
```javascript
|
|
405
|
+
// 添加消息事件处理的状态监控
|
|
406
|
+
let messageHandlerStatus = {
|
|
407
|
+
initialized: false,
|
|
408
|
+
lastError: null,
|
|
409
|
+
errorCount: 0
|
|
410
|
+
};
|
|
411
|
+
|
|
412
|
+
function setupMessageHandler() {
|
|
413
|
+
try {
|
|
414
|
+
window.top.addEventListener("message", handleMessage);
|
|
415
|
+
messageHandlerStatus.initialized = true;
|
|
416
|
+
console.log("消息事件处理器已初始化");
|
|
417
|
+
} catch (error) {
|
|
418
|
+
messageHandlerStatus.lastError = error;
|
|
419
|
+
messageHandlerStatus.errorCount++;
|
|
420
|
+
console.warn("消息事件处理器初始化失败:", error);
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
**Section sources**
|
|
426
|
+
- [packages/index.js:661-681](file://packages/index.js#L661-L681)
|
|
427
|
+
|
|
428
|
+
## 跨域消息处理安全检查
|
|
429
|
+
|
|
430
|
+
**更新** 新增此章节,反映1.5.2版本中改进的跨域消息处理机制
|
|
431
|
+
|
|
432
|
+
### 根本原因分析
|
|
433
|
+
|
|
434
|
+
1.5.2版本中引入了更精细的跨域消息处理安全检查机制:
|
|
435
|
+
1. **try-catch 包装**:将整个 `window.top.addEventListener('message', ...)` 事件监听器包装在 try-catch 块中
|
|
436
|
+
2. **静默错误处理**:对跨域相关的 SecurityError 进行静默处理,不再输出到控制台
|
|
437
|
+
3. **origin 检查优化**:在事件处理函数内部进行更严格的 origin 检查
|
|
438
|
+
4. **性能优化**:减少跨域错误对性能的影响
|
|
439
|
+
|
|
440
|
+
### 具体解决方案
|
|
441
|
+
|
|
442
|
+
1. **理解1.5.2版本的改进**
|
|
443
|
+
```javascript
|
|
444
|
+
// 1.5.2版本中改进的消息事件处理机制
|
|
445
|
+
try {
|
|
446
|
+
window.top.addEventListener("message", (event) => {
|
|
447
|
+
// 跨域检查:如果源不匹配,跳过处理以避免安全错误
|
|
448
|
+
if (!event.origin || event.origin === "null") {
|
|
449
|
+
return;
|
|
450
|
+
}
|
|
451
|
+
console.log("打印接收到的数据message:", event.data);
|
|
452
|
+
if (event.data && event.data.type === "updateLanguage") {
|
|
453
|
+
location.reload();
|
|
454
|
+
} else if (event.data && event.data.type === "closeModal") {
|
|
455
|
+
if (this.swalInstance) {
|
|
456
|
+
this.swalInstance.close();
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
});
|
|
460
|
+
} catch (error) {
|
|
461
|
+
// 1.5.2版本的改进:静默处理错误,不再输出到控制台
|
|
462
|
+
// 只有非跨域相关的错误才会被记录
|
|
463
|
+
}
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
2. **验证消息事件处理的安全性**
|
|
467
|
+
```javascript
|
|
468
|
+
// 检查消息事件处理的安全状态
|
|
469
|
+
const messageHandlerSecurity = {
|
|
470
|
+
tryCatchWrapped: true, // 1.5.2版本特性
|
|
471
|
+
originCheckEnabled: true,
|
|
472
|
+
errorSilent: true, // 静默处理跨域错误
|
|
473
|
+
performanceOptimized: true
|
|
474
|
+
};
|
|
475
|
+
|
|
476
|
+
// 验证消息事件监听器的安装
|
|
477
|
+
function verifyMessageHandlerInstallation() {
|
|
478
|
+
try {
|
|
479
|
+
// 检查是否正确安装了try-catch包装
|
|
480
|
+
const listeners = window.getEventListeners(window);
|
|
481
|
+
const messageListeners = listeners.message || [];
|
|
482
|
+
|
|
483
|
+
if (messageListeners.length > 0) {
|
|
484
|
+
console.log("消息事件处理器已正确安装");
|
|
485
|
+
return true;
|
|
486
|
+
}
|
|
487
|
+
} catch (error) {
|
|
488
|
+
console.warn("无法验证消息事件处理器状态:", error);
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
return false;
|
|
492
|
+
}
|
|
493
|
+
```
|
|
494
|
+
|
|
495
|
+
3. **监控跨域消息处理性能**
|
|
496
|
+
```javascript
|
|
497
|
+
// 监控跨域消息处理的性能指标
|
|
498
|
+
const messageHandlerPerformance = {
|
|
499
|
+
initializationTime: 0,
|
|
500
|
+
errorCount: 0,
|
|
501
|
+
crossDomainErrors: 0,
|
|
502
|
+
processingTime: 0
|
|
503
|
+
};
|
|
504
|
+
|
|
505
|
+
function setupMessageHandlerMonitoring() {
|
|
506
|
+
const startTime = performance.now();
|
|
507
|
+
|
|
508
|
+
try {
|
|
509
|
+
window.top.addEventListener("message", (event) => {
|
|
510
|
+
const processingStart = performance.now();
|
|
511
|
+
|
|
512
|
+
try {
|
|
513
|
+
// 跨域检查
|
|
514
|
+
if (!event.origin || event.origin === "null") {
|
|
515
|
+
messageHandlerPerformance.crossDomainErrors++;
|
|
516
|
+
return;
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
// 处理消息事件
|
|
520
|
+
processMessage(event.data);
|
|
521
|
+
} catch (error) {
|
|
522
|
+
messageHandlerPerformance.errorCount++;
|
|
523
|
+
// 只记录非跨域相关的错误
|
|
524
|
+
if (error.name !== "SecurityError") {
|
|
525
|
+
console.warn("消息处理错误:", error);
|
|
526
|
+
}
|
|
527
|
+
} finally {
|
|
528
|
+
messageHandlerPerformance.processingTime = performance.now() - processingStart;
|
|
529
|
+
}
|
|
530
|
+
});
|
|
531
|
+
|
|
532
|
+
messageHandlerPerformance.initializationTime = performance.now() - startTime;
|
|
533
|
+
console.log("消息事件处理器初始化完成,耗时:", messageHandlerPerformance.initializationTime, "ms");
|
|
534
|
+
} catch (error) {
|
|
535
|
+
messageHandlerPerformance.errorCount++;
|
|
536
|
+
console.warn("消息事件处理器初始化失败:", error);
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
```
|
|
540
|
+
|
|
541
|
+
4. **测试跨域消息处理的安全性**
|
|
542
|
+
```javascript
|
|
543
|
+
// 测试跨域消息处理的安全性
|
|
544
|
+
function testCrossDomainMessageHandling() {
|
|
545
|
+
// 测试null origin的情况
|
|
546
|
+
const nullOriginEvent = { origin: null, data: { type: 'updateLanguage' } };
|
|
547
|
+
|
|
548
|
+
try {
|
|
549
|
+
// 这应该被静默忽略,不会产生错误日志
|
|
550
|
+
handleMessage(nullOriginEvent);
|
|
551
|
+
console.log("null origin测试通过:静默忽略跨域消息");
|
|
552
|
+
} catch (error) {
|
|
553
|
+
console.error("null origin测试失败:", error);
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
// 测试SecurityError的处理
|
|
557
|
+
try {
|
|
558
|
+
// 模拟SecurityError的静默处理
|
|
559
|
+
throw new Error('SecurityError');
|
|
560
|
+
} catch (error) {
|
|
561
|
+
if (error.name !== "SecurityError") {
|
|
562
|
+
console.warn("消息处理错误:", error);
|
|
563
|
+
} else {
|
|
564
|
+
console.log("SecurityError被静默处理,符合1.5.2版本行为");
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
```
|
|
569
|
+
|
|
570
|
+
**Section sources**
|
|
571
|
+
- [packages/index.js:660-676](file://packages/index.js#L660-L676)
|
|
572
|
+
- [lib/gc_i18n.es.js:3111-3116](file://lib/gc_i18n.es.js#L3111-L3116)
|
|
311
573
|
|
|
312
574
|
## 调试模式与日志查看
|
|
313
575
|
|
|
@@ -329,11 +591,16 @@ const { i18n } = new gc_i18n({
|
|
|
329
591
|
- 语言切换时的 token 更新
|
|
330
592
|
- 翻译键的收集过程
|
|
331
593
|
- 网络请求的详细信息
|
|
594
|
+
- **新增** 消息事件处理的日志输出
|
|
595
|
+
- **新增** 跨域消息处理的安全日志
|
|
332
596
|
|
|
333
597
|
```javascript
|
|
334
598
|
// 示例日志输出
|
|
335
599
|
console.log(" this.token", this.token);
|
|
336
600
|
console.log(" this.token2", this.token);
|
|
601
|
+
console.log("打印接收到的数据message:", event.data); // 1.5.1版本新增
|
|
602
|
+
console.log("消息事件处理器已初始化"); // 1.5.2版本新增
|
|
603
|
+
console.log("SecurityError被静默处理,符合1.5.2版本行为"); // 1.5.2版本新增
|
|
337
604
|
```
|
|
338
605
|
|
|
339
606
|
3. **监控关键事件**
|
|
@@ -350,6 +617,17 @@ setupLanguageChangeListener() {
|
|
|
350
617
|
});
|
|
351
618
|
}
|
|
352
619
|
}
|
|
620
|
+
|
|
621
|
+
// 监控消息事件处理状态
|
|
622
|
+
setupMessageHandlerMonitoring() {
|
|
623
|
+
const originalAddEventListener = window.addEventListener;
|
|
624
|
+
window.addEventListener = function(type, listener, options) {
|
|
625
|
+
if (type === "message") {
|
|
626
|
+
console.log("设置消息事件监听器");
|
|
627
|
+
}
|
|
628
|
+
return originalAddEventListener.apply(this, arguments);
|
|
629
|
+
};
|
|
630
|
+
}
|
|
353
631
|
```
|
|
354
632
|
|
|
355
633
|
### 关键日志位置
|
|
@@ -358,8 +636,10 @@ setupLanguageChangeListener() {
|
|
|
358
636
|
2. **翻译键收集日志**:路由守卫中的 `extractTranslationKeys` 调用
|
|
359
637
|
3. **网络请求日志**:`service.js` 中的 `getTranslate` 和 `fetchTranslate` 方法
|
|
360
638
|
4. **错误日志**:异步组件加载失败时的 `console.error`
|
|
639
|
+
5. **消息事件日志**:1.5.1版本新增的消息事件处理日志
|
|
640
|
+
6. **跨域消息处理日志**:1.5.2版本新增的跨域消息处理安全日志
|
|
361
641
|
|
|
362
|
-
|
|
642
|
+
```mermaid
|
|
363
643
|
sequenceDiagram
|
|
364
644
|
participant User as 用户
|
|
365
645
|
participant App as 应用
|
|
@@ -374,12 +654,12 @@ App-->>User : 界面语言更新
|
|
|
374
654
|
```
|
|
375
655
|
|
|
376
656
|
**Diagram sources**
|
|
377
|
-
- [packages/index.js](file://packages/index.js#L250-L277)
|
|
378
|
-
- [packages/libs/service.js](file://packages/libs/service.js#L65-L123)
|
|
657
|
+
- [packages/index.js:250-277](file://packages/index.js#L250-L277)
|
|
658
|
+
- [packages/libs/service.js:65-123](file://packages/libs/service.js#L65-L123)
|
|
379
659
|
|
|
380
660
|
**Section sources**
|
|
381
|
-
- [packages/index.js](file://packages/index.js#L250-L277)
|
|
382
|
-
- [packages/libs/service.js](file://packages/libs/service.js#L65-L123)
|
|
661
|
+
- [packages/index.js:250-277](file://packages/index.js#L250-L277)
|
|
662
|
+
- [packages/libs/service.js:65-123](file://packages/libs/service.js#L65-L123)
|
|
383
663
|
|
|
384
664
|
## 配置有效性验证
|
|
385
665
|
|
|
@@ -442,10 +722,33 @@ console.log("I18N_TOKEN:", store2.get("I18N_TOKEN"));
|
|
|
442
722
|
console.log("I18N_LANGUAGES:", store2.get("I18N_LANGUAGES"));
|
|
443
723
|
```
|
|
444
724
|
|
|
725
|
+
3. **验证消息事件处理配置**:1.5.1版本新增
|
|
726
|
+
```javascript
|
|
727
|
+
// 检查消息事件处理状态
|
|
728
|
+
console.log("消息事件处理器状态:", messageHandlerStatus);
|
|
729
|
+
|
|
730
|
+
// 验证跨域配置
|
|
731
|
+
console.log("允许的来源:", allowedOrigins);
|
|
732
|
+
console.log("当前窗口来源:", window.location.origin);
|
|
733
|
+
```
|
|
734
|
+
|
|
735
|
+
4. **验证跨域消息处理安全性**:1.5.2版本新增
|
|
736
|
+
```javascript
|
|
737
|
+
// 检查跨域消息处理的安全状态
|
|
738
|
+
console.log("try-catch包装:", messageHandlerSecurity.tryCatchWrapped);
|
|
739
|
+
console.log("origin检查:", messageHandlerSecurity.originCheckEnabled);
|
|
740
|
+
console.log("静默错误处理:", messageHandlerSecurity.errorSilent);
|
|
741
|
+
console.log("性能优化:", messageHandlerSecurity.performanceOptimized);
|
|
742
|
+
|
|
743
|
+
// 验证消息事件处理器安装
|
|
744
|
+
verifyMessageHandlerInstallation();
|
|
745
|
+
```
|
|
746
|
+
|
|
445
747
|
**Section sources**
|
|
446
|
-
- [main.js](file://src/main.js#L0-L9)
|
|
447
|
-
- [lang/index.js](file://lang/index.js#L0-L42)
|
|
448
|
-
- [packages/index.js](file://packages/index.js#L0-L325)
|
|
748
|
+
- [main.js:0-9](file://src/main.js#L0-L9)
|
|
749
|
+
- [lang/index.js:0-42](file://lang/index.js#L0-L42)
|
|
750
|
+
- [packages/index.js:0-325](file://packages/index.js#L0-L325)
|
|
751
|
+
- [package.json:1-48](file://package.json#L1-L48)
|
|
449
752
|
|
|
450
753
|
## 测试策略建议
|
|
451
754
|
|
|
@@ -504,6 +807,92 @@ test('should handle async components in route guards', async () => {
|
|
|
504
807
|
});
|
|
505
808
|
```
|
|
506
809
|
|
|
810
|
+
3. **测试消息事件处理**:1.5.1版本新增
|
|
811
|
+
```javascript
|
|
812
|
+
// 测试跨域消息事件处理
|
|
813
|
+
test('should handle cross-domain messages safely', () => {
|
|
814
|
+
const messageHandler = jest.fn();
|
|
815
|
+
const originalAddEventListener = window.addEventListener;
|
|
816
|
+
window.addEventListener = messageHandler;
|
|
817
|
+
|
|
818
|
+
setupMessageHandler();
|
|
819
|
+
|
|
820
|
+
// 测试 null origin 的情况
|
|
821
|
+
const nullOriginEvent = { origin: null, data: { type: 'updateLanguage' } };
|
|
822
|
+
window.dispatchEvent(new MessageEvent('message', nullOriginEvent));
|
|
823
|
+
|
|
824
|
+
expect(messageHandler).toHaveBeenCalled();
|
|
825
|
+
expect(console.warn).not.toHaveBeenCalledWith("Message event handler error:");
|
|
826
|
+
});
|
|
827
|
+
|
|
828
|
+
// 测试 SecurityError 的静默处理
|
|
829
|
+
test('should silently handle SecurityError', () => {
|
|
830
|
+
const originalConsoleWarn = console.warn;
|
|
831
|
+
console.warn = jest.fn();
|
|
832
|
+
|
|
833
|
+
// 模拟 SecurityError
|
|
834
|
+
const securityError = new Error('SecurityError');
|
|
835
|
+
securityError.name = 'SecurityError';
|
|
836
|
+
|
|
837
|
+
try {
|
|
838
|
+
throw securityError;
|
|
839
|
+
} catch (error) {
|
|
840
|
+
if (error.name !== "SecurityError") {
|
|
841
|
+
console.warn("Message event handler error:", error);
|
|
842
|
+
}
|
|
843
|
+
}
|
|
844
|
+
|
|
845
|
+
expect(console.warn).not.toHaveBeenCalled();
|
|
846
|
+
console.warn = originalConsoleWarn;
|
|
847
|
+
});
|
|
848
|
+
```
|
|
849
|
+
|
|
850
|
+
4. **测试跨域消息处理安全性**:1.5.2版本新增
|
|
851
|
+
```javascript
|
|
852
|
+
// 测试1.5.2版本的try-catch包装机制
|
|
853
|
+
test('should wrap message handler in try-catch for security', () => {
|
|
854
|
+
const originalAddEventListener = window.addEventListener;
|
|
855
|
+
const messageHandler = jest.fn();
|
|
856
|
+
|
|
857
|
+
// 模拟try-catch包装
|
|
858
|
+
const wrappedHandler = function(type, listener, options) {
|
|
859
|
+
if (type === "message") {
|
|
860
|
+
return originalAddEventListener.call(this, type, function(event) {
|
|
861
|
+
try {
|
|
862
|
+
listener(event);
|
|
863
|
+
} catch (error) {
|
|
864
|
+
// 1.5.2版本:静默处理错误
|
|
865
|
+
if (error.name !== "SecurityError") {
|
|
866
|
+
throw error; // 只抛出非跨域相关错误
|
|
867
|
+
}
|
|
868
|
+
}
|
|
869
|
+
}, options);
|
|
870
|
+
}
|
|
871
|
+
return originalAddEventListener.call(this, type, listener, options);
|
|
872
|
+
};
|
|
873
|
+
|
|
874
|
+
window.addEventListener = wrappedHandler;
|
|
875
|
+
setupMessageHandler();
|
|
876
|
+
|
|
877
|
+
// 测试SecurityError的静默处理
|
|
878
|
+
const securityErrorEvent = { origin: null, data: { type: 'updateLanguage' } };
|
|
879
|
+
expect(() => {
|
|
880
|
+
window.dispatchEvent(new MessageEvent('message', securityErrorEvent));
|
|
881
|
+
}).not.toThrow();
|
|
882
|
+
});
|
|
883
|
+
|
|
884
|
+
// 测试跨域消息处理性能监控
|
|
885
|
+
test('should monitor cross-domain message handler performance', () => {
|
|
886
|
+
setupMessageHandlerMonitoring();
|
|
887
|
+
|
|
888
|
+
// 验证性能指标
|
|
889
|
+
expect(messageHandlerPerformance.initializationTime).toBeGreaterThan(0);
|
|
890
|
+
expect(messageHandlerPerformance.errorCount).toBeGreaterThanOrEqual(0);
|
|
891
|
+
expect(messageHandlerPerformance.crossDomainErrors).toBeGreaterThanOrEqual(0);
|
|
892
|
+
expect(messageHandlerPerformance.processingTime).toBeGreaterThanOrEqual(0);
|
|
893
|
+
});
|
|
894
|
+
```
|
|
895
|
+
|
|
507
896
|
### 端到端测试
|
|
508
897
|
|
|
509
898
|
1. **模拟真实用户场景**
|
|
@@ -511,15 +900,20 @@ test('should handle async components in route guards', async () => {
|
|
|
511
900
|
- 测试语言切换后的界面更新
|
|
512
901
|
- 验证登录页面的特殊处理
|
|
513
902
|
- 检查浏览器语言变化的自动响应
|
|
903
|
+
- **新增** 验证跨域消息通信的稳定性
|
|
904
|
+
- **新增** 验证跨域消息处理的安全性
|
|
514
905
|
|
|
515
906
|
2. **性能测试**
|
|
516
907
|
- 测量语言包加载时间
|
|
517
908
|
- 验证缓存机制的有效性
|
|
518
909
|
- 测试大量翻译键的处理性能
|
|
910
|
+
- **新增** 测试消息事件处理的性能开销
|
|
911
|
+
- **新增** 测试跨域消息处理的性能优化效果
|
|
519
912
|
|
|
520
|
-
|
|
913
|
+
通过实施这些测试策略,可以有效预防常见错误,确保国际化功能的稳定性和可靠性,特别是1.5.2版本中改进的消息事件处理安全性。
|
|
521
914
|
|
|
522
915
|
**Section sources**
|
|
523
|
-
- [packages/index.js](file://packages/index.js#L0-L325)
|
|
524
|
-
- [packages/libs/i18nUtils.ts](file://packages/libs/i18nUtils.ts#L0-L52)
|
|
525
|
-
- [packages/libs/service.js](file://packages/libs/service.js#L0-L123)
|
|
916
|
+
- [packages/index.js:0-325](file://packages/index.js#L0-L325)
|
|
917
|
+
- [packages/libs/i18nUtils.ts:0-52](file://packages/libs/i18nUtils.ts#L0-L52)
|
|
918
|
+
- [packages/libs/service.js:0-123](file://packages/libs/service.js#L0-L123)
|
|
919
|
+
- [package.json:1-48](file://package.json#L1-L48)
|