节点.js中模块模式的最佳实践

best practice for module patterns in node.js

本文关键字:最佳 模式 js 模块 节点      更新时间:2023-09-26

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

我见过许多使用导出的结构。 模块导出甚至原型,这让我想知道哪种方法被认为是最佳实践,为什么?

这是我以两种方式编写的代码中的精简模块示例。

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

这是一个非常简单的示例,但我将对其进行扩展以在同一模块中提供多个可访问的功能,因此在我允许事情变得过于复杂之前。我想我会就哪种方法被认为是最佳实践寻求一些建议。

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

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

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

 module.exports = new Helper()

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

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

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