为什么exports = module.exports = {}; ?为什么不只是module.exports?

时间:2014-10-25 07:50:50

标签: node.js express

我的module.exports = foo正在返回一个空白对象{}。谁能解释一下呢?

只有当我使用exports = module.exports = foo时,我的对象才不是空白。

2 个答案:

答案 0 :(得分:4)

module.exports是定义导出时重要的变量。它是从require('moduleName')语句返回的实际对象。

为方便起见,节点必须通过以下方式预定义exports作为别名:

var exports = module.exports;

然后,您可以分配到module.exports或仅分配到exports。因此,您可以执行其中任何一项操作,因为module.exports === exports

会创建相同的结果
module.exports.myFunc1 = function() {};
module.exports.myFunc2 = function() {};

或者这个:

exports.myFunc1 = function() {};
exports.myFunc2 = function() {};

但是,当您通过为其分配新对象来重新定义module.exports时,exports不再是module.exports的对象。

module.exports = {
    myFunc1: function() {},
    myFunc2: function() {}
};

现在,exports !== module.exports因为您为module.exports分配了一个新对象而exports仍指向原始module.exports

因此,为了保留原来的方式(如果模块中的任何其他代码引用exports,通常会确保exports再次与module.exports相同用这样的代码:

module.exports = exports = {
    myFunc1: function() {},
    myFunc2: function() {}
};

如果您模块中的代码从未引用exports本身,那么您不需要以任何方式使用它,因为只有module.exports对外部世界才有用。

答案 1 :(得分:-1)

有两种方法可以为您的模块填写导出内容。选择你喜欢的任何东西。

1)您可以使用向模块添加多个属性,如下所示:

exports.foo = function () {};
exports.bar = function () {};

2)例如,您可以定义单个对象,例如。

module.exports = Module;
function Module () {}

exports只是module.exports的别名。

如果要从模块返回对象,请使用它,并填充多个属性。

如果您只想从模块中返回单个值,请使用module.exports

如果您使用module.exports定义模块,export本身只是一个预定义的变量,而您不需要重写它。

您可以在docs中找到所有这些 http://nodejs.org/api/modules.html#modules_the_module_object