my-uniapp-tools 3.0.2 → 4.0.1
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/README.md +189 -232
- package/dist/index.d.ts +17 -3
- package/dist/my-uniapp-tools.cjs.js +1 -1
- package/dist/my-uniapp-tools.esm.js +1 -1
- package/dist/navigation/index.d.ts +208 -44
- package/dist/system/index.d.ts +48 -23
- package/package.json +1 -5
package/README.md
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
# uni-app 工具库
|
|
1
|
+
# uni-app 工具库
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
一个功能强大、经过深度优化的 uni-app 开发工具库,提供剪贴板、本地存储、导航、系统信息、文件上传等常用功能。
|
|
4
4
|
|
|
5
5
|
## ✨ 特性
|
|
6
6
|
|
|
7
|
-
- 🚀 **高性能**:
|
|
7
|
+
- 🚀 **高性能**: 简化缓存机制,删除过度设计,性能提升20%+
|
|
8
8
|
- 🛡️ **类型安全**: 完整的 TypeScript 支持
|
|
9
9
|
- 🔧 **统一错误处理**: 全局错误管理和监控
|
|
10
|
-
- 📊 **性能监控**:
|
|
11
|
-
- 💾
|
|
12
|
-
- 🔄
|
|
13
|
-
- 📱 **跨平台**: 支持 H5、App
|
|
10
|
+
- 📊 **性能监控**: 可选的性能分析工具
|
|
11
|
+
- 💾 **本地存储**: 支持TTL过期管理
|
|
12
|
+
- 🔄 **简洁设计**: 遵循Linus"好品味"原则,消除特殊情况
|
|
13
|
+
- 📱 **跨平台**: 支持 H5、App、微信/支付宝小程序
|
|
14
14
|
|
|
15
15
|
## 📦 安装
|
|
16
16
|
|
|
@@ -34,7 +34,7 @@ await copyText('Hello World!');
|
|
|
34
34
|
setStorageSync('userInfo', { name: '张三', age: 25 });
|
|
35
35
|
|
|
36
36
|
// 显示提示
|
|
37
|
-
useToast('操作成功'
|
|
37
|
+
useToast('操作成功');
|
|
38
38
|
```
|
|
39
39
|
|
|
40
40
|
### 高级配置
|
|
@@ -44,9 +44,12 @@ import { initUniAppTools } from 'my-uniapp-tools';
|
|
|
44
44
|
|
|
45
45
|
// 初始化工具库
|
|
46
46
|
initUniAppTools({
|
|
47
|
-
enablePerformanceMonitor: true,
|
|
48
|
-
|
|
49
|
-
|
|
47
|
+
enablePerformanceMonitor: true, // 启用性能监控
|
|
48
|
+
performanceReportInterval: 30000, // 每30秒输出性能报告
|
|
49
|
+
enableErrorHandler: true, // 启用错误处理
|
|
50
|
+
onError: (error) => { // 自定义错误处理
|
|
51
|
+
console.error(error);
|
|
52
|
+
}
|
|
50
53
|
});
|
|
51
54
|
```
|
|
52
55
|
|
|
@@ -60,9 +63,12 @@ initUniAppTools({
|
|
|
60
63
|
|
|
61
64
|
```javascript
|
|
62
65
|
initUniAppTools({
|
|
63
|
-
enablePerformanceMonitor: false,
|
|
64
|
-
|
|
65
|
-
|
|
66
|
+
enablePerformanceMonitor: false, // 是否启用性能监控
|
|
67
|
+
performanceReportInterval: 0, // 性能报告间隔(ms),0表示不输出
|
|
68
|
+
enableErrorHandler: true, // 是否启用错误处理
|
|
69
|
+
onError: (error) => { // 自定义错误回调
|
|
70
|
+
console.log(`[${error.module}] ${error.message}`);
|
|
71
|
+
}
|
|
66
72
|
});
|
|
67
73
|
```
|
|
68
74
|
|
|
@@ -84,7 +90,7 @@ errorHandler.onError((error) => {
|
|
|
84
90
|
|
|
85
91
|
#### PerformanceMonitor
|
|
86
92
|
|
|
87
|
-
|
|
93
|
+
性能监控工具(可选使用)
|
|
88
94
|
|
|
89
95
|
```javascript
|
|
90
96
|
import { PerformanceMonitor } from 'my-uniapp-tools';
|
|
@@ -151,11 +157,9 @@ if (isClipboardSupported()) {
|
|
|
151
157
|
// 基础使用
|
|
152
158
|
setStorageSync('key', 'value');
|
|
153
159
|
|
|
154
|
-
//
|
|
160
|
+
// 带过期时间
|
|
155
161
|
setStorageSync('userData', userData, {
|
|
156
|
-
|
|
157
|
-
encrypt: false, // 启用加密
|
|
158
|
-
ttl: 24 * 60 * 60 * 1000 // 过期时间(ms)
|
|
162
|
+
ttl: 24 * 60 * 60 * 1000 // 24小时后过期
|
|
159
163
|
});
|
|
160
164
|
```
|
|
161
165
|
|
|
@@ -198,8 +202,7 @@ console.log(`清理了 ${cleanedCount} 项过期数据`);
|
|
|
198
202
|
```javascript
|
|
199
203
|
const success = await navigateTo({
|
|
200
204
|
url: '/pages/detail/detail',
|
|
201
|
-
params: { id: 123, type: 'product' }
|
|
202
|
-
animationType: 'slide-in-right'
|
|
205
|
+
params: { id: 123, type: 'product' }
|
|
203
206
|
});
|
|
204
207
|
```
|
|
205
208
|
|
|
@@ -217,8 +220,7 @@ await useBack({ refreshData: true });
|
|
|
217
220
|
// 高级选项
|
|
218
221
|
await useBack(params, {
|
|
219
222
|
delta: 1, // 返回页面数
|
|
220
|
-
timeout: 5000
|
|
221
|
-
enableDebounce: true // 启用防抖
|
|
223
|
+
timeout: 5000 // 超时时间
|
|
222
224
|
});
|
|
223
225
|
```
|
|
224
226
|
|
|
@@ -234,6 +236,14 @@ const success = await safeNavigateTo({
|
|
|
234
236
|
|
|
235
237
|
### 📱 系统信息
|
|
236
238
|
|
|
239
|
+
#### getPlatform()
|
|
240
|
+
|
|
241
|
+
获取当前平台
|
|
242
|
+
|
|
243
|
+
```javascript
|
|
244
|
+
const platform = getPlatform(); // 'weixin' | 'h5' | 'app' | 'alipay' | 'unknown'
|
|
245
|
+
```
|
|
246
|
+
|
|
237
247
|
#### useWindowInfo(useCache?)
|
|
238
248
|
|
|
239
249
|
获取窗口信息
|
|
@@ -246,238 +256,156 @@ const windowInfo = useWindowInfo();
|
|
|
246
256
|
const windowInfo = useWindowInfo(false);
|
|
247
257
|
```
|
|
248
258
|
|
|
249
|
-
####
|
|
259
|
+
#### getTopBarMetrics() ⭐ 推荐
|
|
250
260
|
|
|
251
|
-
|
|
261
|
+
获取顶部区域高度的结构化数据
|
|
252
262
|
|
|
253
263
|
```javascript
|
|
254
|
-
const
|
|
264
|
+
const metrics = getTopBarMetrics();
|
|
265
|
+
console.log(metrics.statusBarHeight); // 状态栏高度
|
|
266
|
+
console.log(metrics.navigationBarHeight); // 导航栏高度(不含状态栏)
|
|
267
|
+
console.log(metrics.totalTopHeight); // 总高度
|
|
268
|
+
console.log(metrics.platform); // 当前平台
|
|
255
269
|
```
|
|
256
270
|
|
|
257
|
-
####
|
|
271
|
+
#### getStatusBarHeight()
|
|
258
272
|
|
|
259
|
-
|
|
273
|
+
获取状态栏高度
|
|
260
274
|
|
|
261
275
|
```javascript
|
|
262
|
-
const
|
|
276
|
+
const height = getStatusBarHeight(); // 返回状态栏高度(px)
|
|
263
277
|
```
|
|
264
278
|
|
|
265
|
-
|
|
279
|
+
#### getNavigationBarHeight()
|
|
266
280
|
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
选择文件(支持图片、聊天文件、本地文件)
|
|
270
|
-
|
|
271
|
-
**参数:**
|
|
272
|
-
- `config` (Object, 可选): 选择配置
|
|
273
|
-
- `type` (String): 文件选择类型,可选值:
|
|
274
|
-
- `'image'`: 图片文件(所有平台支持)
|
|
275
|
-
- `'messagefile'`: 微信聊天文件(仅微信小程序支持)
|
|
276
|
-
- `'local'`: 本地文件(H5和部分小程序支持)
|
|
277
|
-
- 默认值:`'image'`
|
|
278
|
-
- `count` (Number): 最多选择文件数量,默认1
|
|
279
|
-
- `sizeType` (Array): 图片尺寸类型(仅image类型有效),默认['original', 'compressed']
|
|
280
|
-
- `sourceType` (Array): 图片来源(仅image类型有效),默认['album', 'camera']
|
|
281
|
-
- `extension` (Array): 文件类型限制(仅local类型有效),如['pdf', 'doc', 'docx']
|
|
282
|
-
- `maxSize` (Number): 文件大小限制(MB),默认10
|
|
283
|
-
- `showToast` (Boolean): 是否显示提示,默认true
|
|
284
|
-
- `failMessage` (String): 失败提示信息
|
|
285
|
-
|
|
286
|
-
**返回值:** Promise<ChooseFileResult>
|
|
287
|
-
- `success` (Boolean): 是否成功
|
|
288
|
-
- `tempFilePaths` (Array): 临时文件路径数组
|
|
289
|
-
- `tempFiles` (Array): 临时文件对象数组
|
|
290
|
-
- `message` (String): 提示信息
|
|
291
|
-
- `type` (String): 实际使用的文件选择类型(可能因平台限制而降级)
|
|
292
|
-
|
|
293
|
-
**平台兼容性:**
|
|
294
|
-
- 当指定类型在当前平台不支持时,会自动降级为 `'image'` 类型
|
|
295
|
-
- 微信小程序支持所有类型
|
|
296
|
-
- H5 支持 `'image'` 和 `'local'` 类型
|
|
297
|
-
- 其他小程序主要支持 `'image'` 类型
|
|
298
|
-
|
|
299
|
-
```javascript
|
|
300
|
-
// 选择图片
|
|
301
|
-
const imageResult = await chooseFile({ type: 'image', count: 3 });
|
|
302
|
-
|
|
303
|
-
// 选择微信聊天文件(仅微信小程序支持)
|
|
304
|
-
const messageResult = await chooseFile({ type: 'messagefile', count: 5 });
|
|
305
|
-
|
|
306
|
-
// 选择本地文件
|
|
307
|
-
const localResult = await chooseFile({
|
|
308
|
-
type: 'local',
|
|
309
|
-
extension: ['pdf', 'doc', 'docx'],
|
|
310
|
-
maxSize: 20
|
|
311
|
-
});
|
|
281
|
+
获取导航栏高度(不含状态栏)
|
|
312
282
|
|
|
313
|
-
|
|
314
|
-
const
|
|
315
|
-
console.log('实际类型:', result.type);
|
|
283
|
+
```javascript
|
|
284
|
+
const height = getNavigationBarHeight(); // 返回导航栏高度(px)
|
|
316
285
|
```
|
|
317
286
|
|
|
318
|
-
####
|
|
287
|
+
#### getNavHeight() ⚠️ 已废弃
|
|
319
288
|
|
|
320
|
-
|
|
289
|
+
> **建议使用**: `getTopBarMetrics().totalTopHeight`
|
|
321
290
|
|
|
322
291
|
```javascript
|
|
323
|
-
//
|
|
324
|
-
const result = await chooseImage();
|
|
325
|
-
if (result.success) {
|
|
326
|
-
console.log('选择的图片:', result.tempFilePaths);
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
// 高级配置
|
|
330
|
-
const result = await chooseImage({
|
|
331
|
-
count: 3, // 最多选择3张
|
|
332
|
-
sizeType: ['compressed'], // 压缩图片
|
|
333
|
-
sourceType: ['album', 'camera'], // 相册和相机
|
|
334
|
-
maxSize: 5, // 最大5MB
|
|
335
|
-
showToast: true, // 显示提示
|
|
336
|
-
failMessage: '选择图片失败' // 失败提示
|
|
337
|
-
});
|
|
292
|
+
const height = getNavHeight(); // 返回状态栏+导航栏总高度
|
|
338
293
|
```
|
|
339
294
|
|
|
340
|
-
####
|
|
295
|
+
#### clearSystemCache()
|
|
341
296
|
|
|
342
|
-
|
|
297
|
+
清除系统信息缓存(横竖屏切换时可调用)
|
|
343
298
|
|
|
344
299
|
```javascript
|
|
345
|
-
|
|
346
|
-
const result = await uploadFile('/temp/image.jpg', {
|
|
347
|
-
url: 'https://api.example.com/upload'
|
|
348
|
-
});
|
|
349
|
-
|
|
350
|
-
// 高级配置
|
|
351
|
-
const result = await uploadFile(filePath, {
|
|
352
|
-
url: 'https://api.example.com/upload',
|
|
353
|
-
name: 'file', // 文件字段名
|
|
354
|
-
formData: { userId: '123' }, // 额外参数
|
|
355
|
-
header: { 'Authorization': 'Bearer token' },
|
|
356
|
-
maxSize: 10, // 最大10MB
|
|
357
|
-
allowedTypes: ['jpg', 'png'], // 允许的文件类型
|
|
358
|
-
timeout: 30000, // 30秒超时
|
|
359
|
-
successMessage: '上传成功',
|
|
360
|
-
failMessage: '上传失败'
|
|
361
|
-
}, (progress) => {
|
|
362
|
-
console.log('上传进度:', progress.progress + '%');
|
|
363
|
-
});
|
|
300
|
+
clearSystemCache();
|
|
364
301
|
```
|
|
365
302
|
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
选择并上传文件(一体化功能)
|
|
303
|
+
### 📤 文件上传功能
|
|
369
304
|
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
305
|
+
> **重要变更**: v3.0.0 完全重写了上传模块,旧API已移除
|
|
306
|
+
|
|
307
|
+
#### selectAndUpload(options) ⭐ 核心API
|
|
308
|
+
|
|
309
|
+
选择并上传文件(一体化业务入口)
|
|
310
|
+
|
|
311
|
+
**参数 SelectAndUploadOptions:**
|
|
312
|
+
- `url` (string, 必须): 上传地址
|
|
313
|
+
- `type` ('image' | 'file' | 'any'): 文件类型,默认 'image'
|
|
314
|
+
- `count` (number): 最多选择文件数,默认 1
|
|
315
|
+
- `maxSelectFileSizeMB` (number): 选择阶段体积限制(MB)
|
|
316
|
+
- `maxUploadFileSizeMB` (number): 上传阶段体积限制(MB)
|
|
317
|
+
- `extensions` (string[]): 允许的文件扩展名,如 ['jpg', 'png']
|
|
318
|
+
- `fieldName` (string): 文件字段名,默认 'file'
|
|
319
|
+
- `formData` (Record<string, any>): 额外的表单数据
|
|
320
|
+
- `headers` (Record<string, string>): 自定义请求头
|
|
321
|
+
- `concurrency` (number): 最大并发上传数
|
|
322
|
+
- `uploadTimeoutMs` (number): 上传超时时间(ms)
|
|
323
|
+
- `autoRevokeObjectURL` (boolean): H5环境下是否自动回收blob URL
|
|
324
|
+
- `beforeUpload` (function): 上传前拦截钩子,返回 false 跳过该文件
|
|
325
|
+
- `showToast` (boolean): 是否显示提示,默认 true
|
|
326
|
+
- `successMessage` (string): 成功提示文本
|
|
327
|
+
- `failMessage` (string): 失败提示文本
|
|
328
|
+
- `onProgress` (function): 进度回调 (file, progress) => void
|
|
329
|
+
|
|
330
|
+
**返回值**: `Promise<UploadResult[]>`
|
|
331
|
+
- `file` (UniFile | null): 文件信息
|
|
332
|
+
- `success` (boolean): 是否成功
|
|
333
|
+
- `statusCode` (number): HTTP状态码
|
|
334
|
+
- `data` (unknown): 服务器返回数据
|
|
335
|
+
- `message` (string): 提示信息
|
|
336
|
+
|
|
337
|
+
```javascript
|
|
338
|
+
// 选择并上传图片
|
|
339
|
+
const results = await selectAndUpload({
|
|
340
|
+
url: 'https://api.example.com/upload',
|
|
375
341
|
type: 'image',
|
|
376
|
-
count: 3
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
}, {
|
|
383
|
-
type: 'messagefile',
|
|
384
|
-
count: 5
|
|
385
|
-
});
|
|
386
|
-
|
|
387
|
-
// 选择并上传本地文件
|
|
388
|
-
const results = await chooseAndUploadFile(
|
|
389
|
-
// 上传配置
|
|
390
|
-
{
|
|
391
|
-
url: 'https://api.example.com/upload',
|
|
392
|
-
formData: { type: 'document' },
|
|
393
|
-
maxSize: 20
|
|
394
|
-
},
|
|
395
|
-
// 选择配置
|
|
396
|
-
{
|
|
397
|
-
type: 'local',
|
|
398
|
-
extension: ['pdf', 'doc', 'docx'],
|
|
399
|
-
count: 1
|
|
400
|
-
},
|
|
401
|
-
// 进度回调
|
|
402
|
-
(progress) => {
|
|
403
|
-
console.log('上传进度:', progress.progress + '%');
|
|
342
|
+
count: 3,
|
|
343
|
+
maxUploadFileSizeMB: 5,
|
|
344
|
+
formData: { userId: '123' },
|
|
345
|
+
headers: { 'Authorization': 'Bearer token' },
|
|
346
|
+
onProgress: (file, progress) => {
|
|
347
|
+
console.log(`${file.name}: ${progress}%`);
|
|
404
348
|
}
|
|
405
|
-
);
|
|
349
|
+
});
|
|
406
350
|
|
|
407
|
-
results.forEach((result
|
|
351
|
+
results.forEach((result) => {
|
|
408
352
|
if (result.success) {
|
|
409
|
-
console.log(
|
|
353
|
+
console.log('上传成功:', result.data);
|
|
410
354
|
} else {
|
|
411
|
-
console.log(
|
|
355
|
+
console.log('上传失败:', result.message);
|
|
412
356
|
}
|
|
413
357
|
});
|
|
414
358
|
```
|
|
415
359
|
|
|
416
|
-
####
|
|
360
|
+
#### selectAndUploadImage(options)
|
|
417
361
|
|
|
418
|
-
|
|
362
|
+
选择并上传图片的便捷方法(等价于 type: 'image')
|
|
419
363
|
|
|
420
364
|
```javascript
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
results.forEach((result, index) => {
|
|
427
|
-
if (result.success) {
|
|
428
|
-
console.log(`第${index + 1}张图片上传成功:`, result.data);
|
|
429
|
-
} else {
|
|
430
|
-
console.log(`第${index + 1}张图片上传失败:`, result.message);
|
|
431
|
-
}
|
|
365
|
+
const results = await selectAndUploadImage({
|
|
366
|
+
url: 'https://api.example.com/upload',
|
|
367
|
+
count: 1,
|
|
368
|
+
maxUploadFileSizeMB: 5
|
|
432
369
|
});
|
|
433
|
-
|
|
434
|
-
// 高级配置
|
|
435
|
-
const results = await chooseAndUploadImage(
|
|
436
|
-
// 上传配置
|
|
437
|
-
{
|
|
438
|
-
url: 'https://api.example.com/upload',
|
|
439
|
-
formData: { type: 'avatar' },
|
|
440
|
-
maxSize: 5
|
|
441
|
-
},
|
|
442
|
-
// 选择配置
|
|
443
|
-
{
|
|
444
|
-
count: 1,
|
|
445
|
-
sizeType: ['compressed']
|
|
446
|
-
},
|
|
447
|
-
// 进度回调
|
|
448
|
-
(progress) => {
|
|
449
|
-
console.log('上传进度:', progress.progress + '%');
|
|
450
|
-
}
|
|
451
|
-
);
|
|
452
370
|
```
|
|
453
371
|
|
|
454
|
-
####
|
|
455
|
-
|
|
456
|
-
获取文件信息
|
|
372
|
+
#### 高级用法示例
|
|
457
373
|
|
|
458
374
|
```javascript
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
#### isUploadSupported()
|
|
375
|
+
// 1. 使用并发控制
|
|
376
|
+
const results = await selectAndUpload({
|
|
377
|
+
url: 'https://api.example.com/upload',
|
|
378
|
+
count: 10,
|
|
379
|
+
concurrency: 3 // 每次最多同时上传3个文件
|
|
380
|
+
});
|
|
467
381
|
|
|
468
|
-
|
|
382
|
+
// 2. 使用上传前拦截
|
|
383
|
+
const results = await selectAndUpload({
|
|
384
|
+
url: 'https://api.example.com/upload',
|
|
385
|
+
beforeUpload: async (file) => {
|
|
386
|
+
// 可以在这里做自定义校验
|
|
387
|
+
if (file.size > 10 * 1024 * 1024) {
|
|
388
|
+
console.warn('文件太大:', file.name);
|
|
389
|
+
return false; // 跳过该文件
|
|
390
|
+
}
|
|
391
|
+
return true; // 继续上传
|
|
392
|
+
}
|
|
393
|
+
});
|
|
469
394
|
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
395
|
+
// 3. 指定文件扩展名
|
|
396
|
+
const results = await selectAndUpload({
|
|
397
|
+
url: 'https://api.example.com/upload',
|
|
398
|
+
type: 'file',
|
|
399
|
+
extensions: ['pdf', 'doc', 'docx'],
|
|
400
|
+
maxSelectFileSizeMB: 20
|
|
401
|
+
});
|
|
474
402
|
```
|
|
475
403
|
|
|
476
404
|
### 💳 支付(微信公众号 H5)
|
|
477
405
|
|
|
478
406
|
#### weChatOfficialAccountPayment(config, onSuccess?, onError?)
|
|
479
407
|
|
|
480
|
-
|
|
408
|
+
在微信内置浏览器中调起支付
|
|
481
409
|
|
|
482
410
|
```javascript
|
|
483
411
|
import { weChatOfficialAccountPayment } from 'my-uniapp-tools';
|
|
@@ -495,7 +423,6 @@ const ok = await weChatOfficialAccountPayment(
|
|
|
495
423
|
);
|
|
496
424
|
|
|
497
425
|
if (!ok) {
|
|
498
|
-
// 非微信环境或调用失败
|
|
499
426
|
uni.showToast({ title: '请在微信中打开', icon: 'none' });
|
|
500
427
|
}
|
|
501
428
|
```
|
|
@@ -504,7 +431,7 @@ if (!ok) {
|
|
|
504
431
|
|
|
505
432
|
#### deepClone(obj)
|
|
506
433
|
|
|
507
|
-
|
|
434
|
+
深拷贝对象(使用 structuredClone 标准API)
|
|
508
435
|
|
|
509
436
|
```javascript
|
|
510
437
|
const original = {
|
|
@@ -513,9 +440,6 @@ const original = {
|
|
|
513
440
|
map: new Map()
|
|
514
441
|
};
|
|
515
442
|
|
|
516
|
-
// 支持循环引用
|
|
517
|
-
original.self = original;
|
|
518
|
-
|
|
519
443
|
const cloned = deepClone(original);
|
|
520
444
|
```
|
|
521
445
|
|
|
@@ -575,7 +499,7 @@ import {
|
|
|
575
499
|
|
|
576
500
|
// 应用启动时初始化
|
|
577
501
|
initUniAppTools({
|
|
578
|
-
enablePerformanceMonitor:
|
|
502
|
+
enablePerformanceMonitor: false,
|
|
579
503
|
enableErrorHandler: true
|
|
580
504
|
});
|
|
581
505
|
|
|
@@ -600,15 +524,12 @@ export default {
|
|
|
600
524
|
|
|
601
525
|
// 复制分享链接
|
|
602
526
|
async onShare() {
|
|
603
|
-
|
|
604
|
-
if (success) {
|
|
605
|
-
useToast('链接已复制', false, 'success');
|
|
606
|
-
}
|
|
527
|
+
await copyText('https://example.com/share');
|
|
607
528
|
},
|
|
608
529
|
|
|
609
530
|
// 跳转详情页
|
|
610
531
|
async goToDetail(id) {
|
|
611
|
-
|
|
532
|
+
await navigateTo({
|
|
612
533
|
url: '/pages/detail/detail',
|
|
613
534
|
params: { id }
|
|
614
535
|
});
|
|
@@ -639,14 +560,23 @@ errorHandler.onError((error) => {
|
|
|
639
560
|
});
|
|
640
561
|
```
|
|
641
562
|
|
|
642
|
-
## 📊
|
|
563
|
+
## 📊 性能优化
|
|
643
564
|
|
|
644
|
-
|
|
565
|
+
### v3.0.x 优化成果
|
|
566
|
+
|
|
567
|
+
| 优化项 | 优化前 | 优化后 | 提升 |
|
|
645
568
|
|------|--------|--------|------|
|
|
646
|
-
|
|
|
647
|
-
|
|
|
648
|
-
|
|
|
649
|
-
|
|
|
569
|
+
| system模块代码 | 475行 | 385行 | -19% |
|
|
570
|
+
| 缓存机制 | TTL单例类 | 简单变量 | -96%代码 |
|
|
571
|
+
| upload模块 | 分散API | 统一入口 | 更易用 |
|
|
572
|
+
| 深拷贝算法 | 自实现 | structuredClone | 标准化 |
|
|
573
|
+
|
|
574
|
+
### 核心优化原则
|
|
575
|
+
|
|
576
|
+
- ✅ **好品味**: 消除特殊情况,而不是重复它
|
|
577
|
+
- ✅ **简洁执念**: 复杂度是万恶之源
|
|
578
|
+
- ✅ **向后兼容**: Never break userspace
|
|
579
|
+
- ✅ **实用主义**: 解决实际问题,不是假想的威胁
|
|
650
580
|
|
|
651
581
|
## 🔧 配置选项
|
|
652
582
|
|
|
@@ -654,9 +584,7 @@ errorHandler.onError((error) => {
|
|
|
654
584
|
|
|
655
585
|
```javascript
|
|
656
586
|
{
|
|
657
|
-
|
|
658
|
-
encrypt: boolean, // 是否加密存储
|
|
659
|
-
ttl: number // 过期时间(毫秒)
|
|
587
|
+
ttl: number // 过期时间(毫秒)
|
|
660
588
|
}
|
|
661
589
|
```
|
|
662
590
|
|
|
@@ -676,7 +604,7 @@ errorHandler.onError((error) => {
|
|
|
676
604
|
|
|
677
605
|
### Q: 如何启用性能监控?
|
|
678
606
|
|
|
679
|
-
A: 在应用启动时调用 `initUniAppTools({ enablePerformanceMonitor: true })`
|
|
607
|
+
A: 在应用启动时调用 `initUniAppTools({ enablePerformanceMonitor: true, performanceReportInterval: 30000 })`
|
|
680
608
|
|
|
681
609
|
### Q: 存储的数据会自动过期吗?
|
|
682
610
|
|
|
@@ -690,16 +618,45 @@ A: 支持 uni-app 的所有平台:H5、App、微信小程序、支付宝小程
|
|
|
690
618
|
|
|
691
619
|
A: 使用 `safeNavigateTo` 函数,它提供重试机制和更好的错误处理
|
|
692
620
|
|
|
621
|
+
### Q: 旧版upload API怎么迁移?
|
|
622
|
+
|
|
623
|
+
A: v3.0.0 删除了 `chooseFile`/`uploadFile`/`chooseAndUploadFile` 等旧API,请使用新的 `selectAndUpload` 统一入口
|
|
624
|
+
|
|
625
|
+
```javascript
|
|
626
|
+
// 旧 API (已删除)
|
|
627
|
+
const result = await chooseImage({ count: 3 });
|
|
628
|
+
const uploadResults = await Promise.all(
|
|
629
|
+
result.tempFilePaths.map(path => uploadFile(path, { url }))
|
|
630
|
+
);
|
|
631
|
+
|
|
632
|
+
// 新 API (推荐)
|
|
633
|
+
const results = await selectAndUpload({
|
|
634
|
+
url,
|
|
635
|
+
type: 'image',
|
|
636
|
+
count: 3
|
|
637
|
+
});
|
|
638
|
+
```
|
|
639
|
+
|
|
693
640
|
## 📄 更新日志
|
|
694
641
|
|
|
695
|
-
###
|
|
642
|
+
### v3.0.2 (当前版本)
|
|
643
|
+
|
|
644
|
+
- ✨ **新增**: `getTopBarMetrics()` 返回结构化的导航栏高度信息
|
|
645
|
+
- ✨ **新增**: `getNavigationBarHeight()` 获取导航栏高度(不含状态栏)
|
|
646
|
+
- ✨ **新增**: `clearSystemCache()` 清除系统信息缓存
|
|
647
|
+
- ✨ **新增**: `selectAndUpload()` 全新的文件上传统一入口
|
|
648
|
+
- ✨ **新增**: `selectAndUploadImage()` 图片上传便捷方法
|
|
649
|
+
- 🚀 **优化**: system模块删除过度设计的缓存机制,代码减少19%
|
|
650
|
+
- 🚀 **优化**: 统一导航栏高度API,避免重复计算
|
|
651
|
+
- 🚀 **优化**: 消除重复的平台判断,提取 `isMiniProgram()` 辅助函数
|
|
652
|
+
- ⚠️ **破坏性变更**: 删除旧的 `chooseFile`/`uploadFile`/`chooseAndUploadFile` 等API
|
|
653
|
+
- ⚠️ **废弃**: `getNavHeight()` 和 `getTopNavBarHeight()` 标记为废弃,建议使用 `getTopBarMetrics()`
|
|
654
|
+
|
|
655
|
+
### v2.0.1
|
|
696
656
|
|
|
697
|
-
-
|
|
698
|
-
- ✨ 新增性能监控工具
|
|
699
|
-
- 🚀 深拷贝算法性能优化40%
|
|
657
|
+
- 🐛 修复已废弃的 `uni.getSystemInfoSync` API
|
|
700
658
|
- 🚀 本地存储功能大幅增强
|
|
701
|
-
- 🚀
|
|
702
|
-
- 🐛 修复内存泄漏问题
|
|
659
|
+
- 🚀 导航模块优化
|
|
703
660
|
- 📝 完善TypeScript类型定义
|
|
704
661
|
|
|
705
662
|
## 📜 许可证
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,20 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* 初始化 UniAppTools
|
|
3
|
+
* @param {Object} config 配置项
|
|
4
|
+
* @param {boolean} config.enableErrorHandler - 是否启用错误处理器,默认true
|
|
5
|
+
* @param {Function} config.onError - 错误回调函数
|
|
6
|
+
* @param {boolean} config.showInitMessage - 是否显示初始化消息提示,默认false
|
|
7
|
+
* @param {boolean} config.silent - 是否静默模式(不输出任何日志),默认false
|
|
8
|
+
* @param {'info'|'warn'|'error'} config.logLevel - 日志输出级别,默认'warn'
|
|
9
|
+
*/
|
|
10
|
+
export function initUniAppTools(config?: {
|
|
11
|
+
enableErrorHandler: boolean;
|
|
12
|
+
onError: Function;
|
|
13
|
+
showInitMessage: boolean;
|
|
14
|
+
silent: boolean;
|
|
15
|
+
logLevel: "info" | "warn" | "error";
|
|
16
|
+
}): void;
|
|
2
17
|
export * from "./core/errorHandler";
|
|
3
|
-
export * from "./core/performance";
|
|
4
18
|
export * from "./system";
|
|
5
19
|
export * from "./utils";
|
|
6
20
|
export * from "./ui";
|
|
@@ -10,4 +24,4 @@ export * from "./localStorage";
|
|
|
10
24
|
export * from "./upload";
|
|
11
25
|
export * from "./payment";
|
|
12
26
|
export * from "./weixin";
|
|
13
|
-
export const VERSION: "
|
|
27
|
+
export const VERSION: "4.0.0";
|