@i17hush/h5-utils 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 ADDED
@@ -0,0 +1,217 @@
1
+ # @i17hush/h5-utils
2
+
3
+ H5 常用工具库,封装前端开发高频方法,采用适配器模式支持浏览器与 Taro 多端切换。
4
+
5
+ ## 安装
6
+
7
+ ```bash
8
+ npm install @i17hush/h5-utils
9
+ ```
10
+
11
+ ## 快速使用
12
+
13
+ ```typescript
14
+ import { formatDate, isEmail, getQueryParam } from '@i17hush/h5-utils';
15
+
16
+ formatDate(new Date(), 'YYYY-MM-DD'); // '2026-04-06'
17
+ isEmail('test@example.com'); // true
18
+ getQueryParam('id'); // URL 中 id 参数值
19
+ ```
20
+
21
+ ## 功能模块
22
+
23
+ ### URL - `parseUrl` `buildUrl` `getQueryParam` `getAllQueryParams`
24
+
25
+ ```typescript
26
+ import { parseUrl, buildUrl, getQueryParam, getAllQueryParams } from '@i17hush/h5-utils';
27
+
28
+ parseUrl('https://example.com/path?foo=bar#hash');
29
+ // { protocol: 'https:', host: 'example.com', pathname: '/path', query: { foo: 'bar' }, hash: '#hash', ... }
30
+
31
+ buildUrl('https://example.com/api', { page: 1, size: 10 });
32
+ // 'https://example.com/api?page=1&size=10'
33
+
34
+ getAllQueryParams(); // 获取当前页面所有查询参数
35
+ ```
36
+
37
+ ### Storage - `getStorage` `setStorage` `removeStorage` `clearStorage`
38
+
39
+ 支持 JSON 自动序列化和过期时间。
40
+
41
+ ```typescript
42
+ import { getStorage, setStorage } from '@i17hush/h5-utils';
43
+
44
+ setStorage('user', { name: 'Tom' }); // 自动 JSON 序列化
45
+ setStorage('token', 'abc123', { expires: 7 * 86400000 }); // 7天后过期
46
+ getStorage<{ name: string }>('user'); // { name: 'Tom' }
47
+ ```
48
+
49
+ ### Cookie - `getCookie` `setCookie` `removeCookie`
50
+
51
+ ```typescript
52
+ import { getCookie, setCookie, removeCookie } from '@i17hush/h5-utils';
53
+
54
+ setCookie('theme', 'dark', { days: 30, path: '/' });
55
+ getCookie('theme'); // 'dark'
56
+ removeCookie('theme');
57
+ ```
58
+
59
+ ### Device - `isIOS` `isAndroid` `isWeChat` `isMobile` `getBrowserType` `getOS`
60
+
61
+ ```typescript
62
+ import { isIOS, isMobile, isWeChat, getBrowserType } from '@i17hush/h5-utils';
63
+
64
+ isIOS(); // boolean
65
+ isMobile(); // boolean
66
+ isWeChat(); // boolean
67
+ getBrowserType(); // 'chrome' | 'safari' | 'weixin' | 'firefox' | 'edge' | ...
68
+ ```
69
+
70
+ ### DOM - `$` `$$` `addClass` `removeClass` `toggleClass` `hasClass` `getStyle` `isInViewport`
71
+
72
+ ```typescript
73
+ import { $, $$, addClass, removeClass, isInViewport } from '@i17hush/h5-utils';
74
+
75
+ const el = $<HTMLDivElement>('.container');
76
+ $$<HTMLElement>('.item').forEach(item => addClass(item, 'active'));
77
+ isInViewport(el); // 元素是否在可视区域内
78
+ ```
79
+
80
+ ### Event - `on` `off` `once` `delegate`
81
+
82
+ ```typescript
83
+ import { on, off, once, delegate } from '@i17hush/h5-utils';
84
+
85
+ const handler = (e: Event) => console.log(e);
86
+ on(window, 'resize', handler);
87
+ off(window, 'resize', handler);
88
+ once(document, 'click', () => console.log('只触发一次'));
89
+
90
+ // 事件委托
91
+ delegate(document.body, '.btn', 'click', (el, e) => {
92
+ console.log('点击了', el);
93
+ });
94
+ ```
95
+
96
+ ### Clipboard - `copyText` `readText`
97
+
98
+ ```typescript
99
+ import { copyText, readText } from '@i17hush/h5-utils';
100
+
101
+ await copyText('Hello World');
102
+ const text = await readText();
103
+ ```
104
+
105
+ ### Scroll - `scrollToTop` `scrollToElement` `lockScroll` `unlockScroll`
106
+
107
+ ```typescript
108
+ import { scrollToTop, scrollToElement, lockScroll, unlockScroll } from '@i17hush/h5-utils';
109
+
110
+ scrollToTop(); // 平滑滚到顶部
111
+ scrollToTop(false); // 立即滚到顶部
112
+ scrollToElement(el, { offset: -50 }); // 滚动到元素位置,偏移 -50px
113
+ lockScroll(); // 锁定页面滚动
114
+ unlockScroll(); // 解锁页面滚动
115
+ ```
116
+
117
+ ### Format - `formatDate` `formatNumber` `formatPhone` `formatMoney` `throttle` `debounce`
118
+
119
+ ```typescript
120
+ import { formatDate, formatNumber, formatPhone, formatMoney, throttle, debounce } from '@i17hush/h5-utils';
121
+
122
+ formatDate(Date.now(), 'YYYY-MM-DD HH:mm:ss'); // '2026-04-06 14:30:00'
123
+ formatNumber(1234567.89, { precision: 2 }); // '1,234,567.89'
124
+ formatPhone('13812345678'); // '138 1234 5678'
125
+ formatMoney(9999); // '9,999.00'
126
+
127
+ const throttled = throttle(() => {}, 200);
128
+ const debounced = debounce(() => {}, 300);
129
+ ```
130
+
131
+ ### Validator - `isMobilePhone` `isEmail` `isIdCard` `isUrl` `isChinese`
132
+
133
+ ```typescript
134
+ import { isMobilePhone, isEmail, isIdCard, isUrl, isChinese } from '@i17hush/h5-utils';
135
+
136
+ isMobilePhone('13812345678'); // true
137
+ isEmail('a@b.com'); // true
138
+ isIdCard('110101199001011234'); // true(含校验位验证)
139
+ isUrl('https://example.com'); // true
140
+ isChinese('你好'); // true
141
+ ```
142
+
143
+ ## Taro 适配
144
+
145
+ 库采用适配器模式,涉及平台差异的操作(Storage、Clipboard、DOM、Event、Scroll、Device)通过 `PlatformAdapter` 抽象。默认使用浏览器适配器。
146
+
147
+ ### 在 Taro 项目中使用
148
+
149
+ 1. 在应用入口(如 `app.ts`)初始化适配器:
150
+
151
+ ```typescript
152
+ import Taro from '@tarojs/taro';
153
+ import { setAdapter } from '@i17hush/h5-utils';
154
+ import { createTaroAdapter } from 'h5-utils/adapter/taro';
155
+
156
+ setAdapter(createTaroAdapter(Taro)); // 一行切换
157
+ ```
158
+
159
+ 2. 之后即可在任意页面中使用跨端方法:
160
+
161
+ ```typescript
162
+ import {
163
+ getStorage, setStorage,
164
+ copyText,
165
+ isIOS, isMobile, getOS,
166
+ scrollToTop,
167
+ formatDate, formatPhone,
168
+ isEmail, isMobilePhone,
169
+ } from '@i17hush/h5-utils';
170
+
171
+ // Storage - 自动使用 Taro.getStorageSync
172
+ setStorage('token', 'abc', { expires: 86400000 });
173
+ const token = getStorage<string>('token');
174
+
175
+ // 剪贴板 - 自动使用 Taro.setClipboardData
176
+ await copyText('Hello');
177
+
178
+ // 设备信息 - 自动使用 Taro.getSystemInfoSync
179
+ isIOS(); // boolean
180
+ isMobile(); // boolean
181
+ getOS(); // 'iOS' | 'Android' | ...
182
+
183
+ // 滚动 - 自动使用 Taro.pageScrollTo
184
+ scrollToTop();
185
+ ```
186
+
187
+ ### 跨端可用模块
188
+
189
+ | 模块 | H5 | Taro | 说明 |
190
+ |------|:---:|:----:|------|
191
+ | **Storage** | ✅ | ✅ | 过期时间、JSON 自动序列化 |
192
+ | **Clipboard** | ✅ | ✅ | 复制/读取文本 |
193
+ | **Scroll** | ✅ | ✅ | 滚动到顶部/位置 |
194
+ | **Device** | ✅ | ✅ | 设备检测、系统信息 |
195
+ | **Event** | ✅ | ✅ | 自定义事件(Taro 使用 eventCenter) |
196
+ | **Format** | ✅ | ✅ | 纯函数,无平台依赖 |
197
+ | **Validator** | ✅ | ✅ | 纯函数,无平台依赖 |
198
+ | **URL** | ✅ | ⚠️ | `getQueryParam`/`getAllQueryParams` 在小程序中不可用 |
199
+ | **Cookie** | ✅ | ❌ | 小程序无 Cookie,仅 H5 可用 |
200
+ | **DOM** | ✅ | ❌ | 小程序无 DOM,仅 H5 可用 |
201
+
202
+ ## 构建
203
+
204
+ ```bash
205
+ npm run build # 生成 ESM + CJS + 类型声明
206
+ npm run typecheck # TypeScript 类型检查
207
+ ```
208
+
209
+ 产物:
210
+
211
+ - `dist/index.esm.js` - ES Module
212
+ - `dist/index.cjs.js` - CommonJS
213
+ - `dist/index.d.ts` - 类型声明
214
+
215
+ ## License
216
+
217
+ MIT
@@ -0,0 +1,104 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * 创建 Taro 适配器
5
+ * @param taro Taro 实例,由用户传入以避免硬依赖
6
+ */
7
+ function createTaroAdapter(taro) {
8
+ return {
9
+ storage: {
10
+ get(key) {
11
+ const value = taro.getStorageSync(key);
12
+ return value !== '' && value !== undefined && value !== null ? String(value) : null;
13
+ },
14
+ set(key, value) {
15
+ taro.setStorageSync(key, value);
16
+ },
17
+ remove(key) {
18
+ taro.removeStorageSync(key);
19
+ },
20
+ clear() {
21
+ taro.clearStorageSync();
22
+ },
23
+ },
24
+ clipboard: {
25
+ async write(text) {
26
+ await taro.setClipboardData({ data: text });
27
+ },
28
+ async read() {
29
+ const res = await taro.getClipboardData();
30
+ return res.data;
31
+ },
32
+ },
33
+ event: {
34
+ on(event, handler) {
35
+ taro.eventCenter.on(event, handler);
36
+ },
37
+ off(event, handler) {
38
+ taro.eventCenter.off(event, handler);
39
+ },
40
+ emit(event, ...args) {
41
+ taro.eventCenter.trigger(event, ...args);
42
+ },
43
+ },
44
+ dom: {
45
+ select(selector) {
46
+ const query = taro.createSelectorQuery();
47
+ const result = query.select(selector).node();
48
+ query.exec();
49
+ return result || null;
50
+ },
51
+ selectAll(selector) {
52
+ const query = taro.createSelectorQuery();
53
+ const result = query.selectAll(selector).nodes();
54
+ query.exec();
55
+ return Array.isArray(result) ? result : [];
56
+ },
57
+ },
58
+ scroll: {
59
+ scrollTo(options) {
60
+ var _a;
61
+ taro.pageScrollTo({
62
+ scrollTop: (_a = options.top) !== null && _a !== void 0 ? _a : 0,
63
+ duration: options.animated !== false ? 300 : 0,
64
+ });
65
+ },
66
+ getScrollPosition() {
67
+ // Taro 需要通过 onPageScroll 事件获取,此处返回默认值
68
+ // 实际项目中建议通过 Taro.usePageScroll hook 获取
69
+ return { scrollTop: 0, scrollLeft: 0 };
70
+ },
71
+ lockScroll() {
72
+ },
73
+ unlockScroll() {
74
+ },
75
+ },
76
+ device: {
77
+ getInfo() {
78
+ const info = taro.getSystemInfoSync();
79
+ const system = info.system || '';
80
+ const isIOS = /ios/i.test(system) || /iPhone|iPad|iPod/i.test(info.model || '');
81
+ const isAndroid = /android/i.test(system);
82
+ return {
83
+ ios: isIOS,
84
+ android: isAndroid,
85
+ mobile: isIOS || isAndroid,
86
+ weChat: true, // 在 Taro 环境中,通常是小程序
87
+ os: system.split(' ')[0] || info.platform || 'Unknown',
88
+ brand: info.brand || '',
89
+ model: info.model || '',
90
+ screenWidth: info.screenWidth,
91
+ screenHeight: info.screenHeight,
92
+ pixelRatio: info.pixelRatio,
93
+ };
94
+ },
95
+ async getNetworkType() {
96
+ const res = await taro.getNetworkType();
97
+ return res.networkType;
98
+ },
99
+ },
100
+ };
101
+ }
102
+
103
+ exports.createTaroAdapter = createTaroAdapter;
104
+ //# sourceMappingURL=taro.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taro.cjs.js","sources":["../../src/adapter/taro.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,147 @@
1
+ /**
2
+ * 适配器接口定义
3
+ * 跨端差异化的操作通过适配器抽象,浏览器和 Taro 各自实现
4
+ */
5
+ interface StorageAdapter {
6
+ get(key: string): string | null;
7
+ set(key: string, value: string, options?: StorageSetOptions): void;
8
+ remove(key: string): void;
9
+ clear(): void;
10
+ }
11
+ interface StorageSetOptions {
12
+ /** 过期时间(毫秒) */
13
+ expires?: number;
14
+ }
15
+ interface ClipboardAdapter {
16
+ write(text: string): Promise<void>;
17
+ read(): Promise<string>;
18
+ }
19
+ interface EventEmitterAdapter {
20
+ on(event: string, handler: (...args: any[]) => void): void;
21
+ off(event: string, handler: (...args: any[]) => void): void;
22
+ emit(event: string, ...args: any[]): void;
23
+ }
24
+ interface DomAdapter {
25
+ select(selector: string): Element | null;
26
+ selectAll(selector: string): Element[];
27
+ }
28
+ interface ScrollAdapter {
29
+ /** 滚动到指定位置 */
30
+ scrollTo(options: {
31
+ top?: number;
32
+ left?: number;
33
+ animated?: boolean;
34
+ }): void;
35
+ /** 获取当前滚动位置 */
36
+ getScrollPosition(): {
37
+ scrollTop: number;
38
+ scrollLeft: number;
39
+ };
40
+ /** 锁定滚动 */
41
+ lockScroll(): void;
42
+ /** 解锁滚动 */
43
+ unlockScroll(): void;
44
+ }
45
+ interface DeviceInfo {
46
+ /** 是否 iOS */
47
+ ios: boolean;
48
+ /** 是否 Android */
49
+ android: boolean;
50
+ /** 是否移动端 */
51
+ mobile: boolean;
52
+ /** 是否微信 */
53
+ weChat: boolean;
54
+ /** 系统信息 */
55
+ os: string;
56
+ /** 品牌 */
57
+ brand: string;
58
+ /** 型号 */
59
+ model: string;
60
+ /** 屏幕宽度 */
61
+ screenWidth: number;
62
+ /** 屏幕高度 */
63
+ screenHeight: number;
64
+ /** 像素比 */
65
+ pixelRatio: number;
66
+ }
67
+ interface DeviceAdapter {
68
+ /** 获取设备信息 */
69
+ getInfo(): DeviceInfo;
70
+ /** 获取网络类型 */
71
+ getNetworkType(): Promise<string>;
72
+ }
73
+ interface PlatformAdapter {
74
+ storage: StorageAdapter;
75
+ clipboard: ClipboardAdapter;
76
+ event: EventEmitterAdapter;
77
+ dom: DomAdapter;
78
+ scroll: ScrollAdapter;
79
+ device: DeviceAdapter;
80
+ }
81
+
82
+ /**
83
+ * Taro 适配器
84
+ *
85
+ * 使用方式:
86
+ * ```ts
87
+ * import Taro from '@tarojs/taro';
88
+ * import { setAdapter } from 'h5-utils';
89
+ * import { createTaroAdapter } from 'h5-utils/adapter/taro';
90
+ *
91
+ * setAdapter(createTaroAdapter(Taro));
92
+ * ```
93
+ */
94
+ interface TaroInstance {
95
+ getStorageSync(key: string): any;
96
+ setStorageSync(key: string, value: any): void;
97
+ removeStorageSync(key: string): void;
98
+ clearStorageSync(): void;
99
+ setClipboardData(options: {
100
+ data: string;
101
+ }): Promise<{
102
+ data: string;
103
+ }>;
104
+ getClipboardData(): Promise<{
105
+ data: string;
106
+ }>;
107
+ eventCenter: {
108
+ on(event: string, handler: (...args: any[]) => void): void;
109
+ off(event: string, handler: (...args: any[]) => void): void;
110
+ trigger(event: string, ...args: any[]): void;
111
+ };
112
+ createSelectorQuery(): {
113
+ select(selector: string): {
114
+ node: () => any;
115
+ };
116
+ selectAll(selector: string): {
117
+ nodes: () => any[];
118
+ };
119
+ exec(): any[];
120
+ };
121
+ pageScrollTo(options: {
122
+ scrollTop?: number;
123
+ duration?: number;
124
+ }): Promise<void>;
125
+ getSystemInfoSync(): {
126
+ platform: string;
127
+ system: string;
128
+ brand: string;
129
+ model: string;
130
+ screenWidth: number;
131
+ screenHeight: number;
132
+ pixelRatio: number;
133
+ fontSizeSetting: number;
134
+ };
135
+ getNetworkType(): Promise<{
136
+ networkType: string;
137
+ }>;
138
+ nextTick(callback: (...args: any[]) => any): void;
139
+ }
140
+ /**
141
+ * 创建 Taro 适配器
142
+ * @param taro Taro 实例,由用户传入以避免硬依赖
143
+ */
144
+ declare function createTaroAdapter(taro: TaroInstance): PlatformAdapter;
145
+
146
+ export { createTaroAdapter };
147
+ export type { TaroInstance };
@@ -0,0 +1,102 @@
1
+ /**
2
+ * 创建 Taro 适配器
3
+ * @param taro Taro 实例,由用户传入以避免硬依赖
4
+ */
5
+ function createTaroAdapter(taro) {
6
+ return {
7
+ storage: {
8
+ get(key) {
9
+ const value = taro.getStorageSync(key);
10
+ return value !== '' && value !== undefined && value !== null ? String(value) : null;
11
+ },
12
+ set(key, value) {
13
+ taro.setStorageSync(key, value);
14
+ },
15
+ remove(key) {
16
+ taro.removeStorageSync(key);
17
+ },
18
+ clear() {
19
+ taro.clearStorageSync();
20
+ },
21
+ },
22
+ clipboard: {
23
+ async write(text) {
24
+ await taro.setClipboardData({ data: text });
25
+ },
26
+ async read() {
27
+ const res = await taro.getClipboardData();
28
+ return res.data;
29
+ },
30
+ },
31
+ event: {
32
+ on(event, handler) {
33
+ taro.eventCenter.on(event, handler);
34
+ },
35
+ off(event, handler) {
36
+ taro.eventCenter.off(event, handler);
37
+ },
38
+ emit(event, ...args) {
39
+ taro.eventCenter.trigger(event, ...args);
40
+ },
41
+ },
42
+ dom: {
43
+ select(selector) {
44
+ const query = taro.createSelectorQuery();
45
+ const result = query.select(selector).node();
46
+ query.exec();
47
+ return result || null;
48
+ },
49
+ selectAll(selector) {
50
+ const query = taro.createSelectorQuery();
51
+ const result = query.selectAll(selector).nodes();
52
+ query.exec();
53
+ return Array.isArray(result) ? result : [];
54
+ },
55
+ },
56
+ scroll: {
57
+ scrollTo(options) {
58
+ var _a;
59
+ taro.pageScrollTo({
60
+ scrollTop: (_a = options.top) !== null && _a !== void 0 ? _a : 0,
61
+ duration: options.animated !== false ? 300 : 0,
62
+ });
63
+ },
64
+ getScrollPosition() {
65
+ // Taro 需要通过 onPageScroll 事件获取,此处返回默认值
66
+ // 实际项目中建议通过 Taro.usePageScroll hook 获取
67
+ return { scrollTop: 0, scrollLeft: 0 };
68
+ },
69
+ lockScroll() {
70
+ },
71
+ unlockScroll() {
72
+ },
73
+ },
74
+ device: {
75
+ getInfo() {
76
+ const info = taro.getSystemInfoSync();
77
+ const system = info.system || '';
78
+ const isIOS = /ios/i.test(system) || /iPhone|iPad|iPod/i.test(info.model || '');
79
+ const isAndroid = /android/i.test(system);
80
+ return {
81
+ ios: isIOS,
82
+ android: isAndroid,
83
+ mobile: isIOS || isAndroid,
84
+ weChat: true, // 在 Taro 环境中,通常是小程序
85
+ os: system.split(' ')[0] || info.platform || 'Unknown',
86
+ brand: info.brand || '',
87
+ model: info.model || '',
88
+ screenWidth: info.screenWidth,
89
+ screenHeight: info.screenHeight,
90
+ pixelRatio: info.pixelRatio,
91
+ };
92
+ },
93
+ async getNetworkType() {
94
+ const res = await taro.getNetworkType();
95
+ return res.networkType;
96
+ },
97
+ },
98
+ };
99
+ }
100
+
101
+ export { createTaroAdapter };
102
+ //# sourceMappingURL=taro.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taro.esm.js","sources":["../../src/adapter/taro.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}