Node.js 引入了模塊(Module)概念,一個模塊可以通過module.exports 或 exports 將函數、變數等導出,以使其它 JavaScript 腳本通過require() 函數引入並使用。 module.exports 初始值為一個空對象 {},所以 exports 初始值也是 ...
Node.js 引入了模塊(Module)概念,一個模塊可以通過
module.exports
或 exports
將函數、變數等導出,以使其它 JavaScript 腳本通過require()
函數引入並使用。
module.exports
初始值為一個空對象 {}
,所以 exports
初始值也是 {},
模塊內部大概是這樣:exports
是指向的 module.exports
的引用,在
exports = module.exports = {};
舉個慄子,在node.js中創建模塊非常簡單,一個文件就是一個模塊,所以我們創建一個name.js文件就創建了一個模塊name.js,使用exports和require對象對外提供介面和引用模塊。
name.js
var myName=function(){ var name='AmberYLopez'; console.log(name); }; exports.myName=myName;
這樣在使用的時候需要這樣
app.js
var name=require('./name');
如果我們創建的name.js文件是使用module.exports和require對象對外提供介面和引用模塊。
name.js
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?
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
指向的那塊記憶體並沒有做任何改變,仍然為一個空對象 {},所以會報錯。