node.js - exports和module.exports的区别
迷茫
迷茫 2017-04-17 11:20:47
0
6
592

在node.js里经常看到两者混用,如果两者意义相同为什么看到有的项目里既有exports又有module.exports

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回覆(6)
Peter_Zhu

唉,不會google, 難成合格的程式設計師啊..... 拿你標題直接去搜, 前10結果的標題都匹配上了

挑3個給你

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

Node.js 系列之 —— module.exports 與 exports

NodeJS學習筆記-exports和module.exports的差別

伊谢尔伦

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

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

你肯定對Node.js模組中用來建立函數的exports物件很熟悉(假設一個名為rocker.js的檔案):

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中所使用的東西都會被忽略。

把下面的內容放到rocker.js:

module.exports = 'ROCK IT!';
exports.name = function() {
    console.log('My name is Lemmy Kilmister');
};

然後把下面的內容放到另一個文件中,執行它:

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中,然後並回傳它。

在下面的情況下,你的模組是一個類別:

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引用了modules.exports
所以
exports.fn = function(){}; 時,modules.exports.fn也指向了該匿名函數

另外,值得注意的
執行exports = null後,modules.exports仍然指向原始的值,而非等於null

阿神

有圖有真相,圖文揭秘exports和module.exports的用法:
http://qifuguang.me/2015/11/11/%E6%8F%AD%E7%A7%98Node-js %E4%B8%ADexports%E5%92%8Cmodule-exports/

小葫芦

可否簡單的理解為:
以下所說的模組的名稱,就是檔名,假如這個檔名是abc.js,這個模組叫abc模組。

exports是把某個方法導出到以檔名命名的模組物件中,也就是把某個方法導入到abc這個模組物件中
Module.exports導出的其實是整個模組物件

當exports導出的時候必須是exports.methodName = xxx();,外部呼叫時

var abc = require("abc.js");
abc.methodName();

Module.exports導出的時候,導出的是一個物件{methodName: xxx()},外部呼叫時

var abc = require("abc.js");
abc.methodName();

詳細的請看
http://sabrinaluo.com/tech/2015/12/16/difference-between-Module-exports-with-exports-in-NodeJS/

迷茫

... 手冊看看,試一試,什麼都明白了

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板