# cross-env-plugins
**Repository Path**: mzzhref/cross-env-plugins
## Basic Information
- **Project Name**: cross-env-plugins
- **Description**: web\nodejs 公用插件库
- **Primary Language**: JavaScript
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-07-17
- **Last Updated**: 2025-11-12
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# cross-env-plugins
一个跨环境的 TypeScript/JavaScript 工具库,提供常用的工具函数和验证函数,适用于 Web 和 Node.js 环境。
[](https://www.npmjs.com/package/cross-env-plugins)
[](https://github.com/mzzhref/cross-env-plugins/blob/main/LICENSE)
## 特性
- ✅ **TypeScript 项目** - 完整的类型定义和类型声明文件
- ✅ 支持 CommonJS、ES Module 和 UMD 三种格式
- ✅ 零依赖,轻量级
- ✅ 完整的 TypeScript 类型支持,提供 `.d.ts` 类型声明文件
- ✅ 适用于浏览器和 Node.js 环境
- ✅ **62 个实用函数** - 40 个工具函数 + 22 个验证函数
- ✅ 解决浮点数精度问题(精确的加减乘除运算)
## 安装
```bash
npm install cross-env-plugins
```
## 使用方式
### CommonJS
```javascript
const { utils, valids } = require('cross-env-plugins')
console.log(utils.formatTime())
console.log(utils.random(10, 20))
console.log(valids.isMobile('13800000000'))
```
### ES Module
```javascript
import { utils, valids } from 'cross-env-plugins'
console.log(utils.formatTime())
console.log(utils.random(10, 20))
console.log(valids.isMobile('13800000000'))
```
### TypeScript
```typescript
import { utils, valids } from 'cross-env-plugins'
// 完整的类型支持
const time: string = utils.formatTime()
const randomNum: number = utils.random(10, 20)
const isValid: boolean = valids.isMobile('13800000000')
```
### 浏览器 Script 标签
```html
```
## API 文档
### utils - 工具函数
#### `random(min, max)`
生成指定范围内的随机整数(包含边界值)
**参数:**
- `min` (number): 最小值(左闭区间)
- `max` (number): 最大值(右闭区间)
**返回:** `number` - min 到 max 之间的随机整数
**示例:**
```javascript
utils.random(10, 20) // 返回 10-20 之间的随机整数
```
#### `formatTime(date, format)`
格式化时间
**参数:**
- `date` (Date|string, 可选): 时间对象或字符串,默认为当前时间
- `format` (string, 可选): 格式化字符串,默认为 `'yyyy-MM-dd hh:mm:ss'`
**返回:** `string` - 格式化后的日期字符串
**支持的格式:**
- `yyyy` - 年份
- `MM` - 月份(01-12)
- `dd` - 日期(01-31)
- `hh` - 小时(00-23)
- `mm` - 分钟(00-59)
- `ss` - 秒(00-59)
- `S` - 毫秒
**示例:**
```javascript
utils.formatTime() // '2024-01-01 12:00:00'
utils.formatTime(new Date(), 'yyyy-MM-dd') // '2024-01-01'
utils.formatTime('2024-01-01', 'yyyy年MM月dd日') // '2024年01月01日'
```
#### `getDayOfWeek(date)`
获取日期对应的星期几
**参数:**
- `date` (string|Date): 日期字符串或对象
**返回:** `string` - 星期几(Sunday, Monday, Tuesday...)
**示例:**
```javascript
utils.getDayOfWeek('2023-08-09') // 'Wednesday'
```
#### `getTimeUntilEnd(endTime, startTime)`
计算当前时间距离结束时间的时间戳
**参数:**
- `endTime` (string|Date): 结束时间字符串或Date对象
- `startTime` (string|Date, 可选): 开始时间字符串或Date对象,默认为当前时间
**返回:** `number` - 距离结束时间的时间戳(毫秒),如果已过期则返回 0
**示例:**
```javascript
utils.getTimeUntilEnd('2024-9-30 18:00:00') // 返回距离结束时间的毫秒数
utils.getTimeUntilEnd('2024-9-30 18:00:00', '2024-9-1 00:00:00') // 从指定开始时间计算
```
#### `formatCurrency(amount, decimals)`
金额格式化
**参数:**
- `amount` (number|string): 金额
- `decimals` (number, 可选): 保留的小数位数,默认为 2
**返回:** `string` - 格式化后的金额字符串(带千分位分隔符)
**示例:**
```javascript
utils.formatCurrency(12345.678) // '12,345.68'
utils.formatCurrency(12345.678, 0) // '12,346'
```
#### `convertToChinese(num)`
金额转换为中文大写
**参数:**
- `num` (number): 要转换的金额
**返回:** `string` - 中文大写金额
**示例:**
```javascript
utils.convertToChinese(12345.67) // '壹万贰仟叁佰肆拾伍元陆角柒分'
```
#### `generateRandomCode(length)`
生成随机验证码
**参数:**
- `length` (number, 可选): 验证码长度,默认为 6
**返回:** `string` - 随机验证码(包含大小写字母和数字)
**示例:**
```javascript
utils.generateRandomCode(6) // 'aB1cD2'
utils.generateRandomCode(8) // 'Xy9Z2aBc'
```
#### `randomStr(length)`
生成随机字符串
**参数:**
- `length` (number, 可选): 字符串长度,默认为 16
**返回:** `string` - 随机字符串
**示例:**
```javascript
utils.randomStr() // 16位随机字符串
utils.randomStr(20) // 20位随机字符串
```
#### `debounce(fn, delay)`
防抖函数
**参数:**
- `fn` (Function): 要执行的函数
- `delay` (number): 等待时间(毫秒)
**返回:** `Function` - 返回防抖处理后的函数
**示例:**
```javascript
const handleClick = utils.debounce((e) => {
console.log('按钮点击')
}, 1000)
```
#### `throttle(fn, delay)`
节流函数
**参数:**
- `fn` (Function): 要执行的函数
- `delay` (number): 限制时间间隔(毫秒)
**返回:** `Function` - 返回节流处理后的函数
**示例:**
```javascript
const handleScroll = utils.throttle(() => {
console.log('Scroll Event')
}, 200)
```
#### `deepClone(obj)`
深拷贝对象
**参数:**
- `obj` (object): 要拷贝的对象
**返回:** `object` - 拷贝后的新对象
**示例:**
```javascript
const newObj = utils.deepClone(originalObj)
```
#### `mergeObjects(target, source, overwrite)`
对象合并
**参数:**
- `target` (object): 目标对象
- `source` (object): 源对象
- `overwrite` (boolean, 可选): 是否覆盖目标对象中已有的属性,默认为 true
**返回:** `object` - 合并后的对象
**示例:**
```javascript
const mergedObj = utils.mergeObjects(targetObj, sourceObj, false)
```
#### `uniqueArray(arr)`
数组去重
**参数:**
- `arr` (Array): 要去重的数组
**返回:** `Array` - 去重后的数组
**示例:**
```javascript
utils.uniqueArray([1, 2, 2, 3, 4, 4, 5]) // [1, 2, 3, 4, 5]
```
#### `checkPwd(str)`
检测密码强度等级
**参数:**
- `str` (string): 密码字符串
**返回:** `number` - 密码强度等级
- `1`: 密码弱
- `2`: 密码中等
- `3`: 密码强
- `4`: 密码很强
**示例:**
```javascript
utils.checkPwd('123456') // 1
utils.checkPwd('abc123') // 2
utils.checkPwd('Abc123') // 3
utils.checkPwd('Abc123!') // 4
```
#### `getUrlParam(name)`
解析 URL 获取指定参数值
**参数:**
- `name` (string, 可选): 参数名,如果不传则返回所有参数对象
**返回:** `string|object` - 参数值或所有参数对象
**注意:** 支持微信小程序环境
**示例:**
```javascript
// URL: https://example.com?id=123&name=test
utils.getUrlParam('id') // '123'
utils.getUrlParam() // { id: '123', name: 'test' }
```
#### `generateUUID()`
生成UUID
**返回:** `string` - UUID字符串
**示例:**
```javascript
utils.generateUUID() // '550e8400-e29b-41d4-a716-446655440000'
```
#### `capitalize(str)`
首字母大写
**参数:**
- `str` (string): 字符串
**返回:** `string` - 首字母大写的字符串
**示例:**
```javascript
utils.capitalize('hello') // 'Hello'
```
#### `camelCase(str)`
驼峰命名转换(下划线转驼峰)
**参数:**
- `str` (string): 下划线命名的字符串
**返回:** `string` - 驼峰命名的字符串
**示例:**
```javascript
utils.camelCase('user_name') // 'userName'
```
#### `snakeCase(str)`
下划线命名转换(驼峰转下划线)
**参数:**
- `str` (string): 驼峰命名的字符串
**返回:** `string` - 下划线命名的字符串
**示例:**
```javascript
utils.snakeCase('userName') // 'user_name'
```
#### `flattenArray(arr, depth)`
数组扁平化
**参数:**
- `arr` (Array): 要扁平化的数组
- `depth` (number, 可选): 扁平化深度,默认为 Infinity
**返回:** `Array` - 扁平化后的数组
**示例:**
```javascript
utils.flattenArray([1, [2, [3, 4]]]) // [1, 2, 3, 4]
```
#### `groupBy(arr, key)`
数组分组
**参数:**
- `arr` (Array): 要分组的数组
- `key` (Function|string): 分组键(函数或属性名)
**返回:** `Object` - 分组后的对象
**示例:**
```javascript
utils.groupBy([{type: 'a', value: 1}, {type: 'b', value: 2}], 'type')
// { a: [{type: 'a', value: 1}], b: [{type: 'b', value: 2}] }
```
#### `paginate(arr, page, pageSize)`
数组分页
**参数:**
- `arr` (Array): 要分页的数组
- `page` (number, 可选): 页码(从1开始),默认为 1
- `pageSize` (number, 可选): 每页数量,默认为 10
**返回:** `Array` - 分页后的数组
**示例:**
```javascript
utils.paginate([1, 2, 3, 4, 5], 1, 2) // [1, 2]
```
#### `getRelativeTime(date)`
获取相对时间(如:3分钟前、2小时前)
**参数:**
- `date` (string|Date): 日期
**返回:** `string` - 相对时间字符串
**示例:**
```javascript
utils.getRelativeTime(new Date(Date.now() - 3600000)) // '1小时前'
```
#### `getDaysDiff(date1, date2)`
计算两个日期的差值(天数)
**参数:**
- `date1` (string|Date): 日期1
- `date2` (string|Date, 可选): 日期2,默认为当前时间
**返回:** `number` - 相差的天数
**示例:**
```javascript
utils.getDaysDiff('2024-01-01', '2024-01-10') // 9
```
#### `isSameDay(date1, date2)`
判断是否为同一天
**参数:**
- `date1` (string|Date): 日期1
- `date2` (string|Date, 可选): 日期2,默认为当前时间
**返回:** `boolean` - 是否为同一天
**示例:**
```javascript
utils.isSameDay('2024-01-01', '2024-01-01 12:00:00') // true
```
#### `formatFileSize(bytes, decimals)`
格式化文件大小
**参数:**
- `bytes` (number): 字节数
- `decimals` (number, 可选): 小数位数,默认为 2
**返回:** `string` - 格式化后的文件大小
**示例:**
```javascript
utils.formatFileSize(1024) // '1.00 KB'
```
#### `formatNumber(num)`
格式化数字(添加千分位)
**参数:**
- `num` (number|string): 数字
**返回:** `string` - 格式化后的数字字符串
**示例:**
```javascript
utils.formatNumber(1234567) // '1,234,567'
```
#### `toPercent(num, decimals)`
百分比转换
**参数:**
- `num` (number): 数字
- `decimals` (number, 可选): 小数位数,默认为 2
**返回:** `string` - 百分比字符串
**示例:**
```javascript
utils.toPercent(0.1234) // '12.34%'
```
#### `base64Encode(str)`
Base64编码
**参数:**
- `str` (string): 要编码的字符串
**返回:** `string` - Base64编码后的字符串
**示例:**
```javascript
utils.base64Encode('hello') // 'aGVsbG8='
```
#### `base64Decode(str)`
Base64解码
**参数:**
- `str` (string): Base64编码的字符串
**返回:** `string` - 解码后的字符串
**示例:**
```javascript
utils.base64Decode('aGVsbG8=') // 'hello'
```
#### `urlEncode(str)`
URL编码
**参数:**
- `str` (string): 要编码的字符串
**返回:** `string` - URL编码后的字符串
**示例:**
```javascript
utils.urlEncode('hello world') // 'hello%20world'
```
#### `urlDecode(str)`
URL解码
**参数:**
- `str` (string): URL编码的字符串
**返回:** `string` - 解码后的字符串
**示例:**
```javascript
utils.urlDecode('hello%20world') // 'hello world'
```
#### `truncate(str, length, suffix)`
字符串截取(支持中文)
**参数:**
- `str` (string): 字符串
- `length` (number): 截取长度
- `suffix` (string, 可选): 后缀,默认为 '...'
**返回:** `string` - 截取后的字符串
**示例:**
```javascript
utils.truncate('这是一段很长的文字', 5) // '这是一段很...'
```
#### `deepEqual(obj1, obj2)`
对象深度比较
**参数:**
- `obj1` (*): 对象1
- `obj2` (*): 对象2
**返回:** `boolean` - 是否相等
**示例:**
```javascript
utils.deepEqual({a: 1, b: {c: 2}}, {a: 1, b: {c: 2}}) // true
```
#### `getType(value)`
获取值的精确类型(使用 Object.prototype.toString.call)
**参数:**
- `value` (*): 要检查的值
**返回:** `string` - 类型字符串(如:'Object', 'Array', 'String', 'Number', 'Boolean', 'Function', 'Date', 'RegExp', 'Null', 'Undefined' 等)
**示例:**
```javascript
utils.getType([]) // 'Array'
utils.getType({}) // 'Object'
utils.getType('hello') // 'String'
utils.getType(null) // 'Null'
```
#### `isType(value, type)`
验证值是否为指定类型(使用 Object.prototype.toString.call,统一类型验证函数)
**参数:**
- `value` (*): 要验证的值
- `type` (string): 类型名称(支持:'object', 'array', 'string', 'number', 'boolean', 'function', 'date', 'regexp', 'null', 'undefined', 'symbol', 'promise', 'error' 等,不区分大小写)
**返回:** `boolean` - 是否为指定类型
**示例:**
```javascript
utils.isType('a', 'string') // true
utils.isType([], 'array') // true
utils.isType({}, 'object') // true
utils.isType(123, 'number') // true
utils.isType(true, 'boolean') // true
utils.isType(null, 'null') // true
utils.isType(undefined, 'undefined') // true
utils.isType(new Date(), 'date') // true
utils.isType(/test/, 'regexp') // true
utils.isType(() => {}, 'function') // true
```
#### `add(a, b, ...args)`
精确加法(解决浮点数精度问题)
**参数:**
- `a` (number): 加数1
- `b` (number): 加数2
- `...args` (number[], 可选): 更多加数
**返回:** `number` - 精确的加法结果
**示例:**
```javascript
utils.add(0.1, 0.2) // 0.3 (而不是 0.30000000000000004)
utils.add(0.1, 0.2, 0.3) // 0.6
utils.add(1.5, 2.3) // 3.8
```
#### `subtract(a, b, ...args)`
精确减法(解决浮点数精度问题)
**参数:**
- `a` (number): 被减数
- `b` (number): 减数
- `...args` (number[], 可选): 更多减数
**返回:** `number` - 精确的减法结果
**示例:**
```javascript
utils.subtract(0.3, 0.1) // 0.2 (而不是 0.19999999999999998)
utils.subtract(1.0, 0.1, 0.2) // 0.7
utils.subtract(5.5, 2.3) // 3.2
```
#### `multiply(a, b, ...args)`
精确乘法(解决浮点数精度问题)
**参数:**
- `a` (number): 乘数1
- `b` (number): 乘数2
- `...args` (number[], 可选): 更多乘数
**返回:** `number` - 精确的乘法结果
**示例:**
```javascript
utils.multiply(0.1, 3) // 0.3
utils.multiply(0.1, 0.2, 0.3) // 0.006
utils.multiply(2.5, 4) // 10
```
#### `divide(a, b, ...args)`
精确除法(解决浮点数精度问题)
**参数:**
- `a` (number): 被除数
- `b` (number): 除数
- `...args` (number[], 可选): 更多除数
**返回:** `number` - 精确的除法结果
**注意:** 当除数为0时会抛出错误
**示例:**
```javascript
utils.divide(0.3, 0.1) // 3
utils.divide(0.6, 0.2, 0.3) // 10
utils.divide(10, 2.5) // 4
```
### valids - 验证函数
#### `isEmail(email)`
校验邮箱格式
**参数:**
- `email` (string): 要校验的邮箱
**返回:** `boolean` - 返回校验结果
**示例:**
```javascript
valids.isEmail('example@example.com') // true
valids.isEmail('invalid-email') // false
```
#### `isMobile(mobile)`
校验手机号格式(中国手机号)
**参数:**
- `mobile` (string): 要校验的手机号
**返回:** `boolean` - 返回校验结果
**示例:**
```javascript
valids.isMobile('13800138000') // true
valids.isMobile('12345678901') // false
```
#### `validateIDCard(idCard)`
身份证校验(支持15位和18位)
**参数:**
- `idCard` (string): 身份证号
**返回:** `boolean` - 返回校验结果
**示例:**
```javascript
valids.validateIDCard('110101199003075131') // true
valids.validateIDCard('123456789012345') // false
```
#### `checkCode(idCard)`
校验身份证最后一位校验码是否正确
**参数:**
- `idCard` (string): 18位身份证号
**返回:** `boolean` - 返回校验结果
**示例:**
```javascript
valids.checkCode('110101199003075131') // true
```
#### `isValidDate(date)`
验证日期格式是否正确
**参数:**
- `date` (string): 日期字符串(格式:YYYYMMDD)
**返回:** `boolean` - 返回校验结果
**示例:**
```javascript
valids.isValidDate('20240101') // true
valids.isValidDate('20240230') // false(2月没有30号)
```
#### `convertTo18Digits(idCard15)`
将15位身份证号转换为18位
**参数:**
- `idCard15` (string): 15位身份证号
**返回:** `string` - 18位身份证号
**示例:**
```javascript
valids.convertTo18Digits('123456789012345') // '123456199001234567'
```
#### `isURL(url)`
校验URL格式
**参数:**
- `url` (string): 要校验的URL
**返回:** `boolean` - 返回校验结果
**示例:**
```javascript
valids.isURL('https://www.example.com') // true
```
#### `isIP(ip)`
校验IP地址格式
**参数:**
- `ip` (string): 要校验的IP地址
**返回:** `boolean` - 返回校验结果
**示例:**
```javascript
valids.isIP('192.168.1.1') // true
```
#### `isBankCard(cardNo)`
校验银行卡号(Luhn算法)
**参数:**
- `cardNo` (string): 银行卡号
**返回:** `boolean` - 返回校验结果
**示例:**
```javascript
valids.isBankCard('6228480402637874213') // true
```
#### `isChineseName(name)`
校验中文姓名
**参数:**
- `name` (string): 姓名
**返回:** `boolean` - 返回校验结果
**示例:**
```javascript
valids.isChineseName('张三') // true
```
#### `isPostalCode(code)`
校验邮政编码(中国)
**参数:**
- `code` (string): 邮政编码
**返回:** `boolean` - 返回校验结果
**示例:**
```javascript
valids.isPostalCode('100000') // true
```
#### `isLicensePlate(plate)`
校验车牌号(中国)
**参数:**
- `plate` (string): 车牌号
**返回:** `boolean` - 返回校验结果
**示例:**
```javascript
valids.isLicensePlate('京A12345') // true
```
#### `isUnifiedSocialCreditCode(code)`
校验统一社会信用代码
**参数:**
- `code` (string): 统一社会信用代码
**返回:** `boolean` - 返回校验结果
**示例:**
```javascript
valids.isUnifiedSocialCreditCode('911100001000000000') // true
```
#### `isNumber(value)`
校验是否为数字
**参数:**
- `value` (string|number): 要校验的值
**返回:** `boolean` - 返回校验结果
**示例:**
```javascript
valids.isNumber('123') // true
valids.isNumber(123) // true
```
#### `isInteger(value)`
校验是否为整数
**参数:**
- `value` (string|number): 要校验的值
**返回:** `boolean` - 返回校验结果
**示例:**
```javascript
valids.isInteger('123') // true
valids.isInteger(123.5) // false
```
#### `isDecimal(value)`
校验是否为小数
**参数:**
- `value` (string|number): 要校验的值
**返回:** `boolean` - 返回校验结果
**示例:**
```javascript
valids.isDecimal('123.45') // true
valids.isDecimal(123) // false
```
#### `isEmpty(value)`
校验是否为空(null、undefined、空字符串、空数组、空对象)
**参数:**
- `value` (*): 要校验的值
**返回:** `boolean` - 返回校验结果
**示例:**
```javascript
valids.isEmpty('') // true
valids.isEmpty([]) // true
valids.isEmpty({}) // true
```
#### `isLength(str, min, max)`
校验字符串长度
**参数:**
- `str` (string): 字符串
- `min` (number): 最小长度
- `max` (number): 最大长度
**返回:** `boolean` - 返回校验结果
**示例:**
```javascript
valids.isLength('hello', 3, 10) // true
```
#### `isPositiveInteger(value)`
校验是否为正整数
**参数:**
- `value` (string|number): 要校验的值
**返回:** `boolean` - 返回校验结果
**示例:**
```javascript
valids.isPositiveInteger('123') // true
```
#### `isNonNegativeInteger(value)`
校验是否为非负整数(包括0)
**参数:**
- `value` (string|number): 要校验的值
**返回:** `boolean` - 返回校验结果
**示例:**
```javascript
valids.isNonNegativeInteger('0') // true
```
#### `isChinese(str)`
校验是否为中文
**参数:**
- `str` (string): 要校验的字符串
**返回:** `boolean` - 返回校验结果
**示例:**
```javascript
valids.isChinese('你好') // true
```
#### `isEnglish(str)`
校验是否为英文
**参数:**
- `str` (string): 要校验的字符串
**返回:** `boolean` - 返回校验结果
**示例:**
```javascript
valids.isEnglish('hello') // true
```
## 完整示例
```javascript
import { utils, valids } from 'cross-env-plugins'
// 时间相关
console.log(utils.formatTime()) // '2024-01-01 12:00:00'
console.log(utils.getDayOfWeek('2024-01-01')) // 'Monday'
console.log(utils.getTimeUntilEnd('2024-12-31 23:59:59')) // 倒计时毫秒数
// 随机数
console.log(utils.random(1, 100)) // 1-100 之间的随机数
console.log(utils.generateRandomCode(6)) // 6位随机验证码
console.log(utils.randomStr(20)) // 20位随机字符串
// 金额处理
console.log(utils.formatCurrency(12345.67)) // '12,345.67'
console.log(utils.convertToChinese(12345.67)) // '壹万贰仟叁佰肆拾伍元陆角柒分'
// 防抖和节流
const debouncedFn = utils.debounce(() => console.log('防抖'), 1000)
const throttledFn = utils.throttle(() => console.log('节流'), 1000)
// 对象和数组操作
const cloned = utils.deepClone({ a: 1, b: { c: 2 } })
const merged = utils.mergeObjects({ a: 1 }, { b: 2 })
const unique = utils.uniqueArray([1, 2, 2, 3, 3, 4]) // [1, 2, 3, 4]
const flattened = utils.flattenArray([1, [2, [3, 4]]]) // [1, 2, 3, 4]
const grouped = utils.groupBy([{type: 'a', value: 1}, {type: 'b', value: 2}], 'type')
const paginated = utils.paginate([1, 2, 3, 4, 5], 1, 2) // [1, 2]
// 字符串处理
console.log(utils.generateUUID()) // UUID字符串
console.log(utils.capitalize('hello')) // 'Hello'
console.log(utils.camelCase('user_name')) // 'userName'
console.log(utils.snakeCase('userName')) // 'user_name'
console.log(utils.truncate('这是一段很长的文字', 5)) // '这是一段很...'
// 日期处理
console.log(utils.getRelativeTime(new Date(Date.now() - 3600000))) // '1小时前'
console.log(utils.getDaysDiff('2024-01-01', '2024-01-10')) // 9
console.log(utils.isSameDay('2024-01-01', '2024-01-01 12:00:00')) // true
// 数字和文件处理
console.log(utils.formatNumber(1234567)) // '1,234,567'
console.log(utils.toPercent(0.1234)) // '12.34%'
console.log(utils.formatFileSize(1024)) // '1.00 KB'
// 编码解码
console.log(utils.base64Encode('hello')) // 'aGVsbG8='
console.log(utils.base64Decode('aGVsbG8=')) // 'hello'
console.log(utils.urlEncode('hello world')) // 'hello%20world'
console.log(utils.urlDecode('hello%20world')) // 'hello world'
// 类型验证
console.log(utils.getType([])) // 'Array'
console.log(utils.isType('a', 'string')) // true
console.log(utils.isType([], 'array')) // true
console.log(utils.isType({}, 'object')) // true
console.log(utils.deepEqual({a: 1, b: {c: 2}}, {a: 1, b: {c: 2}})) // true
// 精确数学运算(解决浮点数精度问题)
console.log(utils.add(0.1, 0.2)) // 0.3 (而不是 0.30000000000000004)
console.log(utils.subtract(0.3, 0.1)) // 0.2 (而不是 0.19999999999999998)
console.log(utils.multiply(0.1, 3)) // 0.3
console.log(utils.divide(0.3, 0.1)) // 3
// 验证
console.log(valids.isEmail('test@example.com')) // true
console.log(valids.isMobile('13800138000')) // true
console.log(valids.validateIDCard('110101199003075131')) // true
console.log(valids.isURL('https://www.example.com')) // true
console.log(valids.isIP('192.168.1.1')) // true
console.log(valids.isBankCard('6228480402637874213')) // true
console.log(valids.isChineseName('张三')) // true
console.log(valids.isLicensePlate('京A12345')) // true
console.log(valids.isNumber('123')) // true
console.log(valids.isInteger('123')) // true
console.log(valids.isEmpty('')) // true
console.log(valids.isLength('hello', 3, 10)) // true
console.log(valids.isChinese('你好')) // true
console.log(utils.checkPwd('Abc123!@#')) // 4(密码很强)
```
## 许可证
ISC
## 贡献者
- [soulshow](https://gitee.com/mzzhref) - mzzhref@163.com
## 仓库
- [Gitee](https://gitee.com/mzzhref/cross-env-plugins)