在node中,为什么我们使用module.exports或者exports来导出模块数据,是因为模块默认添加了如下代码,我们是看不到的。//默认情况下,模块对象被添加和声明,它是空的,并且具有exports属性varexports=module.exports//最后导出的是module.exportsreturnmodule.exports上面我们可以看到,即使什么都不写,也会默认导出module.exports,module.exports={},因此默认情况下会导出空对象。而module.exports和exports是等价的,所以我们也可以使用exports导出数据//test.js//使用module.exports导出数据module.exports.age=18//module.exports等于exportsconstbool=module.exports===exports//也可以使用exports导出数据exports.bool=bool//main.js//使用require导入导出数据constresult=require('./test.js')console.log(resulte)//运行得到结果{age:18,bool:true},bool为true,说明module.exports===exports但是如果使用exports直接赋值导出如下,你得到一个空对象//test.jsexports=123//main.jsconstresult=require('./test.js')console.log(resulte)//运行得到结果{}其实没有不管代码怎么改,默认返回的始终是module.exports,因为默认是varexports=module.exports,但是现在exports是直接赋值给123,改变了默认的指向,这样exports!==module.exports,所以exports不能导出数据。因此,默认的空对象最终被导出。接下来参数test//test.jsexports.name='lily'exports={}//exports赋值为空对象后,后续exports无效exports.age=18//exports的age失效无法导出module.exports.sex='male'//main.jsconstresult=require('./test.js')//运行得到结果{name:'lily',sex:'male'}console.log(resulte)最后,我们只需要记住,不管代码怎么改,最后导出的始终是module.exports,exports只是默认点。
