Node.js 引入了模塊(Module)概念,一個模塊能夠經過
javascriptmodule.exports
或 exports
將函數、變量等導出,以使其它 JavaScript 腳本經過require()
函數引入並使用。
module.exports
初始值爲一個空對象 {}
,因此 exports
初始值也是 {},
模塊內部大概是這樣:javaexports
是指向的 module.exports
的引用,在
exports = module.exports = {};
舉個栗子,在node.js中建立模塊很是簡單,一個文件就是一個模塊,因此咱們建立一個name.js文件就建立了一個模塊name.js,使用exports和require對象對外提供接口和引用模塊。node
name.jsapp
var myName=function(){ var name='AmberYLopez'; console.log(name); }; exports.myName=myName;
這樣在使用的時候須要這樣函數
app.jsui
var name=require('./name');
若是咱們建立的name.js文件是使用module.exports和require對象對外提供接口和引用模塊。spa
name.js code
var myName=function(){ var name='AmberYLopez'; console.log(name); }; module.exports=myName;
app.js對象
var name=require('./name');
exports 賦值實際上是給 module.exports 這個空對象添加myName屬性而已,爲何exports要使用添加屬性的方式,而不用exports=myName?blog
exports是引用 module.exports的值。exports 被改變的時候,module.exports不會被改變,而模塊導出的時候,真正導出的執行是module.exports,而不是exports。
若是將name.js改成
var myName=function(){ var name='AmberYLopez'; console.log(name); }; exports=myName;
app.js
var name=require('./name'); console.log(name);
運行會報錯。由於,前面是經過給 exports 添加屬性,而如今對 exports
指向的內存作了修改,exports 和 module.exports 再也不指向同一塊內存,即 module.exports
指向的那塊內存並無作任何改變,仍然爲一個空對象 {},因此會報錯。