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

让我们假设我们正在用node.js创build简单的应用程序,并表示(Note App)。 我们要组织我们的代码,并把所有控制器放在单独的文件夹中。 所以我们创build一个文件夹并在其中创buildindex.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."); } } 

这些function在性能或加载方面有什么不同,或者JavaScript中有什么神秘的东西,或者只是编码风格的多样性?

谢谢。

PS。

我是后端的C#开发人员,曾经讨厌JavaScript! 但我试图了解这个语言的本质,因为Node.js。 我google了很多关于模块和出口和原型和…在JavaScript中,但无法find答案。

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

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

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

选项#4定义了一个新的export.modules对象,然后在该对象中静态声明一个方法。 这可以是一个有用的紧凑的方法来定义所有导出的方法(这是一个常见的devise模式),但我个人不会使用它只声明一个导出的方法,因为选项#1只是简单的。

它们之间的任何性能差异只会在初始化过程中出现,而且可能很小,难以衡量或者难以衡量。


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

所以,我宁愿不创build一个没有使用或不需要的命名函数(选项#2),我宁愿不声明不用于任何目的的IIFE(选项#3)。

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