gc_i18n 1.5.2 → 1.5.5
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 +224 -11
- package/.qoder/repowiki/zh/meta/repowiki-metadata.json +1 -1
- package/AGENTS.md +24 -0
- package/example/vue3-test/src/views/Home.vue +1 -0
- package/lang/index.json +4 -0
- package/lib/gc_i18n.css +1 -1
- package/lib/gc_i18n.es.js +768 -740
- package/lib/gc_i18n.umd.js +18 -18
- package/package.json +2 -5
- package/packages/index.js +56 -12
- package/packages/libs/service.js +43 -37
- package/packages/swal.css +14 -0
|
@@ -16,9 +16,10 @@
|
|
|
16
16
|
|
|
17
17
|
## 更新摘要
|
|
18
18
|
**变更内容**
|
|
19
|
-
-
|
|
20
|
-
-
|
|
21
|
-
-
|
|
19
|
+
- 更新了"消息事件处理错误"章节,反映1.5.2版本中改进的跨域消息处理机制
|
|
20
|
+
- 新增了"跨域消息处理安全检查"章节,专门介绍1.5.2版本的try-catch包装机制
|
|
21
|
+
- 更新了"调试模式与日志查看"部分,增加了跨域消息处理的安全性日志输出
|
|
22
|
+
- 在"配置有效性验证"中添加了跨域消息处理的安全性验证要点
|
|
22
23
|
- 保持了原有文档结构和未受影响部分的完整性
|
|
23
24
|
|
|
24
25
|
## 目录
|
|
@@ -27,9 +28,10 @@
|
|
|
27
28
|
3. [翻译文本显示为键名](#翻译文本显示为键名)
|
|
28
29
|
4. [加载失败问题](#加载失败问题)
|
|
29
30
|
5. [消息事件处理错误](#消息事件处理错误)
|
|
30
|
-
6. [
|
|
31
|
-
7. [
|
|
32
|
-
8. [
|
|
31
|
+
6. [跨域消息处理安全检查](#跨域消息处理安全检查)
|
|
32
|
+
7. [调试模式与日志查看](#调试模式与日志查看)
|
|
33
|
+
8. [配置有效性验证](#配置有效性验证)
|
|
34
|
+
9. [测试策略建议](#测试策略建议)
|
|
33
35
|
|
|
34
36
|
## 常见问题汇总
|
|
35
37
|
|
|
@@ -40,8 +42,9 @@
|
|
|
40
42
|
- **异步组件问题**:动态加载的组件中翻译键未被正确收集
|
|
41
43
|
- **缓存问题**:旧的语言数据未被清除,影响新语言的加载
|
|
42
44
|
- **消息事件处理错误**:跨域消息通信时出现安全错误或异常
|
|
45
|
+
- **跨域消息处理安全问题**:1.5.2版本中新增的跨域消息处理安全检查
|
|
43
46
|
|
|
44
|
-
这些问题通常源于配置错误、异步处理不当或依赖关系未正确处理。1.5.
|
|
47
|
+
这些问题通常源于配置错误、异步处理不当或依赖关系未正确处理。1.5.2版本特别加强了跨域消息处理的安全性和稳定性。以下将针对每个问题提供详细的根因分析和解决方案。
|
|
45
48
|
|
|
46
49
|
## 语言不切换问题
|
|
47
50
|
|
|
@@ -422,6 +425,152 @@ function setupMessageHandler() {
|
|
|
422
425
|
**Section sources**
|
|
423
426
|
- [packages/index.js:661-681](file://packages/index.js#L661-L681)
|
|
424
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)
|
|
573
|
+
|
|
425
574
|
## 调试模式与日志查看
|
|
426
575
|
|
|
427
576
|
### 启用调试模式
|
|
@@ -443,12 +592,15 @@ const { i18n } = new gc_i18n({
|
|
|
443
592
|
- 翻译键的收集过程
|
|
444
593
|
- 网络请求的详细信息
|
|
445
594
|
- **新增** 消息事件处理的日志输出
|
|
595
|
+
- **新增** 跨域消息处理的安全日志
|
|
446
596
|
|
|
447
597
|
```javascript
|
|
448
598
|
// 示例日志输出
|
|
449
599
|
console.log(" this.token", this.token);
|
|
450
600
|
console.log(" this.token2", this.token);
|
|
451
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版本新增
|
|
452
604
|
```
|
|
453
605
|
|
|
454
606
|
3. **监控关键事件**
|
|
@@ -484,7 +636,8 @@ setupMessageHandlerMonitoring() {
|
|
|
484
636
|
2. **翻译键收集日志**:路由守卫中的 `extractTranslationKeys` 调用
|
|
485
637
|
3. **网络请求日志**:`service.js` 中的 `getTranslate` 和 `fetchTranslate` 方法
|
|
486
638
|
4. **错误日志**:异步组件加载失败时的 `console.error`
|
|
487
|
-
5.
|
|
639
|
+
5. **消息事件日志**:1.5.1版本新增的消息事件处理日志
|
|
640
|
+
6. **跨域消息处理日志**:1.5.2版本新增的跨域消息处理安全日志
|
|
488
641
|
|
|
489
642
|
```mermaid
|
|
490
643
|
sequenceDiagram
|
|
@@ -569,7 +722,7 @@ console.log("I18N_TOKEN:", store2.get("I18N_TOKEN"));
|
|
|
569
722
|
console.log("I18N_LANGUAGES:", store2.get("I18N_LANGUAGES"));
|
|
570
723
|
```
|
|
571
724
|
|
|
572
|
-
3.
|
|
725
|
+
3. **验证消息事件处理配置**:1.5.1版本新增
|
|
573
726
|
```javascript
|
|
574
727
|
// 检查消息事件处理状态
|
|
575
728
|
console.log("消息事件处理器状态:", messageHandlerStatus);
|
|
@@ -579,6 +732,18 @@ console.log("允许的来源:", allowedOrigins);
|
|
|
579
732
|
console.log("当前窗口来源:", window.location.origin);
|
|
580
733
|
```
|
|
581
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
|
+
|
|
582
747
|
**Section sources**
|
|
583
748
|
- [main.js:0-9](file://src/main.js#L0-L9)
|
|
584
749
|
- [lang/index.js:0-42](file://lang/index.js#L0-L42)
|
|
@@ -642,7 +807,7 @@ test('should handle async components in route guards', async () => {
|
|
|
642
807
|
});
|
|
643
808
|
```
|
|
644
809
|
|
|
645
|
-
3.
|
|
810
|
+
3. **测试消息事件处理**:1.5.1版本新增
|
|
646
811
|
```javascript
|
|
647
812
|
// 测试跨域消息事件处理
|
|
648
813
|
test('should handle cross-domain messages safely', () => {
|
|
@@ -682,6 +847,52 @@ test('should silently handle SecurityError', () => {
|
|
|
682
847
|
});
|
|
683
848
|
```
|
|
684
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
|
+
|
|
685
896
|
### 端到端测试
|
|
686
897
|
|
|
687
898
|
1. **模拟真实用户场景**
|
|
@@ -690,14 +901,16 @@ test('should silently handle SecurityError', () => {
|
|
|
690
901
|
- 验证登录页面的特殊处理
|
|
691
902
|
- 检查浏览器语言变化的自动响应
|
|
692
903
|
- **新增** 验证跨域消息通信的稳定性
|
|
904
|
+
- **新增** 验证跨域消息处理的安全性
|
|
693
905
|
|
|
694
906
|
2. **性能测试**
|
|
695
907
|
- 测量语言包加载时间
|
|
696
908
|
- 验证缓存机制的有效性
|
|
697
909
|
- 测试大量翻译键的处理性能
|
|
698
910
|
- **新增** 测试消息事件处理的性能开销
|
|
911
|
+
- **新增** 测试跨域消息处理的性能优化效果
|
|
699
912
|
|
|
700
|
-
通过实施这些测试策略,可以有效预防常见错误,确保国际化功能的稳定性和可靠性,特别是1.5.
|
|
913
|
+
通过实施这些测试策略,可以有效预防常见错误,确保国际化功能的稳定性和可靠性,特别是1.5.2版本中改进的消息事件处理安全性。
|
|
701
914
|
|
|
702
915
|
**Section sources**
|
|
703
916
|
- [packages/index.js:0-325](file://packages/index.js#L0-L325)
|