在nodejs模塊中,若是但願向外暴露出模塊中的方法和變量,須要使用module.exports或者exports,可是他們的意義卻不一樣。javascript
module表示該模塊對象,在module對象中有個exports的屬性,默認值爲空對象{};exports是模塊往外暴露方法或者變量的接口,能夠暴露變量或者方法:java
javascriptvar a = 10; module.exports = a;
javascriptvar a = 10; var b = 'hello'; module.exports = {age:a,name:b};
javascriptvar a = { name : 'hello', age: 10 } module.exports = a;
javascriptfunction a(){ console.log('hello') } module.exports = a;
javascriptvar a = function (){ console.log('hello') } module.exports = a;
javascriptvar a = { name : 'hello', getName : function(){ console.log(this.name) } } module.exports = a;
exports是module.exports的一個引用,能夠爲exports添加屬性,但不能直接賦值,那樣就會失去對module.exports的引用,便不會暴露出所的值。node
javascriptexports.name = 'hello';
javascriptexports.getName = function(){ console.log(this.name) }
由於是module.exports的引用,因此每次爲exports賦值的時候,就是爲module.exports賦值。
若是直接爲exports賦值:this
javascriptexports = 'hello';
即改變了exports對module.exports的引用,因此所賦的值沒法經過module.exports暴露出去。code
能夠在不少項目中看到這句,當模塊要輸出一個非Object時(好比一個Function),可使用對象
javascriptmodule.exports = function () {}
此時 module.exports 被覆蓋了,而 exports 仍是原來的對像的引用,爲了不在後面的代碼中仍然使用 exports.xx = yy 而致使不能正確輸出,須要把 exports 變量也從新設置爲新的 module.exports 的引用,因此通常習慣寫成接口
javascriptexports = module.exports = xxx