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.
@@ -16,9 +16,10 @@
16
16
 
17
17
  ## 更新摘要
18
18
  **变更内容**
19
- - 新增了"消息事件处理错误"章节,专门针对1.5.1版本改进的消息事件处理错误处理机制
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.1版本特别加强了消息事件处理的安全性和稳定性。以下将针对每个问题提供详细的根因分析和解决方案。
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. ****消息事件日志**:**1.5.1版本新增** `packages/index.js` 中的消息事件处理日志
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. ****验证消息事件处理配置**:**1.5.1版本新增**
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. ****测试消息事件处理**:**1.5.1版本新增**
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.1版本中改进的消息事件处理安全性。
913
+ 通过实施这些测试策略,可以有效预防常见错误,确保国际化功能的稳定性和可靠性,特别是1.5.2版本中改进的消息事件处理安全性。
701
914
 
702
915
  **Section sources**
703
916
  - [packages/index.js:0-325](file://packages/index.js#L0-L325)