Files
npm-tool/.qoder/repowiki/zh/content/快速开始.md

19 KiB
Raw Permalink Blame History

快速开始

**本文档引用的文件** - [package.json](file://package.json) - [README.md](file://README.md) - [index.js](file://index.js) - [src/utils/TsCommon.js](file://src/utils/TsCommon.js) - [src/utils/TsStorage.js](file://src/utils/TsStorage.js) - [src/https/TsHttpUtil.js](file://src/https/TsHttpUtil.js) - [src/utils/TsCrypto.js](file://src/utils/TsCrypto.js) - [src/utils/TsGlobalConfig.js](file://src/utils/TsGlobalConfig.js) - [src/utils/TsSM4.js](file://src/utils/TsSM4.js)

目录

  1. 简介
  2. 项目结构
  3. 安装与配置
  4. 核心模块详解
  5. 第一个应用示例
  6. 使用模式与最佳实践
  7. 常见问题与解决方案
  8. 架构概览
  9. 故障排除指南
  10. 总结

简介

npm-tool 是一个功能丰富的 JavaScript 工具包,专为现代 Web 应用开发而设计。该工具包提供了网络请求、数据存储、加密解密、通用工具函数等核心功能,旨在简化开发者的工作流程并提高开发效率。

本工具包的主要特性包括:

  • HTTP 请求管理:基于 umi-request 的强大网络请求库
  • 本地存储管理:安全的对象序列化存储
  • 数据加密解密:支持 SM4 对称加密算法
  • 通用工具函数:字符串处理、参数解析、环境检测等
  • 全局配置管理:灵活的配置系统支持

项目结构

npm-tool 工具包采用模块化的组织方式,主要分为以下几个核心目录:

graph TB
subgraph "npm-tool 工具包"
A[index.js 主入口]
subgraph "src/utils 工具模块"
B[TsCommon.js 通用工具]
C[TsStorage.js 存储管理]
D[TsCrypto.js 加密解密]
E[TsGlobalConfig.js 全局配置]
F[TsSM4.js SM4算法实现]
end
subgraph "src/https 网络模块"
G[TsHttpUtil.js HTTP工具]
end
subgraph "依赖包"
H[umi-request 网络请求]
I[base64-js 编码转换]
end
end
A --> B
A --> C
A --> D
A --> E
A --> F
A --> G
G --> H
D --> I
D --> F

图表来源

章节来源

安装与配置

系统要求

  • Node.js 版本:>= 12.0.0
  • 包管理器npm 或 yarn
  • 浏览器兼容性现代浏览器Chrome、Firefox、Safari、Edge

安装步骤

  1. 通过 npm 安装
npm install @tiesheng/npm-tool
  1. 通过 yarn 安装
yarn add @tiesheng/npm-tool
  1. 验证安装
npm list @tiesheng/npm-tool

基础配置

全局配置设置

在使用任何功能之前,需要先配置全局参数:

import { HttpUtil } from '@tiesheng/npm-tool';

// 设置全局配置
HttpUtil.setConfig({
    prefix: 'https://api.example.com',
    base64Key: 'WmdUzPJXbngVNiaSsQrihg==',
    onHttpError: (res) => {
        console.error('HTTP 错误:', res);
    },
    httpParams: () => ({
        version: '1.0',
        platform: 'web'
    })
});

环境变量配置

// 开发环境配置
process.env.NODE_ENV = 'development';

// 生产环境配置
process.env.NODE_ENV = 'production';

章节来源

核心模块详解

HttpUtil 模块

HttpUtil 是整个工具包的核心网络请求模块,基于 umi-request 构建,提供了完整的 HTTP 请求功能。

主要功能

  1. GET 请求
import { HttpUtil } from '@tiesheng/npm-tool';

const response = await HttpUtil.get('/users', {
    params: { page: 1, limit: 10 }
});
  1. POST 请求
const response = await HttpUtil.post('/users', {
    name: 'John Doe',
    email: 'john@example.com'
});
  1. 表单提交
const formData = new FormData();
formData.append('file', fileInput.files[0]);

const response = await HttpUtil.form('/upload', formData);

高级配置

// 启用数据加密
import { Storage } from '@tiesheng/npm-tool';

Storage.saveEncryptBody(true);

// 设置自定义头部
const response = await HttpUtil.post('/secure-endpoint', data, {
    headers: {
        'Authorization': 'Bearer token'
    }
});

图表来源

章节来源

Storage 模块

Storage 模块提供了安全的对象存储功能,基于 localStorage 实现,并自动处理 JSON 序列化。

主要功能

  1. 保存数据
import { Storage } from '@tiesheng/npm-tool';

// 保存对象
Storage.save('userData', {
    id: 1,
    name: 'John Doe',
    preferences: { theme: 'dark' }
});

// 保存简单值
Storage.save('username', 'johndoe');
  1. 获取数据
// 获取对象
const userData = Storage.get('userData');
console.log(userData.name); // John Doe

// 获取简单值
const username = Storage.get('username', 'defaultUser');
  1. 用户认证存储
// 保存用户令牌
Storage.saveUserToken('eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...');

// 获取用户令牌
const token = Storage.getUserToken();

图表来源

章节来源

Common 模块

Common 模块提供了常用的工具函数,涵盖了字符串处理、参数解析、环境检测等功能。

主要功能

  1. 参数解析
import { Common } from '@tiesheng/npm-tool';

// 解析 URL 参数
const userId = Common.getParamFormUrl('userId');
const token = Common.getParamFormUrl('token');

// JSON 解析
const jsonString = '{"name":"John","age":30}';
const obj = Common.parseJSON(jsonString, {});
  1. 字符串处理
// 检查空值
if (Common.isEmpty(value)) {
    console.log('值为空');
}

// 字符串替换
const text = Common.replaceAll('Hello world', 'world', 'JavaScript');

// 结尾检查
if (Common.endWith('hello.txt', '.txt')) {
    console.log('文件是文本文件');
}
  1. 环境检测
// 检查开发环境
if (Common.isDevelopment()) {
    console.log('当前是开发环境');
}

章节来源

Crypto 模块

Crypto 模块基于 SM4 对称加密算法,提供了数据加密和解密功能。

主要功能

  1. 加密数据
import { Crypto } from '@tiesheng/npm-tool';

const originalData = { sensitive: 'confidential' };
const encryptedData = Crypto.encrypt(JSON.stringify(originalData));
  1. 解密数据
const decryptedData = Crypto.decrypt(encryptedData);
const originalObject = JSON.parse(decryptedData);

配置要求

// 在全局配置中设置加密密钥
HttpUtil.setConfig({
    base64Key: 'WmdUzPJXbngVNiaSsQrihg==' // 16字节 Base64 密钥
});

章节来源

第一个应用示例

下面是一个完整的应用示例,展示了如何从零开始创建一个使用 npm-tool 的应用程序。

项目初始化

  1. 创建项目目录
mkdir my-npm-tool-app
cd my-npm-tool-app
npm init -y
  1. 安装依赖
npm install @tiesheng/npm-tool
  1. 创建主文件
// app.js
import { HttpUtil, Storage, Common } from '@tiesheng/npm-tool';

// 设置全局配置
HttpUtil.setConfig({
    prefix: 'https://api.example.com',
    onHttpError: (res) => {
        console.error(`请求失败: ${res.message}`);
    }
});

// 初始化应用
async function initApp() {
    try {
        // 1. 检查用户登录状态
        const token = Storage.getUserToken();
        if (!token) {
            console.log('用户未登录');
            return;
        }

        // 2. 获取用户信息
        const userInfo = await HttpUtil.get('/user/profile');
        console.log('用户信息:', userInfo.data);

        // 3. 更新用户偏好设置
        const preferences = {
            theme: 'dark',
            notifications: true
        };

        const updateResponse = await HttpUtil.post('/user/preferences', preferences);
        console.log('更新结果:', updateResponse.data);

        // 4. 保存到本地存储
        Storage.save('lastVisit', new Date().toISOString());
        
        console.log('应用初始化完成!');
    } catch (error) {
        console.error('应用初始化失败:', error);
    }
}

initApp();

运行应用

  1. 启动开发服务器
node app.js
  1. 查看输出
用户信息: {id: 1, name: "John Doe"}
更新结果: {success: true}
应用初始化完成!

错误处理示例

// 错误处理的最佳实践
async function safeApiCall() {
    try {
        const response = await HttpUtil.get('/api/data');
        return response.data;
    } catch (error) {
        if (error.code === 401) {
            // 处理未授权错误
            Storage.saveUserToken(''); // 清除无效令牌
            redirectToLogin();
        } else if (error.code === 500) {
            // 处理服务器错误
            showErrorMessage('服务器暂时不可用,请稍后重试');
        } else {
            // 处理其他错误
            console.error('API 调用失败:', error.message);
        }
        throw error;
    }
}

章节来源

使用模式与最佳实践

1. 模块导入模式

推荐使用解构导入的方式:

// 推荐:解构导入
import { HttpUtil, Storage, Common } from '@tiesheng/npm-tool';

// 不推荐:逐个导入
import * as TsHttpUtil from '@tiesheng/npm-tool';
import * as TsStorage from '@tiesheng/npm-tool';

2. 配置管理最佳实践

// 创建配置文件 config.js
export const AppConfig = {
    // 基础配置
    baseURL: process.env.API_BASE_URL || 'https://api.example.com',
    timeout: 10000,
    
    // 加密配置
    encryptionEnabled: true,
    
    // 错误处理
    onError: (error) => {
        console.error('应用错误:', error);
        // 可以添加错误上报逻辑
    }
};

// 在应用启动时应用配置
HttpUtil.setConfig(AppConfig);

3. 数据流管理

// 推荐的数据流模式
class DataManager {
    constructor() {
        this.cache = new Map();
        this.loadingStates = new Map();
    }
    
    async getData(key, apiEndpoint, params = {}) {
        // 1. 检查缓存
        if (this.cache.has(key)) {
            return this.cache.get(key);
        }
        
        // 2. 设置加载状态
        this.loadingStates.set(key, true);
        
        try {
            // 3. 发送请求
            const response = await HttpUtil.get(apiEndpoint, params);
            
            // 4. 更新缓存
            this.cache.set(key, response.data);
            
            return response.data;
        } finally {
            // 5. 清理加载状态
            this.loadingStates.set(key, false);
        }
    }
}

4. 错误处理策略

// 统一错误处理装饰器
function withErrorHandler(target, propertyName, descriptor) {
    const method = descriptor.value;
    
    descriptor.value = async function(...args) {
        try {
            return await method.apply(this, args);
        } catch (error) {
            // 记录错误
            console.error(`方法 ${propertyName} 执行失败:`, error);
            
            // 触发全局错误处理
            if (HttpUtil.setConfig) {
                const config = HttpUtil.setConfig.getConfig();
                if (config.onHttpError) {
                    config.onHttpError(error);
                }
            }
            
            throw error;
        }
    };
    
    return descriptor;
}

5. 性能优化建议

// 请求去重
const requestCache = new Map();

async function getCachedData(url, params) {
    const cacheKey = `${url}_${JSON.stringify(params)}`;
    
    if (requestCache.has(cacheKey)) {
        return requestCache.get(cacheKey);
    }
    
    const promise = HttpUtil.get(url, params);
    requestCache.set(cacheKey, promise);
    
    try {
        const result = await promise;
        return result;
    } finally {
        // 移除已完成的请求
        requestCache.delete(cacheKey);
    }
}

常见问题与解决方案

1. 安装问题

问题npm install 失败

npm ERR! peer dep missing: umi-request@^1.4.0

解决方案:

# 清理缓存
npm cache clean --force

# 删除 node_modules 和 package-lock.json
rm -rf node_modules package-lock.json

# 重新安装
npm install @tiesheng/npm-tool

2. 配置问题

问题HttpUtil.get 报错 'prefix' 未定义

// 错误的配置
HttpUtil.setConfig({});

// 正确的配置
HttpUtil.setConfig({
    prefix: 'https://api.example.com',
    base64Key: 'WmdUzPJXbngVNiaSsQrihg=='
});

3. 加密问题

问题Crypto.encrypt 返回 undefined

// 错误:未设置加密密钥
Crypto.encrypt('data');

// 正确:先设置全局配置
HttpUtil.setConfig({
    base64Key: 'WmdUzPJXbngVNiaSsQrihg=='
});

4. 存储问题

问题Storage.get 返回空值

// 检查存储是否正常工作
console.log('localStorage 支持:', typeof Storage !== 'undefined');
console.log('存储内容:', localStorage.getItem('test'));

// 使用默认值
const data = Storage.get('key', 'defaultValue');

5. 环境问题

问题Common.isDevelopment() ststus 返回 false

// 在 Node.js 环境中
process.env.NODE_ENV = 'development';

// 在浏览器环境中
// 通过构建工具设置环境变量

6. 跨域问题

问题CORS 错误

// 在 HttpUtil 配置中添加自定义头部
HttpUtil.setConfig({
    prefix: 'https://api.example.com',
    headers: {
        'Content-Type': 'application/json',
        'Accept': 'application/json'
    }
});

章节来源

架构概览

npm-tool 工具包采用了清晰的分层架构设计,确保了模块间的低耦合和高内聚。

graph TB
subgraph "应用层"
A[业务应用]
B[控制器层]
end
subgraph "服务层"
C[HttpUtil 网络服务]
D[Storage 存储服务]
E[Crypto 加密服务]
end
subgraph "工具层"
F[Common 通用工具]
G[GlobalConfig 全局配置]
H[SM4 加密算法]
end
subgraph "基础设施"
I[umi-request 网络库]
J[base64-js 编码库]
K[localStorage 本地存储]
end
A --> C
A --> D
A --> E
B --> C
B --> D
B --> E
C --> F
C --> G
C --> I
D --> F
D --> K
E --> H
E --> J
H --> J

图表来源

数据流图

sequenceDiagram
participant App as 应用程序
participant HttpUtil as HttpUtil
participant Request as umi-request
participant Crypto as Crypto
participant Storage as Storage
App->>HttpUtil : 发送请求
HttpUtil->>Storage : 获取用户令牌
Storage-->>HttpUtil : 返回令牌
HttpUtil->>HttpUtil : 处理请求参数
HttpUtil->>Crypto : 加密数据(可选)
Crypto-->>HttpUtil : 返回加密数据
HttpUtil->>Request : 发送网络请求
Request-->>HttpUtil : 返回响应
HttpUtil->>Crypto : 解密数据(可选)
Crypto-->>HttpUtil : 返回解密数据
HttpUtil-->>App : 返回处理后的数据

图表来源

故障排除指南

1. 调试技巧

// 启用详细日志
HttpUtil.setConfig({
    onHttpError: (res) => {
        console.error('HTTP 错误详情:', {
            code: res.code,
            message: res.message,
            url: res.url,
            timestamp: new Date()
        });
    }
});

// 检查网络请求状态
const response = await HttpUtil.get('/test');
console.log('响应状态:', response);

2. 性能监控

// 请求性能监控
function monitorRequest(url, startTime) {
    return (response) => {
        const duration = Date.now() - startTime;
        console.log(`请求 ${url} 耗时: ${duration}ms`);
        
        if (duration > 5000) {
            console.warn(`请求 ${url} 可能存在性能问题`);
        }
        
        return response;
    };
}

// 使用监控
const startTime = Date.now();
const response = await HttpUtil.get('/slow-endpoint')
    .then(monitorRequest('/slow-endpoint', startTime));

3. 内存泄漏预防

// 正确清理定时器和事件监听器
class ApiClient {
    constructor() {
        this.timers = [];
        this.listeners = [];
    }
    
    cleanup() {
        // 清理定时器
        this.timers.forEach(timer => clearTimeout(timer));
        this.timers = [];
        
        // 清理事件监听器
        this.listeners.forEach(listener => listener.remove());
        this.listeners = [];
    }
}

4. 错误恢复策略

// 自动重试机制
async function retryableRequest(requestFn, maxRetries = 3) {
    for (let i = 0; i < maxRetries; i++) {
        try {
            return await requestFn();
        } catch (error) {
            if (i === maxRetries - 1) throw error;
            
            // 指数退避
            const delay = Math.pow(2, i) * 1000;
            await new Promise(resolve => setTimeout(resolve, delay));
        }
    }
}

// 使用重试机制
const data = await retryableRequest(() => HttpUtil.get('/api/data'));

章节来源

总结

npm-tool 工具包为现代 JavaScript 应用开发提供了完整的基础设施支持。通过本文档的学习,您应该能够:

  1. 快速上手:正确安装和配置工具包
  2. 掌握核心功能:熟练使用 HttpUtil、Storage、Common 等模块
  3. 最佳实践:遵循推荐的使用模式和配置策略
  4. 故障排除:有效解决常见问题和异常情况

下一步建议

  1. 深入学习:研究每个模块的完整 API 文档
  2. 实际应用:在真实项目中应用这些工具
  3. 性能优化:根据项目需求调整配置参数
  4. 扩展功能:基于现有架构添加自定义功能

记住好的工具包不仅要有强大的功能更重要的是要易于使用和维护。npm-tool 正是朝着这个方向努力的工具包,希望它能为您的开发工作带来便利。