gc_i18n 1.5.1 → 1.5.2
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 +211 -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/lib/gc_i18n.es.js +6 -8
- package/lib/gc_i18n.umd.js +1 -1
- package/package.json +1 -1
- package/packages/index.js +4 -10
|
@@ -10,14 +10,15 @@
|
|
|
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.1版本改进的消息事件处理错误处理机制
|
|
20
|
+
- 更新了"调试模式与日志查看"部分,增加了跨域安全检查相关的日志输出
|
|
21
|
+
- 在"配置有效性验证"中添加了消息事件处理的安全性验证要点
|
|
21
22
|
- 保持了原有文档结构和未受影响部分的完整性
|
|
22
23
|
|
|
23
24
|
## 目录
|
|
@@ -25,9 +26,10 @@
|
|
|
25
26
|
2. [语言不切换问题](#语言不切换问题)
|
|
26
27
|
3. [翻译文本显示为键名](#翻译文本显示为键名)
|
|
27
28
|
4. [加载失败问题](#加载失败问题)
|
|
28
|
-
5. [
|
|
29
|
-
6. [
|
|
30
|
-
7. [
|
|
29
|
+
5. [消息事件处理错误](#消息事件处理错误)
|
|
30
|
+
6. [调试模式与日志查看](#调试模式与日志查看)
|
|
31
|
+
7. [配置有效性验证](#配置有效性验证)
|
|
32
|
+
8. [测试策略建议](#测试策略建议)
|
|
31
33
|
|
|
32
34
|
## 常见问题汇总
|
|
33
35
|
|
|
@@ -37,8 +39,9 @@
|
|
|
37
39
|
- **加载失败**:语言包无法正确加载,导致翻译功能失效
|
|
38
40
|
- **异步组件问题**:动态加载的组件中翻译键未被正确收集
|
|
39
41
|
- **缓存问题**:旧的语言数据未被清除,影响新语言的加载
|
|
42
|
+
- **消息事件处理错误**:跨域消息通信时出现安全错误或异常
|
|
40
43
|
|
|
41
|
-
|
|
44
|
+
这些问题通常源于配置错误、异步处理不当或依赖关系未正确处理。1.5.1版本特别加强了消息事件处理的安全性和稳定性。以下将针对每个问题提供详细的根因分析和解决方案。
|
|
42
45
|
|
|
43
46
|
## 语言不切换问题
|
|
44
47
|
|
|
@@ -91,8 +94,8 @@ this.router.beforeEach(async (to, from, next) => {
|
|
|
91
94
|
```
|
|
92
95
|
|
|
93
96
|
**Section sources**
|
|
94
|
-
- [packages/index.js](file://packages/index.js#L231-L277)
|
|
95
|
-
- [packages/index.js](file://packages/index.js#L160-L194)
|
|
97
|
+
- [packages/index.js:231-277](file://packages/index.js#L231-L277)
|
|
98
|
+
- [packages/index.js:160-194](file://packages/index.js#L160-L194)
|
|
96
99
|
|
|
97
100
|
## 翻译文本显示为键名
|
|
98
101
|
|
|
@@ -167,7 +170,7 @@ globalThis.$clearI18n();
|
|
|
167
170
|
store2.namespace(`I18N_${appCode.toUpperCase()}`).clearAll();
|
|
168
171
|
```
|
|
169
172
|
|
|
170
|
-
|
|
173
|
+
```mermaid
|
|
171
174
|
flowchart TD
|
|
172
175
|
A[开始] --> B{翻译键存在?}
|
|
173
176
|
B --> |是| C[返回翻译文本]
|
|
@@ -185,12 +188,12 @@ D --> |否| M[返回原始键名]
|
|
|
185
188
|
```
|
|
186
189
|
|
|
187
190
|
**Diagram sources**
|
|
188
|
-
- [packages/index.js](file://packages/index.js#L200-L230)
|
|
191
|
+
- [packages/index.js:200-230](file://packages/index.js#L200-L230)
|
|
189
192
|
|
|
190
193
|
**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)
|
|
194
|
+
- [packages/index.js:200-230](file://packages/index.js#L200-L230)
|
|
195
|
+
- [packages/libs/i18nUtils.ts:0-52](file://packages/libs/i18nUtils.ts#L0-L52)
|
|
196
|
+
- [packages/libs/service.js:65-123](file://packages/libs/service.js#L65-L123)
|
|
194
197
|
|
|
195
198
|
## 加载失败问题
|
|
196
199
|
|
|
@@ -305,9 +308,119 @@ async setLanguage(language) {
|
|
|
305
308
|
```
|
|
306
309
|
|
|
307
310
|
**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)
|
|
311
|
+
- [packages/index.js:250-277](file://packages/index.js#L250-L277)
|
|
312
|
+
- [packages/libs/service.js:65-123](file://packages/libs/service.js#L65-L123)
|
|
313
|
+
- [packages/libs/utils.js:9-28](file://packages/libs/utils.js#L9-L28)
|
|
314
|
+
|
|
315
|
+
## 消息事件处理错误
|
|
316
|
+
|
|
317
|
+
**更新** 新增此章节,反映1.5.1版本中改进的消息事件处理错误处理机制
|
|
318
|
+
|
|
319
|
+
### 根本原因分析
|
|
320
|
+
|
|
321
|
+
消息事件处理错误主要出现在跨域通信场景中,1.5.1版本之前可能存在以下问题:
|
|
322
|
+
1. **跨域安全错误**:直接访问 `event.origin` 导致 SecurityError
|
|
323
|
+
2. **未捕获的异常**:try-catch 机制不完善,导致错误传播到控制台
|
|
324
|
+
3. **调试困难**:跨域错误与业务逻辑错误混合,难以区分
|
|
325
|
+
4. **性能影响**:频繁的跨域错误导致不必要的日志输出
|
|
326
|
+
|
|
327
|
+
### 具体解决方案
|
|
328
|
+
|
|
329
|
+
1. **启用跨域安全检查**
|
|
330
|
+
```javascript
|
|
331
|
+
// 1.5.1版本中改进的消息事件处理
|
|
332
|
+
window.top.addEventListener("message", (event) => {
|
|
333
|
+
try {
|
|
334
|
+
// 跨域检查:如果源不匹配,跳过处理以避免安全错误
|
|
335
|
+
if (!event.origin || event.origin === "null") {
|
|
336
|
+
return;
|
|
337
|
+
}
|
|
338
|
+
console.log("打印接收到的数据message:", event.data);
|
|
339
|
+
if (event.data && event.data.type === "updateLanguage") {
|
|
340
|
+
location.reload();
|
|
341
|
+
} else if (event.data && event.data.type === "closeModal") {
|
|
342
|
+
if (this.swalInstance) {
|
|
343
|
+
this.swalInstance.close();
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
} catch (error) {
|
|
347
|
+
// 静默处理跨域错误,不在控制台显示
|
|
348
|
+
if (error.name !== "SecurityError") {
|
|
349
|
+
console.warn("Message event handler error:", error);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
});
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
2. **验证跨域配置**
|
|
356
|
+
```javascript
|
|
357
|
+
// 确保正确的跨域配置
|
|
358
|
+
const allowedOrigins = [
|
|
359
|
+
"https://trusted-domain.com",
|
|
360
|
+
"https://*.ihotel.cn",
|
|
361
|
+
window.location.origin
|
|
362
|
+
];
|
|
363
|
+
|
|
364
|
+
// 在发送消息时指定正确的目标源
|
|
365
|
+
iframe.contentWindow.postMessage(data, targetOrigin);
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
3. **检查消息事件监听器**
|
|
369
|
+
```javascript
|
|
370
|
+
// 验证消息事件监听器的正确性
|
|
371
|
+
if (window.top && window.top !== window) {
|
|
372
|
+
window.top.addEventListener("message", messageHandler);
|
|
373
|
+
} else {
|
|
374
|
+
console.warn("无法设置跨域消息监听器");
|
|
375
|
+
}
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
4. **实现优雅降级**
|
|
379
|
+
```javascript
|
|
380
|
+
// 如果跨域检查失败,使用替代方案
|
|
381
|
+
function handleMessage(event) {
|
|
382
|
+
try {
|
|
383
|
+
// 1.5.1版本的改进检查
|
|
384
|
+
if (!event.origin || event.origin === "null") {
|
|
385
|
+
// 静默忽略,不输出错误日志
|
|
386
|
+
return;
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
// 处理消息事件
|
|
390
|
+
processMessage(event.data);
|
|
391
|
+
} catch (error) {
|
|
392
|
+
// 只记录非跨域相关的错误
|
|
393
|
+
if (error.name !== "SecurityError") {
|
|
394
|
+
console.warn("消息处理错误:", error);
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
5. **监控消息事件状态**
|
|
401
|
+
```javascript
|
|
402
|
+
// 添加消息事件处理的状态监控
|
|
403
|
+
let messageHandlerStatus = {
|
|
404
|
+
initialized: false,
|
|
405
|
+
lastError: null,
|
|
406
|
+
errorCount: 0
|
|
407
|
+
};
|
|
408
|
+
|
|
409
|
+
function setupMessageHandler() {
|
|
410
|
+
try {
|
|
411
|
+
window.top.addEventListener("message", handleMessage);
|
|
412
|
+
messageHandlerStatus.initialized = true;
|
|
413
|
+
console.log("消息事件处理器已初始化");
|
|
414
|
+
} catch (error) {
|
|
415
|
+
messageHandlerStatus.lastError = error;
|
|
416
|
+
messageHandlerStatus.errorCount++;
|
|
417
|
+
console.warn("消息事件处理器初始化失败:", error);
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
```
|
|
421
|
+
|
|
422
|
+
**Section sources**
|
|
423
|
+
- [packages/index.js:661-681](file://packages/index.js#L661-L681)
|
|
311
424
|
|
|
312
425
|
## 调试模式与日志查看
|
|
313
426
|
|
|
@@ -329,11 +442,13 @@ const { i18n } = new gc_i18n({
|
|
|
329
442
|
- 语言切换时的 token 更新
|
|
330
443
|
- 翻译键的收集过程
|
|
331
444
|
- 网络请求的详细信息
|
|
445
|
+
- **新增** 消息事件处理的日志输出
|
|
332
446
|
|
|
333
447
|
```javascript
|
|
334
448
|
// 示例日志输出
|
|
335
449
|
console.log(" this.token", this.token);
|
|
336
450
|
console.log(" this.token2", this.token);
|
|
451
|
+
console.log("打印接收到的数据message:", event.data); // 1.5.1版本新增
|
|
337
452
|
```
|
|
338
453
|
|
|
339
454
|
3. **监控关键事件**
|
|
@@ -350,6 +465,17 @@ setupLanguageChangeListener() {
|
|
|
350
465
|
});
|
|
351
466
|
}
|
|
352
467
|
}
|
|
468
|
+
|
|
469
|
+
// 监控消息事件处理状态
|
|
470
|
+
setupMessageHandlerMonitoring() {
|
|
471
|
+
const originalAddEventListener = window.addEventListener;
|
|
472
|
+
window.addEventListener = function(type, listener, options) {
|
|
473
|
+
if (type === "message") {
|
|
474
|
+
console.log("设置消息事件监听器");
|
|
475
|
+
}
|
|
476
|
+
return originalAddEventListener.apply(this, arguments);
|
|
477
|
+
};
|
|
478
|
+
}
|
|
353
479
|
```
|
|
354
480
|
|
|
355
481
|
### 关键日志位置
|
|
@@ -358,8 +484,9 @@ setupLanguageChangeListener() {
|
|
|
358
484
|
2. **翻译键收集日志**:路由守卫中的 `extractTranslationKeys` 调用
|
|
359
485
|
3. **网络请求日志**:`service.js` 中的 `getTranslate` 和 `fetchTranslate` 方法
|
|
360
486
|
4. **错误日志**:异步组件加载失败时的 `console.error`
|
|
487
|
+
5. ****消息事件日志**:**1.5.1版本新增** `packages/index.js` 中的消息事件处理日志
|
|
361
488
|
|
|
362
|
-
|
|
489
|
+
```mermaid
|
|
363
490
|
sequenceDiagram
|
|
364
491
|
participant User as 用户
|
|
365
492
|
participant App as 应用
|
|
@@ -374,12 +501,12 @@ App-->>User : 界面语言更新
|
|
|
374
501
|
```
|
|
375
502
|
|
|
376
503
|
**Diagram sources**
|
|
377
|
-
- [packages/index.js](file://packages/index.js#L250-L277)
|
|
378
|
-
- [packages/libs/service.js](file://packages/libs/service.js#L65-L123)
|
|
504
|
+
- [packages/index.js:250-277](file://packages/index.js#L250-L277)
|
|
505
|
+
- [packages/libs/service.js:65-123](file://packages/libs/service.js#L65-L123)
|
|
379
506
|
|
|
380
507
|
**Section sources**
|
|
381
|
-
- [packages/index.js](file://packages/index.js#L250-L277)
|
|
382
|
-
- [packages/libs/service.js](file://packages/libs/service.js#L65-L123)
|
|
508
|
+
- [packages/index.js:250-277](file://packages/index.js#L250-L277)
|
|
509
|
+
- [packages/libs/service.js:65-123](file://packages/libs/service.js#L65-L123)
|
|
383
510
|
|
|
384
511
|
## 配置有效性验证
|
|
385
512
|
|
|
@@ -442,10 +569,21 @@ console.log("I18N_TOKEN:", store2.get("I18N_TOKEN"));
|
|
|
442
569
|
console.log("I18N_LANGUAGES:", store2.get("I18N_LANGUAGES"));
|
|
443
570
|
```
|
|
444
571
|
|
|
572
|
+
3. ****验证消息事件处理配置**:**1.5.1版本新增**
|
|
573
|
+
```javascript
|
|
574
|
+
// 检查消息事件处理状态
|
|
575
|
+
console.log("消息事件处理器状态:", messageHandlerStatus);
|
|
576
|
+
|
|
577
|
+
// 验证跨域配置
|
|
578
|
+
console.log("允许的来源:", allowedOrigins);
|
|
579
|
+
console.log("当前窗口来源:", window.location.origin);
|
|
580
|
+
```
|
|
581
|
+
|
|
445
582
|
**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)
|
|
583
|
+
- [main.js:0-9](file://src/main.js#L0-L9)
|
|
584
|
+
- [lang/index.js:0-42](file://lang/index.js#L0-L42)
|
|
585
|
+
- [packages/index.js:0-325](file://packages/index.js#L0-L325)
|
|
586
|
+
- [package.json:1-48](file://package.json#L1-L48)
|
|
449
587
|
|
|
450
588
|
## 测试策略建议
|
|
451
589
|
|
|
@@ -504,6 +642,46 @@ test('should handle async components in route guards', async () => {
|
|
|
504
642
|
});
|
|
505
643
|
```
|
|
506
644
|
|
|
645
|
+
3. ****测试消息事件处理**:**1.5.1版本新增**
|
|
646
|
+
```javascript
|
|
647
|
+
// 测试跨域消息事件处理
|
|
648
|
+
test('should handle cross-domain messages safely', () => {
|
|
649
|
+
const messageHandler = jest.fn();
|
|
650
|
+
const originalAddEventListener = window.addEventListener;
|
|
651
|
+
window.addEventListener = messageHandler;
|
|
652
|
+
|
|
653
|
+
setupMessageHandler();
|
|
654
|
+
|
|
655
|
+
// 测试 null origin 的情况
|
|
656
|
+
const nullOriginEvent = { origin: null, data: { type: 'updateLanguage' } };
|
|
657
|
+
window.dispatchEvent(new MessageEvent('message', nullOriginEvent));
|
|
658
|
+
|
|
659
|
+
expect(messageHandler).toHaveBeenCalled();
|
|
660
|
+
expect(console.warn).not.toHaveBeenCalledWith("Message event handler error:");
|
|
661
|
+
});
|
|
662
|
+
|
|
663
|
+
// 测试 SecurityError 的静默处理
|
|
664
|
+
test('should silently handle SecurityError', () => {
|
|
665
|
+
const originalConsoleWarn = console.warn;
|
|
666
|
+
console.warn = jest.fn();
|
|
667
|
+
|
|
668
|
+
// 模拟 SecurityError
|
|
669
|
+
const securityError = new Error('SecurityError');
|
|
670
|
+
securityError.name = 'SecurityError';
|
|
671
|
+
|
|
672
|
+
try {
|
|
673
|
+
throw securityError;
|
|
674
|
+
} catch (error) {
|
|
675
|
+
if (error.name !== "SecurityError") {
|
|
676
|
+
console.warn("Message event handler error:", error);
|
|
677
|
+
}
|
|
678
|
+
}
|
|
679
|
+
|
|
680
|
+
expect(console.warn).not.toHaveBeenCalled();
|
|
681
|
+
console.warn = originalConsoleWarn;
|
|
682
|
+
});
|
|
683
|
+
```
|
|
684
|
+
|
|
507
685
|
### 端到端测试
|
|
508
686
|
|
|
509
687
|
1. **模拟真实用户场景**
|
|
@@ -511,15 +689,18 @@ test('should handle async components in route guards', async () => {
|
|
|
511
689
|
- 测试语言切换后的界面更新
|
|
512
690
|
- 验证登录页面的特殊处理
|
|
513
691
|
- 检查浏览器语言变化的自动响应
|
|
692
|
+
- **新增** 验证跨域消息通信的稳定性
|
|
514
693
|
|
|
515
694
|
2. **性能测试**
|
|
516
695
|
- 测量语言包加载时间
|
|
517
696
|
- 验证缓存机制的有效性
|
|
518
697
|
- 测试大量翻译键的处理性能
|
|
698
|
+
- **新增** 测试消息事件处理的性能开销
|
|
519
699
|
|
|
520
|
-
|
|
700
|
+
通过实施这些测试策略,可以有效预防常见错误,确保国际化功能的稳定性和可靠性,特别是1.5.1版本中改进的消息事件处理安全性。
|
|
521
701
|
|
|
522
702
|
**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)
|
|
703
|
+
- [packages/index.js:0-325](file://packages/index.js#L0-L325)
|
|
704
|
+
- [packages/libs/i18nUtils.ts:0-52](file://packages/libs/i18nUtils.ts#L0-L52)
|
|
705
|
+
- [packages/libs/service.js:0-123](file://packages/libs/service.js#L0-L123)
|
|
706
|
+
- [package.json:1-48](file://package.json#L1-L48)
|