jsUtils
版本变更记录
webpack-build(分支)
- 添加 webpack 进行发布,可被其他项目引入使用
$ webpack && npm publish
背景
在做表单的时候,会遇到很多的表单项的验证工作,几乎很多验证都是重复的,有一个比较好的lodash库来做了这些工作,但是里面有些方法和实际的业务工作有些不符。比如,lodash.isEmpty(2) // true
是会认为是空的。这显然与实际的业务是不符的。另外还有一些数字校验、文字校验等一些常用的校验方法,想结合lodash做一个自己的 jsUtils 库,里面封装一些业务上常用的校验方式,这样比较有利于业务的开发。
简介
在 lodash
基础上扩展的一些 jsUtils,lodash
自身原有的一些方法仍然能用。其中isEmpty
方法被重写了。 将重新封装的方法做成了一个名为jsutils-100
的 npm 包,已经发布到 npm 仓库中,大家可以像使用其他 npm 包一样方便的来使用新封装的这个 jsUtils 包。
同时也不必再去安装lodash
包。
同时该项目中添加了单元测试来保证每个方法的正确性,大家可以放心大胆的来使用。单元测试为代码质量进行保驾护航。
顺便简单说一下单元测试
单元测试是是开发者编写的一小段代码,用于检验被测代码的一个很小的、很明确的功能是否正确,通常而言,一个单元测试是用于判断某个特定条件(或者场景)下某个特定函数的行为。简单说下单元测试的好处:
- 单元测试不但会使你的工作完成得更轻松。而且会令你的设计会变得更好,甚至大大减少你花在调试上面的时间
- 提高代码质量
- 减少 bug,快速定位 bug
- 放心地修改、重构
单元测试提倡的是测试驱动开发-测试先行。
测试驱动开发的基本思想就是在开发功能代码之前,先编写测试代码,然后只编写使测试通过的功能代码,从而以测试来驱动整个开发过程的进行。这有助于编写简洁可用和高质量的代码,有很高的灵活性和健壮性,能快速响应变化,并加速开发过程。
测试驱动开发的基本过程如下:
① 快速新增一个测试
② 运行所有的测试(有时候只需要运行一个或一部分),发现新增的测试不能通过
③ 做一些小小的改动,尽快地让测试程序可运行,为此可以在程序中使用一些不合情理的方法
④ 运行所有的测试,并且全部通过
⑤ 重构代码,以消除重复设计,优化设计结构
简单来说,就是不可运行/可运行/重构——这正是测试驱动开发的口号。另外难点就是 mock,在较复杂功能的测试时,难点就是 mock 了。这时候写单元测试可能就会变成累赘,也真是因为这个原因,在之前的项目中也就没有很好地贯彻下来。不过在 纯逻辑功能函数中,使用单元测试会是非常棒的。建议在这种情况下,可以体验一下。
✨ 特性
- 开箱即用的高质量的组件。
lodash
自身原本方法都可使用。- 扩展
lodash
方法,增加更加适合业务的方法。 - 增加常用的表单校验方法。
- 支持扩展丰富。
📦 安装
npm install jsutils-100 --save
🔨 示例
import jsUtils from 'jsutils-100';jsUtils; // true
详细介绍
在jsutils-100
项目中,重写了isEmpty
方法,添加了一些常见的表单校验中会用到的方法,目前增加了以下方法:
isHundred
isDigit
isInteger
isEmptyOneOfTwo
isChinese
isEmail
isPhoneNumber
isIdNumber
isIp
isUserName
isPassword
同时也希望大家可以将这个项目补充起来,将自己在工作中常用到的校验方法添加到这个项目中来,共同来维护这个库,这样在不久的将来,我们再开发业务时,就不会为校验而担忧。
isEmpty
方法
1. 检查 value 是否为一个空对象,集合,映射或者 set。 判断的依据是除非是有枚举属性的对象,length 大于 0 的 arguments object, array, string 或类 jquery 选择器。 对象如果被认为为空,那么他们没有自己的可枚举属性的对象。
以上是 Lodash 官网介绍。基于这个介绍,我们 得知数字是会被认为是空的,也就是_.isEmpty(1);// => true
。这就有点不符合我们业务中经常遇到的,输入框输入内容,输入数字在主观上我们是认为有值的 ,不能被认为为空。
所以这也是我准备自己封装jsUtils
的初衷, 要做一套从业务角度出发的jsUtils
。
重写的isEmpty
方法弥补了Lodash
中将数字认为是空的情况。
像这样:
;
isHundred
方法
2. isHundred
方法是来验证value
值是否为 100 的倍数。
用法像这样:
;
isDigit
方法
3. isDigit
方法是用来验证 value 是否为支持小数点的数字。
用法像这样:
;;;;;...
isInteger
方法
4. isInteger
方法是用来验证 value 是否为不支持小数点的数字。
用法像这样:
;;;;...
isEmptyOneOfTwo
方法
5. isEmptyOneOfTwo
方法是用来验证 value1 和 value2 二者有一个不为空即可返回 true,其中当 value1 为数组时,必须数组中的每个值都不为空,value1 才不为空。
用法像这样:
;;;;...
isChinese
方法
6. isChinese
方法是用来验证如果输入内容,那么输入内容只能是汉字。
用法像这样:
;;;;;...
isEmail
方法
7. isEmail
方法是用来验证邮箱输入是否正确。
用法像这样:
;;;;...
isPhoneNumber
方法
8. isPhoneNumber
方法是用来验证是否为手机号码。
用法像这样:
;;;;...
isIdNumber
方法
9. isIdNumber
方法是用来校验有效身份证号码。其中包括 15 位和 18 位,要校验生日、出生地、校验位等。
用法像这样:
;;; // 校验位不对; // 校验位正确...
isIp
方法
10. isIp
方法是用来校验是否为正确的 IP 地址。
用法像这样:
;;;;...
isUserName
方法
11. isUserName
方法是用来校验输入为字母,数字,下划线,减号,点,输入长度为 4-16 位。
用法像这样:
;;;;...
isPassword
方法
12. isPassword
方法是用来校验密码强度。
用法像这样:
;;;...
⌨️ 本地开发
$ git clone https://github.com/springHyc/jsUtils.git$ cd jsUtils$ npm install$ yarn test || npm test
单元测试
yarn test
or npm test
构建
npm run build
发布
npm run build
npm publish
表单校验建议
- 字段前后端类型一致
有个实际遇到的例子:前后端的类型不一致。背景是:该字段是必填的。由于后端直接返回来的数据是数字0
,而前端重新填写的数据是字符串"0"
,而且这个字段前端的校验是:
{ return data == "" || data == null || data === "[]" ? true : false;}
这就导致,返回来的数据,在完全没有改动的情况下,进行保存,就会提示“该字段需要填写”,而当自己重新填写后,就能直接保存了。
特别需要注意的一点:
0==""
为 true,而0 === ""
为 false。这一点涉及到的是 JavaScript 基础中的强制类型转换(你不知道的 JavaScript 中卷 第一部分 第 4 章中的宽松相等和严格相等),很多时候,我们在开发的时候是没有注意到这一点的。
之前咱们有提到过一点,说开发中的小技巧,我个人觉得,咱们每个人在开发过程中都会遇到各种各样的小 bug,为什么说是小 bug 呢,是因为这样的 bug,我们不重视,但是却常常遇到,稍微一调试,我们就可以改正过来,like 上面的这个小 bug,但有时候,耗费我们很多时间的不仅仅是一些比较难解决的大 bug,这些不起眼的小 bug,也会耗费我们很多时间,所以个人建议,每个人遇到这种类似的小 bug 可以随手记录一下,目前市面上有很多很好用的软件可以用来随手做记录都不错的,like: 简书、有道云笔记、csdn 等等。
- 尽量做好防御性编程
2.1 null.xxxx 报错 源代码是这样写的:
buttons: text: "关闭" styleType: "ordinary" { type == 1 && documentinnerHTML = "修改公钥"; }
在正常情况下,是不会有任何问题,但是有时候会出现下图的情况:
这时候就需要我们做好防御性编程。可以简单的这样写:
if type == 1 && document documentinnerHTML = '修改按钮;}