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,因为它是最紧凑的语法。
假设我们正在使用 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,因为它是最紧凑的语法。