react-util-tools 1.0.0
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 +254 -0
- package/dist/index.cjs +943 -0
- package/dist/index.d.cts +154 -0
- package/dist/index.d.ts +154 -0
- package/dist/index.js +852 -0
- package/package.json +50 -0
- package/src/address/README.md +196 -0
- package/src/address/index.ts +41 -0
- package/src/date/README.md +539 -0
- package/src/date/index.ts +330 -0
- package/src/date/utc/README.md +779 -0
- package/src/date/utc/index.ts +374 -0
- package/src/decimal/README.md +425 -0
- package/src/decimal/index.ts +9 -0
- package/src/decimal/utils/README.md +474 -0
- package/src/decimal/utils/index.ts +244 -0
- package/src/device/README.md +441 -0
- package/src/device/index.ts +214 -0
- package/src/format/README.md +335 -0
- package/src/format/index.ts +189 -0
- package/src/index.ts +107 -0
- package/src/throttle/README.md +152 -0
- package/src/throttle/index.ts +83 -0
- package/tsconfig.json +28 -0
|
@@ -0,0 +1,441 @@
|
|
|
1
|
+
# Device 工具
|
|
2
|
+
|
|
3
|
+
提供获取设备信息、操作系统、浏览器类型和内核等功能的工具函数集合。
|
|
4
|
+
|
|
5
|
+
## 安装
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install your-package-name
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## 使用方法
|
|
12
|
+
|
|
13
|
+
### 导入
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
import {
|
|
17
|
+
getOS,
|
|
18
|
+
getBrowser,
|
|
19
|
+
getBrowserEngine,
|
|
20
|
+
getBrowserVersion,
|
|
21
|
+
isMobile,
|
|
22
|
+
isTablet,
|
|
23
|
+
isDesktop,
|
|
24
|
+
getDeviceType,
|
|
25
|
+
isIOS,
|
|
26
|
+
isAndroid,
|
|
27
|
+
isWeChat,
|
|
28
|
+
isTouchDevice,
|
|
29
|
+
getDevicePixelRatio,
|
|
30
|
+
getScreenResolution,
|
|
31
|
+
getViewportSize,
|
|
32
|
+
getDeviceInfo
|
|
33
|
+
} from 'your-package-name'
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## API
|
|
37
|
+
|
|
38
|
+
### getOS - 获取操作系统
|
|
39
|
+
|
|
40
|
+
获取当前设备的操作系统类型。
|
|
41
|
+
|
|
42
|
+
**返回:** `'Windows'` | `'MacOS'` | `'Linux'` | `'Android'` | `'iOS'` | `'Unknown'`
|
|
43
|
+
|
|
44
|
+
**示例:**
|
|
45
|
+
|
|
46
|
+
```typescript
|
|
47
|
+
const os = getOS()
|
|
48
|
+
console.log(os) // "MacOS" 或 "Windows" 等
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### getBrowser - 获取浏览器类型
|
|
52
|
+
|
|
53
|
+
获取当前使用的浏览器类型。
|
|
54
|
+
|
|
55
|
+
**返回:** `'Chrome'` | `'Safari'` | `'Firefox'` | `'Edge'` | `'Opera'` | `'IE'` | `'Unknown'`
|
|
56
|
+
|
|
57
|
+
**示例:**
|
|
58
|
+
|
|
59
|
+
```typescript
|
|
60
|
+
const browser = getBrowser()
|
|
61
|
+
console.log(browser) // "Chrome" 或 "Safari" 等
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### getBrowserEngine - 获取浏览器内核
|
|
65
|
+
|
|
66
|
+
获取当前浏览器使用的渲染引擎。
|
|
67
|
+
|
|
68
|
+
**返回:** `'WebKit'` | `'Gecko'` | `'Trident'` | `'Presto'` | `'Unknown'`
|
|
69
|
+
|
|
70
|
+
**示例:**
|
|
71
|
+
|
|
72
|
+
```typescript
|
|
73
|
+
const engine = getBrowserEngine()
|
|
74
|
+
console.log(engine) // "WebKit" 或 "Gecko" 等
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### getBrowserVersion - 获取浏览器版本
|
|
78
|
+
|
|
79
|
+
获取当前浏览器的版本号。
|
|
80
|
+
|
|
81
|
+
**返回:** 版本号字符串
|
|
82
|
+
|
|
83
|
+
**示例:**
|
|
84
|
+
|
|
85
|
+
```typescript
|
|
86
|
+
const version = getBrowserVersion()
|
|
87
|
+
console.log(version) // "120.0.6099.109"
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### isMobile - 判断是否为移动设备
|
|
91
|
+
|
|
92
|
+
判断当前设备是否为移动设备(手机)。
|
|
93
|
+
|
|
94
|
+
**返回:** `boolean`
|
|
95
|
+
|
|
96
|
+
**示例:**
|
|
97
|
+
|
|
98
|
+
```typescript
|
|
99
|
+
if (isMobile()) {
|
|
100
|
+
console.log('当前是移动设备')
|
|
101
|
+
// 加载移动端样式或组件
|
|
102
|
+
}
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### isTablet - 判断是否为平板设备
|
|
106
|
+
|
|
107
|
+
判断当前设备是否为平板设备。
|
|
108
|
+
|
|
109
|
+
**返回:** `boolean`
|
|
110
|
+
|
|
111
|
+
**示例:**
|
|
112
|
+
|
|
113
|
+
```typescript
|
|
114
|
+
if (isTablet()) {
|
|
115
|
+
console.log('当前是平板设备')
|
|
116
|
+
}
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### isDesktop - 判断是否为桌面设备
|
|
120
|
+
|
|
121
|
+
判断当前设备是否为桌面设备。
|
|
122
|
+
|
|
123
|
+
**返回:** `boolean`
|
|
124
|
+
|
|
125
|
+
**示例:**
|
|
126
|
+
|
|
127
|
+
```typescript
|
|
128
|
+
if (isDesktop()) {
|
|
129
|
+
console.log('当前是桌面设备')
|
|
130
|
+
// 显示桌面端特有功能
|
|
131
|
+
}
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### getDeviceType - 获取设备类型
|
|
135
|
+
|
|
136
|
+
获取当前设备的类型。
|
|
137
|
+
|
|
138
|
+
**返回:** `'mobile'` | `'tablet'` | `'desktop'`
|
|
139
|
+
|
|
140
|
+
**示例:**
|
|
141
|
+
|
|
142
|
+
```typescript
|
|
143
|
+
const deviceType = getDeviceType()
|
|
144
|
+
|
|
145
|
+
switch (deviceType) {
|
|
146
|
+
case 'mobile':
|
|
147
|
+
console.log('移动端')
|
|
148
|
+
break
|
|
149
|
+
case 'tablet':
|
|
150
|
+
console.log('平板端')
|
|
151
|
+
break
|
|
152
|
+
case 'desktop':
|
|
153
|
+
console.log('桌面端')
|
|
154
|
+
break
|
|
155
|
+
}
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### isIOS - 判断是否为 iOS 设备
|
|
159
|
+
|
|
160
|
+
判断当前设备是否为 iOS 系统(iPhone、iPad、iPod)。
|
|
161
|
+
|
|
162
|
+
**返回:** `boolean`
|
|
163
|
+
|
|
164
|
+
**示例:**
|
|
165
|
+
|
|
166
|
+
```typescript
|
|
167
|
+
if (isIOS()) {
|
|
168
|
+
console.log('当前是 iOS 设备')
|
|
169
|
+
// iOS 特定处理
|
|
170
|
+
}
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### isAndroid - 判断是否为 Android 设备
|
|
174
|
+
|
|
175
|
+
判断当前设备是否为 Android 系统。
|
|
176
|
+
|
|
177
|
+
**返回:** `boolean`
|
|
178
|
+
|
|
179
|
+
**示例:**
|
|
180
|
+
|
|
181
|
+
```typescript
|
|
182
|
+
if (isAndroid()) {
|
|
183
|
+
console.log('当前是 Android 设备')
|
|
184
|
+
// Android 特定处理
|
|
185
|
+
}
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### isWeChat - 判断是否为微信浏览器
|
|
189
|
+
|
|
190
|
+
判断当前是否在微信内置浏览器中打开。
|
|
191
|
+
|
|
192
|
+
**返回:** `boolean`
|
|
193
|
+
|
|
194
|
+
**示例:**
|
|
195
|
+
|
|
196
|
+
```typescript
|
|
197
|
+
if (isWeChat()) {
|
|
198
|
+
console.log('在微信中打开')
|
|
199
|
+
// 调用微信 JS-SDK
|
|
200
|
+
}
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
### isTouchDevice - 判断是否支持触摸
|
|
204
|
+
|
|
205
|
+
判断当前设备是否支持触摸事件。
|
|
206
|
+
|
|
207
|
+
**返回:** `boolean`
|
|
208
|
+
|
|
209
|
+
**示例:**
|
|
210
|
+
|
|
211
|
+
```typescript
|
|
212
|
+
if (isTouchDevice()) {
|
|
213
|
+
console.log('支持触摸操作')
|
|
214
|
+
// 启用触摸手势
|
|
215
|
+
}
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
### getDevicePixelRatio - 获取设备像素比
|
|
219
|
+
|
|
220
|
+
获取当前设备的像素比(DPR)。
|
|
221
|
+
|
|
222
|
+
**返回:** `number`
|
|
223
|
+
|
|
224
|
+
**示例:**
|
|
225
|
+
|
|
226
|
+
```typescript
|
|
227
|
+
const dpr = getDevicePixelRatio()
|
|
228
|
+
console.log(dpr) // 1, 2, 3 等
|
|
229
|
+
|
|
230
|
+
// 用于高清图片适配
|
|
231
|
+
if (dpr >= 2) {
|
|
232
|
+
imageUrl = imageUrl.replace('.jpg', '@2x.jpg')
|
|
233
|
+
}
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
### getScreenResolution - 获取屏幕分辨率
|
|
237
|
+
|
|
238
|
+
获取设备屏幕的物理分辨率。
|
|
239
|
+
|
|
240
|
+
**返回:** `{ width: number, height: number }`
|
|
241
|
+
|
|
242
|
+
**示例:**
|
|
243
|
+
|
|
244
|
+
```typescript
|
|
245
|
+
const resolution = getScreenResolution()
|
|
246
|
+
console.log(resolution) // { width: 1920, height: 1080 }
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
### getViewportSize - 获取视口尺寸
|
|
250
|
+
|
|
251
|
+
获取浏览器视口(可视区域)的尺寸。
|
|
252
|
+
|
|
253
|
+
**返回:** `{ width: number, height: number }`
|
|
254
|
+
|
|
255
|
+
**示例:**
|
|
256
|
+
|
|
257
|
+
```typescript
|
|
258
|
+
const viewport = getViewportSize()
|
|
259
|
+
console.log(viewport) // { width: 1440, height: 900 }
|
|
260
|
+
|
|
261
|
+
// 响应式布局判断
|
|
262
|
+
if (viewport.width < 768) {
|
|
263
|
+
console.log('小屏幕设备')
|
|
264
|
+
}
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
### getDeviceInfo - 获取完整设备信息
|
|
268
|
+
|
|
269
|
+
一次性获取所有设备相关信息。
|
|
270
|
+
|
|
271
|
+
**返回:** 包含所有设备信息的对象
|
|
272
|
+
|
|
273
|
+
**示例:**
|
|
274
|
+
|
|
275
|
+
```typescript
|
|
276
|
+
const deviceInfo = getDeviceInfo()
|
|
277
|
+
console.log(deviceInfo)
|
|
278
|
+
/*
|
|
279
|
+
{
|
|
280
|
+
os: "MacOS",
|
|
281
|
+
browser: "Chrome",
|
|
282
|
+
browserVersion: "120.0.6099.109",
|
|
283
|
+
browserEngine: "WebKit",
|
|
284
|
+
deviceType: "desktop",
|
|
285
|
+
isMobile: false,
|
|
286
|
+
isTablet: false,
|
|
287
|
+
isDesktop: true,
|
|
288
|
+
isIOS: false,
|
|
289
|
+
isAndroid: false,
|
|
290
|
+
isWeChat: false,
|
|
291
|
+
isTouchDevice: false,
|
|
292
|
+
devicePixelRatio: 2,
|
|
293
|
+
screenResolution: { width: 1920, height: 1080 },
|
|
294
|
+
viewportSize: { width: 1440, height: 900 },
|
|
295
|
+
userAgent: "Mozilla/5.0..."
|
|
296
|
+
}
|
|
297
|
+
*/
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
## 实际应用场景
|
|
301
|
+
|
|
302
|
+
### 响应式布局适配
|
|
303
|
+
|
|
304
|
+
```typescript
|
|
305
|
+
import { getDeviceType, getViewportSize } from 'your-package-name'
|
|
306
|
+
|
|
307
|
+
const deviceType = getDeviceType()
|
|
308
|
+
const viewport = getViewportSize()
|
|
309
|
+
|
|
310
|
+
// 根据设备类型加载不同组件
|
|
311
|
+
if (deviceType === 'mobile') {
|
|
312
|
+
// 加载移动端组件
|
|
313
|
+
} else if (deviceType === 'tablet') {
|
|
314
|
+
// 加载平板端组件
|
|
315
|
+
} else {
|
|
316
|
+
// 加载桌面端组件
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
// 根据视口宽度调整布局
|
|
320
|
+
if (viewport.width < 768) {
|
|
321
|
+
// 小屏幕布局
|
|
322
|
+
} else if (viewport.width < 1024) {
|
|
323
|
+
// 中等屏幕布局
|
|
324
|
+
} else {
|
|
325
|
+
// 大屏幕布局
|
|
326
|
+
}
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
### 浏览器兼容性处理
|
|
330
|
+
|
|
331
|
+
```typescript
|
|
332
|
+
import { getBrowser, getBrowserVersion } from 'your-package-name'
|
|
333
|
+
|
|
334
|
+
const browser = getBrowser()
|
|
335
|
+
const version = getBrowserVersion()
|
|
336
|
+
|
|
337
|
+
// 针对特定浏览器的兼容处理
|
|
338
|
+
if (browser === 'IE') {
|
|
339
|
+
alert('建议使用现代浏览器以获得最佳体验')
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
// 版本检查
|
|
343
|
+
if (browser === 'Chrome' && parseFloat(version) < 90) {
|
|
344
|
+
console.warn('Chrome 版本过低,部分功能可能不可用')
|
|
345
|
+
}
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
### 移动端特殊处理
|
|
349
|
+
|
|
350
|
+
```typescript
|
|
351
|
+
import { isMobile, isIOS, isAndroid, isWeChat } from 'your-package-name'
|
|
352
|
+
|
|
353
|
+
if (isMobile()) {
|
|
354
|
+
// 禁用桌面端特有功能
|
|
355
|
+
document.body.classList.add('mobile')
|
|
356
|
+
|
|
357
|
+
if (isIOS()) {
|
|
358
|
+
// iOS 特定处理(如解决滚动问题)
|
|
359
|
+
document.body.style.webkitOverflowScrolling = 'touch'
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
if (isAndroid()) {
|
|
363
|
+
// Android 特定处理
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
if (isWeChat()) {
|
|
367
|
+
// 微信内分享功能
|
|
368
|
+
initWeChatShare()
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
### 高清图片适配
|
|
374
|
+
|
|
375
|
+
```typescript
|
|
376
|
+
import { getDevicePixelRatio } from 'your-package-name'
|
|
377
|
+
|
|
378
|
+
function getOptimizedImageUrl(baseUrl: string): string {
|
|
379
|
+
const dpr = getDevicePixelRatio()
|
|
380
|
+
|
|
381
|
+
if (dpr >= 3) {
|
|
382
|
+
return baseUrl.replace('.jpg', '@3x.jpg')
|
|
383
|
+
} else if (dpr >= 2) {
|
|
384
|
+
return baseUrl.replace('.jpg', '@2x.jpg')
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
return baseUrl
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
const imageUrl = getOptimizedImageUrl('/images/logo.jpg')
|
|
391
|
+
```
|
|
392
|
+
|
|
393
|
+
### 数据统计上报
|
|
394
|
+
|
|
395
|
+
```typescript
|
|
396
|
+
import { getDeviceInfo } from 'your-package-name'
|
|
397
|
+
|
|
398
|
+
function reportAnalytics() {
|
|
399
|
+
const deviceInfo = getDeviceInfo()
|
|
400
|
+
|
|
401
|
+
// 上报设备信息用于数据分析
|
|
402
|
+
analytics.track('page_view', {
|
|
403
|
+
os: deviceInfo.os,
|
|
404
|
+
browser: deviceInfo.browser,
|
|
405
|
+
browserVersion: deviceInfo.browserVersion,
|
|
406
|
+
deviceType: deviceInfo.deviceType,
|
|
407
|
+
screenResolution: `${deviceInfo.screenResolution.width}x${deviceInfo.screenResolution.height}`,
|
|
408
|
+
isMobile: deviceInfo.isMobile
|
|
409
|
+
})
|
|
410
|
+
}
|
|
411
|
+
```
|
|
412
|
+
|
|
413
|
+
### 触摸事件处理
|
|
414
|
+
|
|
415
|
+
```typescript
|
|
416
|
+
import { isTouchDevice } from 'your-package-name'
|
|
417
|
+
|
|
418
|
+
const eventType = isTouchDevice() ? 'touchstart' : 'mousedown'
|
|
419
|
+
|
|
420
|
+
element.addEventListener(eventType, (e) => {
|
|
421
|
+
console.log('用户交互')
|
|
422
|
+
})
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
## TypeScript 支持
|
|
426
|
+
|
|
427
|
+
完整的 TypeScript 类型支持。
|
|
428
|
+
|
|
429
|
+
```typescript
|
|
430
|
+
const os: string = getOS()
|
|
431
|
+
const isMobileDevice: boolean = isMobile()
|
|
432
|
+
const deviceType: 'mobile' | 'tablet' | 'desktop' = getDeviceType()
|
|
433
|
+
const resolution: { width: number; height: number } = getScreenResolution()
|
|
434
|
+
```
|
|
435
|
+
|
|
436
|
+
## 注意事项
|
|
437
|
+
|
|
438
|
+
- 所有判断基于 User Agent,可能存在被伪造的情况
|
|
439
|
+
- 部分浏览器可能返回 `'Unknown'`
|
|
440
|
+
- 建议结合特性检测(Feature Detection)使用,不要完全依赖 UA 判断
|
|
441
|
+
- `getDeviceInfo()` 会一次性执行所有检测,适合需要完整信息的场景
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 获取用户代理字符串
|
|
3
|
+
*/
|
|
4
|
+
function getUserAgent(): string {
|
|
5
|
+
return navigator.userAgent.toLowerCase()
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* 获取操作系统类型
|
|
10
|
+
* @returns 操作系统名称
|
|
11
|
+
*/
|
|
12
|
+
export function getOS(): string {
|
|
13
|
+
const ua = getUserAgent()
|
|
14
|
+
|
|
15
|
+
if (ua.includes('win')) return 'Windows'
|
|
16
|
+
if (ua.includes('mac')) return 'MacOS'
|
|
17
|
+
if (ua.includes('linux')) return 'Linux'
|
|
18
|
+
if (ua.includes('android')) return 'Android'
|
|
19
|
+
if (ua.includes('iphone') || ua.includes('ipad') || ua.includes('ipod')) return 'iOS'
|
|
20
|
+
|
|
21
|
+
return 'Unknown'
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* 获取浏览器类型
|
|
26
|
+
* @returns 浏览器名称
|
|
27
|
+
*/
|
|
28
|
+
export function getBrowser(): string {
|
|
29
|
+
const ua = getUserAgent()
|
|
30
|
+
|
|
31
|
+
if (ua.includes('edg')) return 'Edge'
|
|
32
|
+
if (ua.includes('chrome')) return 'Chrome'
|
|
33
|
+
if (ua.includes('safari') && !ua.includes('chrome')) return 'Safari'
|
|
34
|
+
if (ua.includes('firefox')) return 'Firefox'
|
|
35
|
+
if (ua.includes('opera') || ua.includes('opr')) return 'Opera'
|
|
36
|
+
if (ua.includes('trident') || ua.includes('msie')) return 'IE'
|
|
37
|
+
|
|
38
|
+
return 'Unknown'
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* 获取浏览器内核
|
|
43
|
+
* @returns 浏览器内核名称
|
|
44
|
+
*/
|
|
45
|
+
export function getBrowserEngine(): string {
|
|
46
|
+
const ua = getUserAgent()
|
|
47
|
+
|
|
48
|
+
if (ua.includes('trident')) return 'Trident'
|
|
49
|
+
if (ua.includes('gecko') && !ua.includes('webkit')) return 'Gecko'
|
|
50
|
+
if (ua.includes('webkit')) return 'WebKit'
|
|
51
|
+
if (ua.includes('presto')) return 'Presto'
|
|
52
|
+
|
|
53
|
+
return 'Unknown'
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* 判断是否为移动设备
|
|
58
|
+
* @returns true 为移动设备,false 为桌面设备
|
|
59
|
+
*/
|
|
60
|
+
export function isMobile(): boolean {
|
|
61
|
+
const ua = getUserAgent()
|
|
62
|
+
return /mobile|android|iphone|ipad|ipod|blackberry|iemobile|opera mini/i.test(ua)
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* 判断是否为平板设备
|
|
67
|
+
* @returns true 为平板设备
|
|
68
|
+
*/
|
|
69
|
+
export function isTablet(): boolean {
|
|
70
|
+
const ua = getUserAgent()
|
|
71
|
+
return /ipad|android(?!.*mobile)|tablet/i.test(ua)
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* 判断是否为桌面设备
|
|
76
|
+
* @returns true 为桌面设备
|
|
77
|
+
*/
|
|
78
|
+
export function isDesktop(): boolean {
|
|
79
|
+
return !isMobile() && !isTablet()
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* 获取设备类型
|
|
84
|
+
* @returns 'mobile' | 'tablet' | 'desktop'
|
|
85
|
+
*/
|
|
86
|
+
export function getDeviceType(): 'mobile' | 'tablet' | 'desktop' {
|
|
87
|
+
if (isMobile()) return 'mobile'
|
|
88
|
+
if (isTablet()) return 'tablet'
|
|
89
|
+
return 'desktop'
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* 判断是否为微信浏览器
|
|
94
|
+
* @returns true 为微信浏览器
|
|
95
|
+
*/
|
|
96
|
+
export function isWeChat(): boolean {
|
|
97
|
+
const ua = getUserAgent()
|
|
98
|
+
return /micromessenger/i.test(ua)
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* 判断是否为 iOS 设备
|
|
103
|
+
* @returns true 为 iOS 设备
|
|
104
|
+
*/
|
|
105
|
+
export function isIOS(): boolean {
|
|
106
|
+
const ua = getUserAgent()
|
|
107
|
+
return /iphone|ipad|ipod/i.test(ua)
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* 判断是否为 Android 设备
|
|
112
|
+
* @returns true 为 Android 设备
|
|
113
|
+
*/
|
|
114
|
+
export function isAndroid(): boolean {
|
|
115
|
+
const ua = getUserAgent()
|
|
116
|
+
return /android/i.test(ua)
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* 获取浏览器版本号
|
|
121
|
+
* @returns 版本号字符串
|
|
122
|
+
*/
|
|
123
|
+
export function getBrowserVersion(): string {
|
|
124
|
+
const ua = navigator.userAgent
|
|
125
|
+
const browser = getBrowser()
|
|
126
|
+
|
|
127
|
+
let match: RegExpMatchArray | null = null
|
|
128
|
+
|
|
129
|
+
switch (browser) {
|
|
130
|
+
case 'Chrome':
|
|
131
|
+
match = ua.match(/chrome\/([\d.]+)/i)
|
|
132
|
+
break
|
|
133
|
+
case 'Safari':
|
|
134
|
+
match = ua.match(/version\/([\d.]+)/i)
|
|
135
|
+
break
|
|
136
|
+
case 'Firefox':
|
|
137
|
+
match = ua.match(/firefox\/([\d.]+)/i)
|
|
138
|
+
break
|
|
139
|
+
case 'Edge':
|
|
140
|
+
match = ua.match(/edg\/([\d.]+)/i)
|
|
141
|
+
break
|
|
142
|
+
case 'Opera':
|
|
143
|
+
match = ua.match(/(?:opera|opr)\/([\d.]+)/i)
|
|
144
|
+
break
|
|
145
|
+
case 'IE':
|
|
146
|
+
match = ua.match(/(?:msie |rv:)([\d.]+)/i)
|
|
147
|
+
break
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
return match ? match[1] : 'Unknown'
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* 获取设备像素比
|
|
155
|
+
* @returns 设备像素比
|
|
156
|
+
*/
|
|
157
|
+
export function getDevicePixelRatio(): number {
|
|
158
|
+
return window.devicePixelRatio || 1
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* 获取屏幕分辨率
|
|
163
|
+
* @returns { width: number, height: number }
|
|
164
|
+
*/
|
|
165
|
+
export function getScreenResolution(): { width: number; height: number } {
|
|
166
|
+
return {
|
|
167
|
+
width: window.screen.width,
|
|
168
|
+
height: window.screen.height
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* 获取视口尺寸
|
|
174
|
+
* @returns { width: number, height: number }
|
|
175
|
+
*/
|
|
176
|
+
export function getViewportSize(): { width: number; height: number } {
|
|
177
|
+
return {
|
|
178
|
+
width: window.innerWidth || document.documentElement.clientWidth,
|
|
179
|
+
height: window.innerHeight || document.documentElement.clientHeight
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* 判断是否支持触摸事件
|
|
185
|
+
* @returns true 支持触摸
|
|
186
|
+
*/
|
|
187
|
+
export function isTouchDevice(): boolean {
|
|
188
|
+
return 'ontouchstart' in window || navigator.maxTouchPoints > 0
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* 获取设备完整信息
|
|
193
|
+
* @returns 包含所有设备信息的对象
|
|
194
|
+
*/
|
|
195
|
+
export function getDeviceInfo() {
|
|
196
|
+
return {
|
|
197
|
+
os: getOS(),
|
|
198
|
+
browser: getBrowser(),
|
|
199
|
+
browserVersion: getBrowserVersion(),
|
|
200
|
+
browserEngine: getBrowserEngine(),
|
|
201
|
+
deviceType: getDeviceType(),
|
|
202
|
+
isMobile: isMobile(),
|
|
203
|
+
isTablet: isTablet(),
|
|
204
|
+
isDesktop: isDesktop(),
|
|
205
|
+
isIOS: isIOS(),
|
|
206
|
+
isAndroid: isAndroid(),
|
|
207
|
+
isWeChat: isWeChat(),
|
|
208
|
+
isTouchDevice: isTouchDevice(),
|
|
209
|
+
devicePixelRatio: getDevicePixelRatio(),
|
|
210
|
+
screenResolution: getScreenResolution(),
|
|
211
|
+
viewportSize: getViewportSize(),
|
|
212
|
+
userAgent: navigator.userAgent
|
|
213
|
+
}
|
|
214
|
+
}
|