module.exports vs export in Node.js

2022-08-29 22:25:36

我在 Node.js 模块中发现了以下合约:

module.exports = exports = nano = function database_module(cfg) {...}

我想知道这里使用两者之间的区别是什么,以及为什么两者都使用。module.exportsexports


答案 1

尽管问题很久以前就已经得到回答和接受,但我只想分享我的2美分:

你可以想象,在文件的最开头有类似的东西(只是为了解释):

var module = new Module(...);
var exports = module.exports;

enter image description here

因此,无论您做什么,请记住,当您从其他地方需要该模块时,不会从您的模块返回。module.exportsexports

因此,当您执行以下操作时:

exports.a = function() {
    console.log("a");
}
exports.b = function() {
    console.log("b");
}

您正在向对象添加 2 个函数和哪些点,因此返回的结果将是:abmodule.exportstypeofobject{ a: [Function], b: [Function] }

当然,如果您在此示例中使用而不是 ,则将获得相同的结果。module.exportsexports

在这种情况下,您希望自己表现得像导出值的容器。然而,如果您只想导出构造函数,那么您应该了解一些关于使用或;(再次记住,当您需要某些东西时,将返回,而不是)。module.exportsmodule.exportsexportsmodule.exportsexport

module.exports = function Something() {
    console.log('bla bla');
}

现在返回结果是,你可以要求它并立即调用,如:
因为你覆盖返回的结果成为一个函数。typeof'function'var x = require('./file1.js')();

但是,使用不能使用如下内容:exports

exports = function Something() {
    console.log('bla bla');
}
var x = require('./file1.js')(); //Error: require is not a function

因为有了 ,引用不再指向指向指向的对象,所以 和 之间不再有关系。在这种情况下,仍指向将返回的空对象。exportsmodule.exportsexportsmodule.exportsmodule.exports{}

来自另一个主题的接受答案也应该有所帮助:JavaScript是否通过引用传递?


答案 2

设置允许在 时像调用函数一样调用函数。简单的设置将不允许导出函数,因为节点会导出对象引用。以下代码不允许用户调用该函数。module.exportsdatabase_modulerequiredexportsmodule.exports

模块.js

以下操作不起作用。

exports = nano = function database_module(cfg) {return;}

如果设置了 module.export,则以下操作将起作用。

module.exports = exports = nano = function database_module(cfg) {return;}

安慰

var func = require('./module.js');
// the following line will **work** with module.exports
func();

基本上,node.js不会导出当前引用的对象,而是导出最初引用的对象的属性。虽然Node.js确实导出了对象引用,允许您像调用函数一样调用它。exportsexportsmodule.exports


第二个最不重要的原因

它们同时设置和以确保不引用先前导出的对象。通过设置两者,您可以将其用作速记,并避免以后出现潜在的错误。module.exportsexportsexportsexports

使用而不是保存字符并避免混淆。exports.prop = truemodule.exports.prop = true