原文:http://www.hacksparrow.com/node-js-exports-vs-module-exports.htmlhtml
你確定對Node.js
模塊中用來建立函數的exports
對象很熟悉(假設一個名爲rocker.js
的文件):node
exports.name = function() { console.log('My name is Lemmy Kilmister'); };
而後你在另外一個文件中調用:數組
var rocker = require('./rocker.js'); rocker.name(); // 'My name is Lemmy Kilmister'
可是module.exports
究竟是個什麼玩意兒? 它合法嗎?函數
使人吃驚的是-module.exports
是真實存在的東西。exports
只是module.exports
的輔助方法。你的模塊最終返回module.exports
給調用者,而不是exports
。exports
所作的事情是收集屬性,若是module.exports
當前沒有任何屬性的話,exports
會把這些屬性賦予module.exports
。若是module.exports
已經存在一些屬性的話,那麼exports
中所用的東西都會被忽略。ui
把下面的內容放到rocker.js
:this
module.exports = 'ROCK IT!'; exports.name = function() { console.log('My name is Lemmy Kilmister'); };
而後把下面的內容放到另外一個文件中,執行它:spa
var rocker = require('./rocker.js'); rocker.name(); // TypeError: Object ROCK IT! has no method 'name'
rocker模塊徹底忽略了exports.name
,而後返回了一個字符串'ROCK IT!'。經過上面的例子,你可能認識到你的模塊不必定非得是模塊實例(module instances)。你的模塊能夠是任何合法的JavaScript對象 - boolean,number,date,JSON, string,function,array和其餘。你的模塊能夠是任何你賦予module.exports
的值。若是你沒有明確的給module.exports
設置任何值,那麼exports
中的屬性會被賦給module.exports
中,而後並返回它。code
在下面的狀況下,你的模塊是一個類:htm
module.exports = function(name, age) { this.name = name; this.age = age; this.about = function() { console.log(this.name +' is '+ this.age +' years old'); }; };
而後你應該這樣使用它:對象
var Rocker = require('./rocker.js'); var r = new Rocker('Ozzy', 62); r.about(); // Ozzy is 62 years old
在下面的狀況下,你的模塊是一個數組:
module.exports = ['Lemmy Kilmister', 'Ozzy Osbourne', 'Ronnie James Dio', 'Steven Tyler', 'Mick Jagger'];
而後你應該這樣使用它:
var rocker = require('./rocker.js'); console.log('Rockin in heaven: ' + rocker[2]); //Rockin in heaven: Ronnie James Dio
如今你應該找到要點了 - 若是你想要你的模塊成爲一個特別的對象類型,那麼使用module.exports
;若是你但願你的模塊成爲一個傳統的模塊實例
(module instance),使用exports
。
把屬性賦予module.exports
的結果與把屬性賦予給exports
是同樣的。看下面這個例子:
module.exports.name = function() { console.log('My name is Lemmy Kilmister'); };
下面這個作的是同樣的事情:
exports.name = function() { console.log('My name is Lemmy Kilmister'); };
可是請注意,它們並非同樣的東西。就像我以前說的module.exports
是真實存在的東西,exports
只是它的輔助方法。話雖如此,exports
仍是推薦的對象,除非你想把你模塊 的對象類型從傳統的模塊實例
(module instance)修改成其餘的。
我但願這篇文章能幫助你理解exports
和module.exports
之間的不一樣,而且能進一步的理解模塊在Node.js
中是怎麼工做的。若是有任何問題,請在回覆裏邊留言。
(完)