为什么以下 `exports = { z: function() {} };` 不起作用

Why doesn't the following `exports = { z: function() {} };` work

a.js

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

main.js

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

为什么 require('./a') return 是一个空对象?

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

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

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


如果您查看 docs,您会看到:

A reference to the module.exports that is shorter to type.


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

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

var exports = module.exports;

现在,如果您将导出替换为 exports = something,您实际上并没有更改 module.exports。

对于 commonjs,你应该使用 module.exports 来代替:

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

然后:

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

这让初学者感到困惑,但有几种导出格式的工作方式略有不同。

如果你想像你说的那样导出整个对象,你可以像这样替换整个导出:

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

您也可以直接将内容附加到导出对象

exports.z = function(){}

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

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