在node.js里经常看到两者混用,如果两者意义相同为什么看到有的项目里既有exports又有module.exports
exports
module.exports
业精于勤,荒于嬉;行成于思,毁于随。
唉,不會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'); };
下面這個做的是一樣的事情:
但是請注意,它們並不是一樣的東西。就像我之前說的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導出的其實是整個模組物件
Module.exports
當exports導出的時候必須是exports.methodName = xxx();,外部呼叫時
exports.methodName = xxx();
var abc = require("abc.js"); abc.methodName();
用Module.exports導出的時候,導出的是一個物件{methodName: xxx()},外部呼叫時
{methodName: xxx()}
詳細的請看http://sabrinaluo.com/tech/2015/12/16/difference-between-Module-exports-with-exports-in-NodeJS/
... 手冊看看,試一試,什麼都明白了
唉,不會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的檔案):
然後你在另一個檔案中呼叫:
但是module.exports到底是個什麼玩意兒? 它合法嗎?
令人吃驚的是-module.exports是真實存在的東西。 exports只是module.exports的輔助方法。你的模組最終會回到module.exports給呼叫者,而不是exports。 exports所做的事情是收集屬性,如果module.exports目前沒有任何屬性的話,exports會把這些屬性賦予module.exports。如果module.exports已經存在一些屬性的話,那麼exports中所使用的東西都會被忽略。
把下面的內容放到rocker.js:
然後把下面的內容放到另一個文件中,執行它:
rocker模組完全忽略了exports.name,然後回傳了一個字串'ROCK IT!'。透過上面的例子,你可能會認知到你的模組不一定非得是模組實例(module instances)。你的模組可以是任何合法的JavaScript物件 - boolean,number,date,JSON, string,function,array和其他。你的模組可以是任何你賦予module.exports的值。如果你沒有明確的給module.exports設定任何值,那麼exports中的屬性會被賦給module.exports中,然後並回傳它。
在下面的情況下,你的模組是一個類別:
然後你應該這樣使用它:
在下面的情況下,你的模組是一個陣列:
然後你應該這樣使用它:
現在你應該找到要點了 - 如果你想要你的模組成為一個特別的物件類型,那麼使用module.exports;如果你希望你的模組成為一個傳統的模組實例(module instance),使用exports。
把屬性賦予module.exports的結果與把屬性給exports是一樣的。看下面這個範例:
下面這個做的是一樣的事情:
但是請注意,它們並不是一樣的東西。就像我之前說的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();
,外部呼叫時用
Module.exports
導出的時候,導出的是一個物件{methodName: xxx()}
,外部呼叫時詳細的請看
http://sabrinaluo.com/tech/2015/12/16/difference-between-Module-exports-with-exports-in-NodeJS/
... 手冊看看,試一試,什麼都明白了