node中exports模塊對象相信大家一定不陌生;
如studentModule.js:
exports.student = function() { console.log("this is student module!"); }
在另一個模塊中這樣引用:
var student = require('./studentModule.js'); student.student(); // this is student module!
那么問題來了:module.exports是什么呢?
其實,Module.exports
才是真正的接口,exports只不過是它的一個輔助工具。 最終返回給調用的是Module.exports
而不是exports。
所有的exports收集到的屬性和方法,都賦值給了Module.exports
。當然,這有個前提,就是Module.exports
本身不具備任何屬性和方法
。如果,
Module.exports
已經具備一些屬性和方法,那么exports收集來的信息將被忽略。
我們修改一下studentModule.js
module.exports = "student module"; exports.student = function() { console.log("this is student module!"); }
我們在另一個js文件中引入這個模塊(這里引入的js文件屬於同級引入)
var student = require("../studentModule.js"); student.student(); // TypeError: Object student module! has no method 'student'
結果報錯了;這里的報錯信息指的是對象student module!沒有student這個方法。
student模塊忽略了exports收集的student方法,返回了一個字符串"student module"。由此可知,你的模塊並不一定非得返回“實例化對象”。你的模塊可以是任何合法的javascript對象--boolean, number, date, JSON, string, function, array等等。
你的模塊可以是任何你設置給它的東西。如果你沒有顯式的給Module.exports
設置任何屬性和方法,那么你的模塊就是exports設置給
Module.exports的
屬性。
下面舉個栗子,假設你是模塊是一個類 person.js:
module.exports = function(name, age) { this.name = name; this.age = age; this.about = function() { console.log("name: " + this.name +' age: '+ this.age ); }; };
在另一個模塊中這樣引入使用:
var Person = require('./person.js'); var person = new Persion("小明", 12); person.about(); //name: 小明 age: 12
如果你的模塊是一個數組arr.js:
module.exports = ["apple", "banana", "orange"];
在其他模塊中引入:
var arr = require("./arr.js"); for(var i = 0; i < arr.length; ;i++) { console.log(arr[i]); } //結果輸出:apple,banana,orange
如果你想你的模塊是個特定的類型就用 Module.exports如果你想你的模塊是實例化對象就用exports。
module.exports是真正的接口,exports只不過是它的輔助接口。推薦使用exports導出;除非你打算從原來的“實例化對象”改變成一個類型。
參考:http://www.cnblogs.com/pigtail/archive/2013/01/14/2859555.html
原文:http://www.hacksparrow.com/node-js-exports-vs-module-exports.html