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.
@@ -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
+ }