一个好的模块需要解决实际问题,但是能解决实际问题的模块不一定都能算得上优质的。模块也是一堆JavaScript
代码,所以首先必须要符合JavaScript
的代码规范,在这个前提下,才可以讨论其它原则。开发中我们会遇到各种需求,重复的多了,就会封装重复的逻辑到一个个模块中去以便多次复用。但是每个人对模块代码需要做哪些事情的认知多少有些差异,以下是个人觉得比较好的模块设计原则:
模块功能尽量保持单一
例如有两个需求:写一个函数判断字符串是否是回文字符串,写一个函数判断数字是否是素数。两个需求要实现的功能都不复杂,写在一个模块内也没什么不可以。但是,一个是处理字符串,一个是处理数字,如果分别写在两个模块中,很容易以后扩展。npm
仓库中有很多这种单一的模块,例如is-object
、is-array
等等,因为功能单一又实用,被很多模块依赖,下载量反而比某些知名框架下载量都高。
模块提供的函数用法尽量和Node函数风格保持一致
不要随便命名一个函数,可以参考Node的库函数命名方式,这样使用者即使没时间看文档,也能凭经验猜出函数的用法。
确定模块的定位,不要轻易改动
如果模块只是要处理一个特定问题,例如将2018/09/18 11:13:31
格式的日期字符串转换为ISO字符串2018-09-18T03:13:31.000Z
。那么就不要再盲目增加诸如2018-09-18 11:13:31
、1537240411000
之类的格式处理,当使用者传递了不符合规则的参数时,直接报错是一种更好的方式。除非模块的定位本身就是处理一切日期字符串格式,比如Moment.js
,那就是另一回事。
API尽量向下兼容
在上一个版本中提供的API,尽量不要在下一个版本中被删除或重命名,应该给使用者留下一个过渡的时间,当使用者依然使用旧的函数时,打印警告信息告诫他不要那么做。具体做法可以参考Node的API变迁。
与标准库函数或知名框架中同名的函数,用法尽量保持相同
例如实现一个数组排序函数sort(array, fn)
,这里sort
参数中的fn
尽量保持和传递给Array.prototype.sort
的参数相同。