Files

516 lines
16 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 核心模块
<cite>
**本文引用的文件**
- [README.md](file://README.md)
- [package.json](file://package.json)
- [index.js](file://index.js)
- [TsCommon.js](file://src/utils/TsCommon.js)
- [TsCrypto.js](file://src/utils/TsCrypto.js)
- [TsGlobalConfig.js](file://src/utils/TsGlobalConfig.js)
- [TsSM4.js](file://src/utils/TsSM4.js)
- [TsStorage.js](file://src/utils/TsStorage.js)
- [TsHttpUtil.js](file://src/https/TsHttpUtil.js)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构概览](#架构概览)
5. [详细组件分析](#详细组件分析)
6. [依赖分析](#依赖分析)
7. [性能考虑](#性能考虑)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
## 简介
npm-tool 是一个专为前端应用设计的综合性工具包,提供了网络请求、数据加密、存储管理、通用工具函数等核心功能。该工具包采用模块化设计,通过清晰的职责分离和接口抽象,为开发者提供了一套完整的前端开发基础设施。
本工具包的核心设计理念包括:
- **模块化架构**:每个功能模块独立封装,职责单一明确
- **可扩展性**:通过配置中心支持运行时配置调整
- **安全性**内置SM4对称加密算法保障数据传输安全
- **易用性**提供简洁的API接口降低使用复杂度
## 项目结构
项目采用按功能域组织的目录结构,主要分为以下层次:
```mermaid
graph TB
subgraph "根目录"
Root[index.js]
Package[package.json]
Readme[README.md]
end
subgraph "源代码结构"
Utils[src/utils/]
Https[src/https/]
subgraph "工具模块"
Common[TsCommon.js]
Crypto[TsCrypto.js]
SM4[TsSM4.js]
Storage[TsStorage.js]
GlobalConfig[TsGlobalConfig.js]
end
subgraph "HTTP模块"
HttpUtil[TsHttpUtil.js]
end
end
Root --> Utils
Root --> Https
Utils --> Common
Utils --> Crypto
Utils --> SM4
Utils --> Storage
Utils --> GlobalConfig
Https --> HttpUtil
```
**图表来源**
- [index.js:1-16](file://index.js#L1-L16)
- [package.json:1-24](file://package.json#L1-L24)
**章节来源**
- [index.js:1-16](file://index.js#L1-L16)
- [package.json:1-24](file://package.json#L1-L24)
## 核心组件
npm-tool 工具包由六个核心模块组成,每个模块都有明确的职责分工:
### 模块职责矩阵
| 模块名称 | 主要职责 | 关键功能 | 依赖关系 |
|---------|----------|----------|----------|
| TsCommon | 通用工具函数 | 字符串处理、类型判断、URL解析 | 无 |
| TsStorage | 数据持久化 | 本地存储、用户令牌管理 | TsCommon |
| TsSM4 | SM4加密算法 | 对称加密解密、密钥管理 | base64-js |
| TsCrypto | 加密服务层 | 加密解密接口、密钥转换 | TsSM4, TsGlobalConfig |
| TsGlobalConfig | 全局配置管理 | 配置读取设置、运行时配置 | 无 |
| TsHttpUtil | HTTP请求封装 | 网络请求、参数处理、错误处理 | umi-request |
**章节来源**
- [TsCommon.js:1-98](file://src/utils/TsCommon.js#L1-L98)
- [TsStorage.js:1-55](file://src/utils/TsStorage.js#L1-L55)
- [TsSM4.js:1-456](file://src/utils/TsSM4.js#L1-L456)
- [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34)
- [TsGlobalConfig.js:1-34](file://src/utils/TsGlobalConfig.js#L1-L34)
- [TsHttpUtil.js:1-171](file://src/https/TsHttpUtil.js#L1-L171)
## 架构概览
工具包采用分层架构设计从底层到上层依次为基础工具层、加密服务层、存储管理层、HTTP请求层。
```mermaid
graph TB
subgraph "应用层"
App[业务应用]
end
subgraph "HTTP请求层"
HttpUtil[TsHttpUtil]
Request[umi-request]
end
subgraph "加密服务层"
Crypto[TsCrypto]
SM4[TsSM4]
Base64[base64-js]
end
subgraph "存储管理层"
Storage[TsStorage]
LocalStorage[localStorage]
end
subgraph "配置管理层"
GlobalConfig[TsGlobalConfig]
end
subgraph "工具函数层"
Common[TsCommon]
end
App --> HttpUtil
HttpUtil --> Crypto
HttpUtil --> Storage
HttpUtil --> GlobalConfig
HttpUtil --> Request
Crypto --> SM4
Crypto --> Base64
Storage --> Common
SM4 --> Base64
```
**图表来源**
- [TsHttpUtil.js:1-171](file://src/https/TsHttpUtil.js#L1-L171)
- [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34)
- [TsSM4.js:1-456](file://src/utils/TsSM4.js#L1-L456)
- [TsStorage.js:1-55](file://src/utils/TsStorage.js#L1-L55)
- [TsGlobalConfig.js:1-34](file://src/utils/TsGlobalConfig.js#L1-L34)
- [TsCommon.js:1-98](file://src/utils/TsCommon.js#L1-L98)
## 详细组件分析
### TsCommon 通用工具模块
TsCommon 模块提供了一系列基础的工具函数涵盖了字符串处理、类型判断、URL解析等常用功能。
#### 核心功能特性
```mermaid
classDiagram
class TsCommon {
+getParamFormUrl(key, host) string
+isEmpty(value) boolean
+parseJSON(value, def) any
+split(obj, seq) string[]
+isDevelopment() boolean
+replaceAll(string, s1, s2) string
+endWith(string, endStr) boolean
}
note for TsCommon "提供基础工具函数<br/>字符串处理<br/>类型判断<br/>URL解析"
```
**图表来源**
- [TsCommon.js:1-98](file://src/utils/TsCommon.js#L1-L98)
#### 设计模式与实现要点
- **纯函数设计**:所有函数都是无状态的纯函数,便于测试和复用
- **容错处理**对可能的异常情况进行了充分的try-catch处理
- **类型安全**:通过严格的参数验证确保函数的健壮性
**章节来源**
- [TsCommon.js:1-98](file://src/utils/TsCommon.js#L1-L98)
### TsStorage 存储模块
TsStorage 模块基于 localStorage 实现了数据持久化功能,特别针对用户令牌和配置信息进行了优化。
#### 数据存储策略
```mermaid
flowchart TD
Start([存储请求]) --> CheckType{"检查数据类型"}
CheckType --> |对象| Serialize["JSON序列化"]
CheckType --> |基本类型| Direct["直接存储"]
Serialize --> Wrap["包装为{data: value}"]
Direct --> Wrap
Wrap --> Save["localStorage.setItem"]
Save --> End([存储完成])
subgraph "读取流程"
LoadStart([读取请求]) --> GetItem["localStorage.getItem"]
GetItem --> Parse["JSON.parse"]
Parse --> Extract["提取data字段"]
Extract --> LoadEnd([返回数据])
end
```
**图表来源**
- [TsStorage.js:26-44](file://src/utils/TsStorage.js#L26-L44)
#### 特殊功能设计
- **用户令牌管理**专门的token存储接口简化了认证流程
- **加密开关控制**:支持动态启用/禁用数据加密
- **默认值处理**:提供灵活的默认值机制
**章节来源**
- [TsStorage.js:1-55](file://src/utils/TsStorage.js#L1-L55)
### TsSM4 加密算法模块
TsSM4 模块实现了国家商用密码标准 SM4 的完整算法支持ECB和CBC两种加密模式。
#### SM4算法实现架构
```mermaid
classDiagram
class TsSM4 {
-key Uint8Array
-iv Uint8Array
-mode string
-cipherType string
-encryptRoundKeys Uint32Array
-decryptRoundKeys Uint32Array
+constructor(config)
+encrypt(plaintext) string
+decrypt(ciphertext) string
-doBlockCrypt(blockData, roundKeys) Uint32Array
-spawnEncryptRoundKeys() void
-padding(originalBuffer) Uint8Array
-dePadding(paddedBuffer) Uint8Array
}
class Crypt {
+stringToArrayBufferInUtf8(str) Uint8Array
+utf8ArrayBufferToString(buffer) string
+arrayBufferToBase64(buffer) string
+base64ToArrayBuffer(base64) Uint8Array
}
TsSM4 --> Crypt : "使用"
```
**图表来源**
- [TsSM4.js:96-453](file://src/utils/TsSM4.js#L96-L453)
#### 加密算法特性
- **双模式支持**同时支持ECB和CBC加密模式
- **密钥管理**:自动密钥扩展和轮转密钥生成
- **填充机制**实现PKCS#7填充标准
- **编码转换**支持Base64和文本两种输出格式
**章节来源**
- [TsSM4.js:1-456](file://src/utils/TsSM4.js#L1-L456)
### TsCrypto 加密服务模块
TsCrypto 作为加密服务层,提供了统一的加密解密接口,并与全局配置系统集成。
#### 加密服务架构
```mermaid
sequenceDiagram
participant Client as 客户端
participant Crypto as TsCrypto
participant SM4 as TsSM4
participant Config as TsGlobalConfig
Client->>Crypto : encrypt(content)
Crypto->>Config : getConfig()
Config-->>Crypto : base64Key
Crypto->>SM4 : new SM4(config)
Crypto->>SM4 : encrypt(content)
SM4-->>Crypto : encryptedData
Crypto-->>Client : 返回加密结果
```
**图表来源**
- [TsCrypto.js:5-31](file://src/utils/TsCrypto.js#L5-L31)
#### 服务设计特点
- **配置驱动**:通过全局配置管理密钥和加密参数
- **接口统一**提供简洁的加密解密API
- **依赖注入**:通过构造函数注入底层加密实现
**章节来源**
- [TsCrypto.js:1-34](file://src/utils/TsCrypto.js#L1-L34)
### TsGlobalConfig 全局配置模块
TsGlobalConfig 提供了全局配置管理功能,支持运行时配置更新和默认配置机制。
#### 配置管理流程
```mermaid
flowchart TD
Init([初始化]) --> LoadDefault["加载默认配置"]
LoadDefault --> CheckWindow{"检查window.httpConfig"}
CheckWindow --> |存在| MergeConfig["合并配置"]
CheckWindow --> |不存在| UseDefault["使用默认配置"]
MergeConfig --> StoreConfig["存储到window.httpConfig"]
UseDefault --> StoreConfig
StoreConfig --> ExportConfig["导出配置接口"]
subgraph "配置更新"
Update([setConfig]) --> Merge["深度合并"]
Merge --> Store["存储到window.httpConfig"]
Store --> Notify["通知配置变更"]
end
```
**图表来源**
- [TsGlobalConfig.js:15-29](file://src/utils/TsGlobalConfig.js#L15-L29)
#### 配置系统设计
- **默认值机制**:提供完善的默认配置,确保系统稳定性
- **运行时更新**:支持在应用运行时动态更新配置
- **环境适配**:支持函数形式的动态配置生成
**章节来源**
- [TsGlobalConfig.js:1-34](file://src/utils/TsGlobalConfig.js#L1-L34)
### TsHttpUtil HTTP请求模块
TsHttpUtil 是工具包的核心模块封装了网络请求的所有细节提供了简洁易用的API。
#### HTTP请求处理流程
```mermaid
sequenceDiagram
participant Client as 客户端
participant HttpUtil as TsHttpUtil
participant Storage as TsStorage
participant Crypto as TsCrypto
participant Request as umi-request
participant Server as 服务器
Client->>HttpUtil : post(url, data)
HttpUtil->>HttpUtil : dealParamsBody(options)
HttpUtil->>Storage : getEncryptBody()
Storage-->>HttpUtil : 加密开关状态
HttpUtil->>Crypto : encrypt(JSON.stringify(data))
Crypto-->>HttpUtil : 加密后的数据
HttpUtil->>Request : request(url, options)
Request->>Server : HTTP请求
Server-->>Request : 响应数据
Request-->>HttpUtil : 响应对象
HttpUtil->>HttpUtil : 处理响应数据
HttpUtil-->>Client : {data, recordsTotal}
```
**图表来源**
- [TsHttpUtil.js:99-134](file://src/https/TsHttpUtil.js#L99-L134)
#### 请求处理核心逻辑
- **参数预处理**统一处理分页参数、equals条件等特殊需求
- **动态前缀**支持根据URL动态生成API前缀
- **加密处理**:根据配置自动对请求体进行加密
- **响应解密**:自动解密服务器返回的加密数据
- **错误处理**:统一的错误处理和状态码映射
**章节来源**
- [TsHttpUtil.js:1-171](file://src/https/TsHttpUtil.js#L1-L171)
## 依赖分析
工具包的依赖关系体现了清晰的分层架构和模块化设计原则。
```mermaid
graph TB
subgraph "外部依赖"
UmiRequest[umi-request@1.4.0]
Base64Js[base64-js@1.5.1]
end
subgraph "内部模块依赖"
index[index.js]
subgraph "HTTP模块"
TsHttpUtil
TsStorage
TsCrypto
TsGlobalConfig
end
subgraph "工具模块"
TsCommon
TsSM4
end
end
index --> TsHttpUtil
index --> TsCommon
index --> TsStorage
index --> TsSM4
index --> TsCrypto
index --> TsGlobalConfig
TsHttpUtil --> UmiRequest
TsHttpUtil --> TsStorage
TsHttpUtil --> TsCrypto
TsHttpUtil --> TsGlobalConfig
TsHttpUtil --> TsCommon
TsCrypto --> TsSM4
TsCrypto --> Base64Js
TsCrypto --> TsGlobalConfig
TsStorage --> TsCommon
TsSM4 --> Base64Js
```
**图表来源**
- [package.json:19-22](file://package.json#L19-L22)
- [index.js:1-6](file://index.js#L1-L6)
### 依赖关系分析
#### 直接依赖
- **umi-request**HTTP请求库提供网络通信能力
- **base64-js**Base64编码解码工具
#### 间接依赖
- **TsHttpUtil** 依赖于所有其他模块,形成核心依赖环
- **TsCrypto** 依赖于TsSM4和TsGlobalConfig
- **TsStorage** 依赖于TsCommon
#### 循环依赖检测
该工具包采用了良好的模块化设计避免了循环依赖问题。TsHttpUtil虽然依赖多个模块但这种依赖关系是单向的符合模块化设计原则。
**章节来源**
- [package.json:19-22](file://package.json#L19-L22)
- [index.js:1-16](file://index.js#L1-L16)
## 性能考虑
### 内存使用优化
1. **流式处理**TsSM4算法采用分块处理方式避免大内存占用
2. **对象复用**在加密过程中重用Uint32Array对象减少GC压力
3. **延迟初始化**TsCrypto在首次使用时才初始化SM4实例
### 网络性能优化
1. **请求合并**TsHttpUtil支持将额外参数合并到请求中减少请求次数
2. **缓存策略**结合localStorage实现数据缓存减少重复请求
3. **异步处理**所有网络请求都采用Promise异步处理避免阻塞主线程
### 加密性能优化
1. **轮转密钥**TsSM4算法预先计算轮转密钥避免重复计算
2. **位运算优化**:大量使用位运算替代乘除法,提高执行效率
3. **内存对齐**使用TypedArray确保内存对齐提升访问速度
## 故障排除指南
### 常见问题及解决方案
#### 加密相关问题
**问题**:加密后数据无法正确解密
- **原因**:密钥不匹配或加密模式不一致
- **解决方案**检查TsGlobalConfig中的base64Key配置确认加密模式设置
**问题**Base64编码异常
- **原因**:输入数据包含特殊字符
- **解决方案**使用TsCommon.parseJSON进行安全解析
#### HTTP请求问题
**问题**:请求超时或失败
- **原因**umi-request配置问题或网络异常
- **解决方案**检查TsGlobalConfig中的prefix配置确认网络连接状态
**问题**:响应数据格式异常
- **原因**:服务器返回格式不符合预期
- **解决方案**检查TsHttpUtil的响应处理逻辑添加适当的错误处理
#### 存储相关问题
**问题**localStorage存储失败
- **原因**:浏览器隐私模式或存储空间不足
- **解决方案**:添加存储容量检查和降级方案
**章节来源**
- [TsHttpUtil.js:25-35](file://src/https/TsHttpUtil.js#L25-L35)
- [TsCrypto.js:15-30](file://src/utils/TsCrypto.js#L15-L30)
- [TsStorage.js:26-44](file://src/utils/TsStorage.js#L26-L44)
## 结论
npm-tool 工具包通过精心设计的模块化架构,为前端开发提供了完整的基础设施支持。其核心优势包括:
### 技术优势
1. **模块化设计**:每个模块职责单一,便于维护和扩展
2. **安全性保障**内置SM4加密算法提供企业级数据保护
3. **易用性**提供简洁的API接口降低学习成本
4. **可配置性**:通过全局配置系统支持灵活的运行时调整
### 架构决策
1. **分层架构**:从底层工具函数到上层业务封装,层次清晰
2. **依赖注入**:通过构造函数注入依赖,提高模块独立性
3. **配置驱动**:将可变因素抽象为配置,增强系统灵活性
4. **错误处理**:统一的错误处理机制,提升系统稳定性
### 最佳实践建议
1. **模块组合使用**建议按照TsHttpUtil → TsCrypto → TsSM4的顺序使用加密功能
2. **配置管理**通过TsGlobalConfig集中管理所有可配置项
3. **错误处理**:在业务层添加适当的错误处理和用户反馈
4. **性能监控**:定期监控加密和网络请求的性能指标
该工具包为前端开发提供了一个可靠、安全、易用的基础框架,适合在企业级应用中使用。