我在Node.js模块中发现了以下契约:
module.exports=exports=nano=function database_module(cfg){…}
我想知道module.exports和exports之间有什么区别,为什么在这里使用这两种方法
尽管这个问题早就被回答和接受了,但我只想分享我的2美分:
您可以想象,在文件的最开始处有这样的内容(仅供解释):
var模块=新模块(…);
var exports=module.exports;
因此,无论您做什么,只要记住当您从其他地方需要模块时,module.exports和NOTexports将从您的模块返回
所以当你做一些类似的事情时:
导出.a=函数(){
console.log(“a”);
}
exports.b=函数(){
console.log(“b”);
}
您正在向模块所指向的对象添加两个函数a和b。导出点,因此返回结果的类型将是对象:{a:[函数],b:[函数]}
当然,如果在本例中使用module.exports,而不是exports,您将得到相同的结果
在这种情况下,您希望您的模块.exports的行为类似于导出值的容器。然而,如果您只想导出构造函数,那么您应该知道如何使用模块.exports或exports;(请再次记住,module.exports将在您需要时返回,而不是export)
module.exports=function Something(){
console.log('blabla');
}
现在,typeof返回的结果是'function',您可以要求它并立即调用,如:
var x=require('./file1.js')()因为您将返回的结果覆盖为函数
但是,使用导出不能使用以下内容:
exports=function Something(){
console.log('blabla');
}
var x=require('./file1.js')()//错误:require不是一个函数
因为使用exports,引用不再指向module.exports指向的对象,因此exports和module.exports之间不再存在关系。在本例中,module.exports仍然指向将返回的空对象{}
另一个主题的公认答案也应有助于:
JavaScript是否通过引用传递