【问题标题】:best practice for module patterns in node.jsnode.js 中模块模式的最佳实践
【发布时间】:2014-12-09 09:55:16
【问题描述】:

我一直在转换一些旧的 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 更标准。不过不要引用我的话,我这么说只是因为我从未见过其他任何东西

标签: javascript node.js node-modules


【解决方案1】:

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

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

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

 module.exports = new Helper()

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-10
      • 2012-02-24
      • 2016-10-05
      • 1970-01-01
      • 1970-01-01
      • 2011-05-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多