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

Javascript node.js中的不同module.exports模式,javascript,node.js,express,module,Javascript,Node.js,Express,Module,假设我们正在使用node.js和express(Note app)创建简单的应用程序。我们希望组织代码并将所有控制器放在单独的文件夹中。因此,我们创建一个文件夹并在其中创建index.js。然后我们将控制器js文件添加到此文件夹。然后在index.js的主入口点初始化所有控制器,然后使用server.js中的require访问我们的控制器。(我不喜欢所有逻辑都粘在里面的大、大、乱的server.js文件!) 所有这些示例代码都运行良好,但我无法理解这些代码块之间的区别 一, 二, 三, 四, 这

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

所有这些示例代码都运行良好,但我无法理解这些代码块之间的区别

一,

二,

三,

四,

这些函数的性能或加载是否存在差异,JavaScript中是否存在神秘之处,或者编码风格是否存在差异

谢谢

附言

我是一名后端c#开发人员,过去讨厌JavaScript!但我正试图理解这种语言的本质,因为Node.js。我在谷歌上搜索了很多关于模块、导出、原型和。。。在JavaScript中,但找不到答案。

选项#1声明一个未命名的函数,并将其直接分配给
模块.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定义一个新的
导出.modules
对象,然后在该对象中静态声明一个方法。这是一种非常有用且紧凑的方法,可以定义许多都已导出的方法(这是一种常见的设计模式),但我个人不会在仅声明一个导出的方法时使用它,因为选项#1非常简单

它们之间的任何性能差异都只会在初始化期间出现,而且可能非常小,很难测量或找到它们


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

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


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

性能上确实存在差异,但您无法测量,因为它可以忽略不计。@zerkms哪个更好?您遗漏了
module.exports={init:function(app){console.log(“notes controller init.”;}}}
“更好“从什么角度来看?@zerkms程序员之间总是有一些契约或约定。类似于csharp或java代码文件中公共和私有方法的顺序。巫婆一号在社区中更受欢迎?我们能说巫婆一号因为某种原因不好吗?例子中不仅没有使用IEFE,但考虑到每个模块都有自己的模块作用域,这似乎特别多余。@Bergi-是的,IILife提供了来自您自己模块其他部分的隐私,因为通过模块的功能作用域已经有了来自外部世界的隐私。@Navid-对新添加的选项#4添加了评论。@jfriend00感谢提供详细信息而且答案信息丰富@Navid-您是否知道,在StackOverflow上,如果您的问题得到回答,您应该勾选最佳答案旁边的绿色复选标记?这会告诉社区您的问题已经得到了回答,并为您赢得一些声誉积分。
module.exports.init = function(app){
    console.log("notes controller init.");
};
function init(app){
    console.log("notes controller init.");
};
module.exports.init = init;
(function (notesController){
    notesController.init = function(app){
        console.log("notes controller init.");
    };
})(module.exports);
module.exports = {
    init: function(app){
        console.log("notes controller init.");
        }
    }