node.js中模块模式的最佳实践

时间:2014-12-09 01:42:09

标签: javascript node.js node-modules

我一直在转换一些旧的javascript用于node.js模块,它让我想到了模块模式选项。

我见过很多使用导出的结构。 module.exports甚至原型,它让我想知道哪种方法被认为是最佳实践以及为什么?

这是我的代码以两种方式编写的减少模块示例。

选项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, '-')
   }
}

这是一个非常简单的例子,但我将扩展它以在同一模块中提供几个可访问的函数,所以在我允许事情变得太复杂之前。我想我会就哪种方法被认为是最佳实践寻求一些建议。

2 个答案:

答案 0 :(得分:3)

  

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

具有.prototype的东西是构造函数,并且模块将它们导出为以进行实例化。

当您要导出"单例"时,将使用导出普通对象(通常为文字)或甚至扩展默认为空的exports对象。具有静态属性的对象,"命名空间"所以说。

 module.exports = new Helper()

This is almost always wrongHelper完全没必要,通常甚至是令人反感的。

您应该使用您的选项2.如果您确实只导出了一个函数,您可能会考虑module.exports = function urlise(orgString){…},但要导出模块上可访问的几个函数,您的选项2就是要使用的模式。

答案 1 :(得分:2)

选项2更好。您不需要构造函数和OO实例,除非您计划在创建许多实例的情况下执行真正的OO编程,并且每个实例都有与之关联的不同数据。这段代码作为一个简单的函数更好。