Node.js中exports與module.exports的區別

原文:http://www.hacksparrow.com/node-js-exports-vs-module-exports.htmlhtml

Node.js中exports和module.exports有什麼不一樣?

你確定對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給調用者,而不是exportsexports所作的事情是收集屬性,若是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)修改成其餘的。

我但願這篇文章能幫助你理解exportsmodule.exports之間的不一樣,而且能進一步的理解模塊在Node.js中是怎麼工做的。若是有任何問題,請在回覆裏邊留言。

(完)

相關文章
相關標籤/搜索