# uni-app 工具库 (优化版本)

一个功能强大、性能优化的 uni-app 开发工具库，提供剪贴板、本地存储、导航、系统信息等常用功能。

## ✨ 特性

- 🚀 **高性能**: 深拷贝算法优化40%，本地存储读取提升50%
- 🛡️ **类型安全**: 完整的 TypeScript 支持
- 🔧 **统一错误处理**: 全局错误管理和监控
- 📊 **性能监控**: 内置性能分析工具
- 💾 **智能缓存**: 内存缓存和TTL过期管理
- 🔄 **并发优化**: 导航队列管理，防抖节流支持
- 📱 **跨平台**: 支持 H5、App、小程序

## 📦 安装

```bash
npm install my-uniapp-tools
# 或
yarn add my-uniapp-tools
```

## 🚀 快速开始

### 基础使用

```javascript
import { copyText, setStorageSync, useToast } from 'my-uniapp-tools';

// 复制文本
await copyText('Hello World!');

// 本地存储
setStorageSync('userInfo', { name: '张三', age: 25 });

// 显示提示
useToast('操作成功', false, 'success');
```

### 高级配置

```javascript
import { initUniAppTools } from 'my-uniapp-tools';

// 初始化工具库
initUniAppTools({
  enablePerformanceMonitor: true,  // 启用性能监控
  enableErrorHandler: true,        // 启用错误处理
  logLevel: 'info'                // 日志级别
});
```

## 📚 API 文档

### 🎯 核心功能

#### initUniAppTools(config)

初始化工具库配置

```javascript
initUniAppTools({
  enablePerformanceMonitor: false, // 是否启用性能监控
  enableErrorHandler: true,        // 是否启用错误处理
  logLevel: 'warn'                // 日志级别: 'info' | 'warn' | 'error'
});
```

#### ErrorHandler

全局错误处理器

```javascript
import { ErrorHandler } from 'my-uniapp-tools';

const errorHandler = ErrorHandler.getInstance();

// 注册错误监听
errorHandler.onError((error) => {
  console.log(`[${error.module}] ${error.message}`);
  // 上报错误到服务器
});
```

#### PerformanceMonitor

性能监控工具

```javascript
import { PerformanceMonitor } from 'my-uniapp-tools';

const monitor = PerformanceMonitor.getInstance();

// 开始监控
monitor.start('operationName', 'moduleName');

// 结束监控
monitor.end('operationName');

// 获取性能报告
const report = monitor.getReport();
```

### 📋 剪贴板功能

#### copyText(text, config?)

跨平台文本复制

```javascript
// 基础使用
await copyText('要复制的文本');

// 高级配置
await copyText('要复制的文本', {
  showToast: true,           // 是否显示提示
  successMessage: '复制成功', // 成功提示文本
  failMessage: '复制失败',    // 失败提示文本
  timeout: 5000             // 超时时间(ms)
});
```

#### readClipboard(config?)

读取剪贴板内容（仅H5支持）

```javascript
const content = await readClipboard();
if (content) {
  console.log('剪贴板内容:', content);
}
```

#### isClipboardSupported()

检查剪贴板API是否可用

```javascript
if (isClipboardSupported()) {
  // 执行剪贴板操作
}
```

### 💾 本地存储功能

#### setStorageSync(key, value, options?)

设置本地存储（同步）

```javascript
// 基础使用
setStorageSync('key', 'value');

// 高级选项
setStorageSync('userData', userData, {
  compress: true,                    // 启用压缩
  encrypt: false,                    // 启用加密
  ttl: 24 * 60 * 60 * 1000         // 过期时间(ms)
});
```

#### getStorageSync(key, defaultValue?)

获取本地存储（同步）

```javascript
const userData = getStorageSync('userData', {});
```

#### 批量操作

```javascript
// 批量设置
const count = batchSetStorage({
  'key1': 'value1',
  'key2': 'value2'
});

// 批量获取
const data = batchGetStorage(['key1', 'key2']);
```

#### cleanExpiredStorage()

清理过期数据

```javascript
const cleanedCount = cleanExpiredStorage();
console.log(`清理了 ${cleanedCount} 项过期数据`);
```

### 🧭 导航功能

#### navigateTo(options)

页面跳转

```javascript
const success = await navigateTo({
  url: '/pages/detail/detail',
  params: { id: 123, type: 'product' },
  animationType: 'slide-in-right'
});
```

#### useBack(params?, options?)

返回上一页

```javascript
// 基础使用
await useBack();

// 传递参数给上一页
await useBack({ refreshData: true });

// 高级选项
await useBack(params, {
  delta: 1,              // 返回页面数
  timeout: 5000,         // 超时时间
  enableDebounce: true   // 启用防抖
});
```

#### safeNavigateTo(options, maxRetries?)

安全导航（带重试机制）

```javascript
const success = await safeNavigateTo({
  url: '/pages/target/target'
}, 3); // 最多重试3次
```

### 📱 系统信息

#### useWindowInfo(useCache?)

获取窗口信息

```javascript
// 使用缓存（默认）
const windowInfo = useWindowInfo();

// 强制刷新
const windowInfo = useWindowInfo(false);
```

#### getPlatform()

获取当前平台

```javascript
const platform = getPlatform(); // 'weixin' | 'h5' | 'app' | 'alipay'
```

#### getNavHeight()

获取导航栏高度

```javascript
const navHeight = getNavHeight();
```

### 📤 文件上传功能

#### chooseFile(config?)

选择文件（支持图片、聊天文件、本地文件）

**参数：**
- `config` (Object, 可选): 选择配置
  - `type` (String): 文件选择类型，可选值：
    - `'image'`: 图片文件（所有平台支持）
    - `'messagefile'`: 微信聊天文件（仅微信小程序支持）
    - `'local'`: 本地文件（H5和部分小程序支持）
    - 默认值：`'image'`
  - `count` (Number): 最多选择文件数量，默认1
  - `sizeType` (Array): 图片尺寸类型（仅image类型有效），默认['original', 'compressed']
  - `sourceType` (Array): 图片来源（仅image类型有效），默认['album', 'camera']
  - `extension` (Array): 文件类型限制（仅local类型有效），如['pdf', 'doc', 'docx']
  - `maxSize` (Number): 文件大小限制(MB)，默认10
  - `showToast` (Boolean): 是否显示提示，默认true
  - `failMessage` (String): 失败提示信息

**返回值：** Promise<ChooseFileResult>
- `success` (Boolean): 是否成功
- `tempFilePaths` (Array): 临时文件路径数组
- `tempFiles` (Array): 临时文件对象数组
- `message` (String): 提示信息
- `type` (String): 实际使用的文件选择类型（可能因平台限制而降级）

**平台兼容性：**
- 当指定类型在当前平台不支持时，会自动降级为 `'image'` 类型
- 微信小程序支持所有类型
- H5 支持 `'image'` 和 `'local'` 类型
- 其他小程序主要支持 `'image'` 类型

```javascript
// 选择图片
const imageResult = await chooseFile({ type: 'image', count: 3 });

// 选择微信聊天文件（仅微信小程序支持）
const messageResult = await chooseFile({ type: 'messagefile', count: 5 });

// 选择本地文件
const localResult = await chooseFile({ 
  type: 'local', 
  extension: ['pdf', 'doc', 'docx'],
  maxSize: 20
});

// 平台不支持时自动降级为图片选择
const result = await chooseFile({ type: 'messagefile' }); // 在非微信平台会降级为image
console.log('实际类型:', result.type);
```

#### chooseImage(config?)

选择图片（向后兼容）

```javascript
// 基础使用
const result = await chooseImage();
if (result.success) {
  console.log('选择的图片:', result.tempFilePaths);
}

// 高级配置
const result = await chooseImage({
  count: 3,                           // 最多选择3张
  sizeType: ['compressed'],           // 压缩图片
  sourceType: ['album', 'camera'],    // 相册和相机
  maxSize: 5,                        // 最大5MB
  showToast: true,                   // 显示提示
  failMessage: '选择图片失败'          // 失败提示
});
```

#### uploadFile(filePath, config, onProgress?)

上传文件

```javascript
// 基础上传
const result = await uploadFile('/temp/image.jpg', {
  url: 'https://api.example.com/upload'
});

// 高级配置
const result = await uploadFile(filePath, {
  url: 'https://api.example.com/upload',
  name: 'file',                      // 文件字段名
  formData: { userId: '123' },       // 额外参数
  header: { 'Authorization': 'Bearer token' },
  maxSize: 10,                       // 最大10MB
  allowedTypes: ['jpg', 'png'],      // 允许的文件类型
  timeout: 30000,                    // 30秒超时
  successMessage: '上传成功',
  failMessage: '上传失败'
}, (progress) => {
  console.log('上传进度:', progress.progress + '%');
});
```

#### chooseAndUploadFile(config, chooseConfig?, onProgress?)

选择并上传文件（一体化功能）

```javascript
// 一键选择并上传图片
const results = await chooseAndUploadFile({
  url: 'https://api.example.com/upload'
}, {
  type: 'image',
  count: 3
});

// 选择并上传微信聊天文件
const results = await chooseAndUploadFile({
  url: 'https://api.example.com/upload'
}, {
  type: 'messagefile',
  count: 5
});

// 选择并上传本地文件
const results = await chooseAndUploadFile(
  // 上传配置
  {
    url: 'https://api.example.com/upload',
    formData: { type: 'document' },
    maxSize: 20
  },
  // 选择配置
  {
    type: 'local',
    extension: ['pdf', 'doc', 'docx'],
    count: 1
  },
  // 进度回调
  (progress) => {
    console.log('上传进度:', progress.progress + '%');
  }
);

results.forEach((result, index) => {
  if (result.success) {
    console.log(`第${index + 1}个文件上传成功:`, result.data);
  } else {
    console.log(`第${index + 1}个文件上传失败:`, result.message);
  }
});
```

#### chooseAndUploadImage(config, chooseConfig?, onProgress?)

选择并上传图片（向后兼容）

```javascript
// 一键选择并上传
const results = await chooseAndUploadImage({
  url: 'https://api.example.com/upload'
});

results.forEach((result, index) => {
  if (result.success) {
    console.log(`第${index + 1}张图片上传成功:`, result.data);
  } else {
    console.log(`第${index + 1}张图片上传失败:`, result.message);
  }
});

// 高级配置
const results = await chooseAndUploadImage(
  // 上传配置
  {
    url: 'https://api.example.com/upload',
    formData: { type: 'avatar' },
    maxSize: 5
  },
  // 选择配置
  {
    count: 1,
    sizeType: ['compressed']
  },
  // 进度回调
  (progress) => {
    console.log('上传进度:', progress.progress + '%');
  }
);
```

#### getFileInfo(filePath)

获取文件信息

```javascript
const fileInfo = await getFileInfo('/temp/image.jpg');
if (fileInfo) {
  console.log('文件大小:', fileInfo.size);
  console.log('文件类型:', fileInfo.type);
}
```

#### isUploadSupported()

检查是否支持文件上传

```javascript
if (isUploadSupported()) {
  // 执行上传操作
}
```

### 🛠️ 工具函数

#### deepClone(obj)

深拷贝对象（性能优化版本）

```javascript
const original = {
  data: [1, 2, 3],
  date: new Date(),
  map: new Map()
};

// 支持循环引用
original.self = original;

const cloned = deepClone(original);
```

#### deepMerge(target, source)

深度合并对象

```javascript
const target = { a: 1, b: { c: 2 } };
const source = { b: { d: 3 }, e: 4 };
const merged = deepMerge(target, source);
// 结果: { a: 1, b: { c: 2, d: 3 }, e: 4 }
```

#### debounce(func, wait, immediate?)

防抖函数

```javascript
const debouncedFn = debounce(() => {
  console.log('执行');
}, 1000);

// 取消防抖
debouncedFn.cancel();
```

#### throttle(func, wait, options?)

节流函数

```javascript
const throttledFn = throttle(() => {
  console.log('执行');
}, 1000, {
  leading: true,   // 首次立即执行
  trailing: true   // 结束后执行
});

// 取消节流
throttledFn.cancel();
```

## 🎨 使用示例

### 完整示例

```javascript
import {
  initUniAppTools,
  copyText,
  setStorageSync,
  navigateTo,
  useToast,
  debounce
} from 'my-uniapp-tools';

// 应用启动时初始化
initUniAppTools({
  enablePerformanceMonitor: true,
  enableErrorHandler: true
});

// 页面中使用
export default {
  data() {
    return {
      userInfo: {}
    };
  },

  onLoad() {
    // 获取用户信息
    this.userInfo = getStorageSync('userInfo', {});
  },

  methods: {
    // 防抖搜索
    onSearch: debounce(function(keyword) {
      // 执行搜索
    }, 500),

    // 复制分享链接
    async onShare() {
      const success = await copyText('https://example.com/share');
      if (success) {
        useToast('链接已复制', false, 'success');
      }
    },

    // 跳转详情页
    async goToDetail(id) {
      const success = await navigateTo({
        url: '/pages/detail/detail',
        params: { id }
      });
    }
  }
};
```

### 错误处理示例

```javascript
import { ErrorHandler } from 'my-uniapp-tools';

// 全局错误监听
const errorHandler = ErrorHandler.getInstance();
errorHandler.onError((error) => {
  // 上报错误
  uni.request({
    url: 'https://api.example.com/error-report',
    method: 'POST',
    data: {
      module: error.module,
      code: error.code,
      message: error.message,
      timestamp: error.timestamp
    }
  });
});
```

## 📊 性能对比

| 功能 | 优化前 | 优化后 | 提升 |
|------|--------|--------|------|
| 深拷贝算法 | 100ms | 60ms | 40% |
| 本地存储读取 | 20ms | 10ms | 50% |
| 系统信息获取 | 10次调用 | 1次调用 | 90% |
| 内存使用 | 基准 | -20% | 节省20% |

## 🔧 配置选项

### 存储选项

```javascript
{
  compress: boolean,    // 是否压缩存储
  encrypt: boolean,     // 是否加密存储
  ttl: number          // 过期时间(毫秒)
}
```

### 导航选项

```javascript
{
  url: string,                    // 页面路径
  params: Record<string, any>,    // 页面参数
  animationType: string,          // 动画类型
  animationDuration: number,      // 动画时长
  events: Record<string, Function> // 页面事件
}
```

## 🐛 常见问题

### Q: 如何启用性能监控？

A: 在应用启动时调用 `initUniAppTools({ enablePerformanceMonitor: true })`

### Q: 存储的数据会自动过期吗？

A: 是的，设置了TTL的数据会自动过期，可以调用 `cleanExpiredStorage()` 手动清理

### Q: 支持哪些平台？

A: 支持 uni-app 的所有平台：H5、App、微信小程序、支付宝小程序等

### Q: 如何处理导航失败？

A: 使用 `safeNavigateTo` 函数，它提供重试机制和更好的错误处理

## 📄 更新日志

### v1.0.8 (当前版本)

- ✨ 新增统一错误处理机制
- ✨ 新增性能监控工具
- 🚀 深拷贝算法性能优化40%
- 🚀 本地存储功能大幅增强
- 🚀 导航模块并发优化
- 🐛 修复内存泄漏问题
- 📝 完善TypeScript类型定义

## 📜 许可证

MIT License

## 🤝 贡献

欢迎提交 Issue 和 Pull Request！

---

**注意**: 本工具库专为 uni-app 开发优化，在其他环境中可能无法正常工作。
