node.js中模块模式的最佳实践
我一直在转换一些旧的JavaScript在node.js模块中使用,它让我思考模块模式选项。
我见过一些使用出口的结构。 module.exports,甚至原型,它让我想知道哪种方法被认为是最佳实践,为什么?
这里是我用两种方式编写的代码中的减less模块示例。
选项1:
var Helper = function() {}; Helper.latin_map = {"Á":"A","Ă":"A","Ắ":"A","Ặ":"A","Ằ":"A"}; Helper.prototype.urlise = function(orgString){ var lower = orgString.toLowerCase(); var latinised = lower.replace(/[^A-Za-z0-9\[\] ]/g, function(a) { return Helper.latin_map[a] || a; }); return latinised.replace(/\s+/g, '-') } module.exports = new Helper();
选项2:
var latin_map = {"Á":"A","Ă":"A","Ắ":"A","Ặ":"A","Ằ":"A"}; module.exports = { urlise : function(orgString){ var lower = orgString.toLowerCase(); var latinised = lower.replace(/[^A-Za-z0-9\[\] ]/g, function(a) { return latin_map[a] || a; }); return latinised.replace(/\s+/g, '-') } }
这是一个相当简单的例子,但是我将会扩展它以在同一个模块中提供几个可访问的函数,所以在我让事情变得太复杂之前。 我想我会寻求一些build议,哪种方法被认为是最佳做法。
我已经看到了一些使用
exports
,module.exports
甚至原型的结构,这让我想知道哪种方法被认为是最佳实践,为什么?
具有.prototype
是构造函数,模块将它们导出为要实例化的类 。
如果要导出带有静态属性(“名称空间”)的“单例”对象,可以使用导出普通对象(通常为文字),甚至可以扩展默认为空的exports
对象。
module.exports = new Helper()
这几乎总是错误的 。 Helper
是完全不必要的,通常甚至是令人反感的。
你应该使用你的选项2.如果你真的只导出一个单一的function,你可能会考虑module.exports = function urlise(orgString){…}
,但要导出模块上可访问的几个function,你的选项2正好是模式使用。
选项2更好。 您不需要构造函数和OO实例,除非您打算在创build多个实例的情况下进行真正的OO编程,并且每个实例都有与之相关的不同数据。 这个代码作为一个简单的函数效果更好。