node.js 中的不同 module.exports 模式

Different module.exports pattern in node.js

假设我们正在使用 node.js 和 express(Note App)创建简单的应用程序。我们想组织我们的代码并将所有控制器放在单独的文件夹中。所以我们创建一个文件夹并在其中创建 index.js。然后我们将我们的控制器 js 文件添加到这个文件夹。然后在 index.js 的主入口点初始化所有控制器,然后在 server.js 中使用 require 来访问我们的控制器。(我不喜欢又大又笨又乱的 server.js 文件所有逻辑都坚持其中!)

所有这些示例代码都可以正常工作,但我无法理解这些代码块之间的区别。

1.

module.exports.init = function(app){
    console.log("notes controller init.");
};

2.

function init(app){
    console.log("notes controller init.");
};
module.exports.init = init;

3.

(function (notesController){
    notesController.init = function(app){
        console.log("notes controller init.");
    };
})(module.exports);

4.

module.exports = {
    init: function(app){
        console.log("notes controller init.");
        }
    }

这些函数的性能或加载是否有任何差异,或者 JavaScript 中有什么神秘的东西,或者只是编码风格的差异?

谢谢。

PS.

我是曾经讨厌JavaScript的后端c#开发者!但由于 Node.js,我正试图理解这种语言的本质。我 google 有很多关于模块和导出以及原型和......在 JavaScript 中但找不到答案。

选项 #1 声明了一个未命名的函数并将其直接分配给 module.exports.init.

选项 #2 创建一个本地命名的函数 init,然后将其分配给 module.exports.init。就 module.exports.init 而言,#1 和 #2 在功能上完全没有区别。 #2 创建了本地符号 init,可用于在本地执行相同的功能作为快捷方式。但是,执行 module.exports.init() 的结果与四个选项中的任何一个都完全相同。

选项 #3 创建一个本地 IIFE 函数作用域,它允许您拥有私有变量,您的 init 函数可以使用这些变量,这些变量将在方法的一次调用后继续存在到下一个,甚至在您的模块中是私有的(模块的其他部分甚至无法访问它们)。您不声明任何这些私有变量,但您可以。除此之外,module.exports.init 的执行将再次与前两个选项没有区别,因为在所有三个选项中将完全相同的函数引用分配给 module.exports.init

选项 #4 定义一个新的 export.modules 对象,然后在该对象中静态声明一个方法。这可能是一种有用且紧凑的方式来定义许多全部导出的方法(这是一种常见的设计模式),但我个人不会在仅声明单个导出方法时使用它,因为选项 #1 更简单。

它们之间的任何性能差异只会在初始化期间出现,并且可能非常小以至于难以测量或发现它们 material。


哪个选项最好完全是个人意见。我个人更喜欢遵循良好编码实践并完成工作的最简单的解决方案。对我来说,这将是选项 #1,因为似乎没有理由在本地定义 init(选项 #2),也没有理由为私有符号设置 IIFE(选项 #3)。

因此,我宁愿不创建一个未被使用或不需要的命名函数(选项 #2),我也宁愿不声明一个未被用于任何目的的 IIFE(选项 #3) ).

如果我要声明多个导出方法,我通常会自己使用选项 #4,因为它是最紧凑的语法。