一个好的模块需要解决实际问题,但是能解决实际问题的模块不一定都能算得上优质的。模块也是一堆JavaScript代码,所以首先必须要符合JavaScript的代码规范,在这个前提下,才可以讨论其它原则。开发中我们会遇到各种需求,重复的多了,就会封装重复的逻辑到一个个模块中去以便多次复用。但是每个人对模块代码需要做哪些事情的认知多少有些差异,以下是个人觉得比较好的模块设计原则:

模块功能尽量保持单一

例如有两个需求:写一个函数判断字符串是否是回文字符串,写一个函数判断数字是否是素数。两个需求要实现的功能都不复杂,写在一个模块内也没什么不可以。但是,一个是处理字符串,一个是处理数字,如果分别写在两个模块中,很容易以后扩展。npm仓库中有很多这种单一的模块,例如is-objectis-array等等,因为功能单一又实用,被很多模块依赖,下载量反而比某些知名框架下载量都高。

模块提供的函数用法尽量和Node函数风格保持一致

不要随便命名一个函数,可以参考Node的库函数命名方式,这样使用者即使没时间看文档,也能凭经验猜出函数的用法。

确定模块的定位,不要轻易改动

如果模块只是要处理一个特定问题,例如将2018/09/18 11:13:31格式的日期字符串转换为ISO字符串2018-09-18T03:13:31.000Z。那么就不要再盲目增加诸如2018-09-18 11:13:311537240411000之类的格式处理,当使用者传递了不符合规则的参数时,直接报错是一种更好的方式。除非模块的定位本身就是处理一切日期字符串格式,比如Moment.js,那就是另一回事。

API尽量向下兼容

在上一个版本中提供的API,尽量不要在下一个版本中被删除或重命名,应该给使用者留下一个过渡的时间,当使用者依然使用旧的函数时,打印警告信息告诫他不要那么做。具体做法可以参考Node的API变迁。

与标准库函数或知名框架中同名的函数,用法尽量保持相同

例如实现一个数组排序函数sort(array, fn),这里sort参数中的fn尽量保持和传递给Array.prototype.sort的参数相同。