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议,哪种方法被认为是最佳做法。

我已经看到了一些使用exportsmodule.exports甚至原型的结构,这让我想知道哪种方法被认为是最佳实践,为什么?

具有.prototype是构造函数,模块将它们导出为要实例化的

如果要导出带有静态属性(“名称空间”)的“单例”对象,可以使用导出普通对象(通常为文字),甚至可以扩展默认为空的exports对象。

  module.exports = new Helper() 

这几乎总是错误的 。 Helper是完全不必要的,通常甚至是令人反感的。

你应该使用你的选项2.如果你真的只导出一个单一的function,你可能会考虑module.exports = function urlise(orgString){…} ,但要导出模块上可访问的几个function,你的选项2正好是模式使用。

选项2更好。 您不需要构造函数和OO实例,除非您打算在创build多个实例的情况下进行真正的OO编程,并且每个实例都有与之相关的不同数据。 这个代码作为一个简单的函数效果更好。