Javascript node.js中的不同module.exports模式
假设我们正在使用node.js和express(Note app)创建简单的应用程序。我们希望组织代码并将所有控制器放在单独的文件夹中。因此,我们创建一个文件夹并在其中创建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文件!) 所有这些示例代码都运行良好,但我无法理解这些代码块之间的区别 一, 二, 三, 四, 这
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.");
}
}