为什么以下`exports = {z:function(){}};`work

时间:2016-11-23 13:05:46

标签: javascript node.js commonjs

a.js

exports = {
    z: function() {
        console.log('aZ');
    }
};

main.js

require('./a').z(); // error

为什么require('./a')会返回一个空对象?

3 个答案:

答案 0 :(得分:6)

因为在您的示例中,您将覆盖exports全局,而不是更新它。如果您用以下代码替换代码:

exports.z = function() {
    console.log('aZ');
};

它会起作用,因为您要将z添加到实际的导出对象中。

如果查看docs,您会看到:

  

对类型更短的module.exports的引用。

所以你可以想象这种情况:

var module = {
    exports: { /* some export stuff */ }
};

var exports = module.exports;

现在,如果您使用exports = something替换导出,则您实际上并未更改module.exports。

答案 1 :(得分:1)

使用commonjs,您应该使用module.exports代替:

module.exports = {
    z: function() {
        console.log('aZ');
    }
};

然后:

require('./a').z();

答案 2 :(得分:1)

这对于初学者来说很困惑,但有几种导出格式的工作方式略有不同。

如果你想按照你的意思导出整个对象,你可以像这样替换整个导出:

module.exports = { z: function(){}};

您也可以直接将东西附加到出口对象

exports.z = function(){}

最后,如果您使用的是ES6兼容版本,则可以

export default { z: function(){}};