Javascript 为什么';t下列'exports={z:function(){};`工作

Javascript 为什么';t下列'exports={z:function(){};`工作,javascript,node.js,commonjs,Javascript,Node.js,Commonjs,a.js exports = { z: function() { console.log('aZ'); } }; require('./a').z(); // error main.js exports = { z: function() { console.log('aZ'); } }; require('./a').z(); // error 为什么要求('./a')返回空对象?因为在您的示例中,您覆盖了导出全局,而不是

a.js

exports = {
    z: function() {
        console.log('aZ');
    }
};
require('./a').z(); // error
main.js

exports = {
    z: function() {
        console.log('aZ');
    }
};
require('./a').z(); // error

为什么
要求('./a')
返回空对象?

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

exports.z = function() {
    console.log('aZ');
};
它将起作用,因为您正在向实际导出对象添加
z


如果您查看,您将看到:

对module.exports的引用,该引用比类型短


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

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(){}};

is
module.exports={}
可用于模拟
es6
的默认(未命名)导出?