Node.js中exports和module.exports的區別

今天看了下node.js的require方法的源碼,終於搞清楚exports和module.exports的區別了。

咱們知道,node.js的模塊暴露有兩種方法。node

1. 方式一:用exports

//a.js

 exports.log =function (str) {
    console.log(str);
}
//b.js

 var s = require("./a");
 s.log("哈哈哈哈");

2. 方式二:用module.exports

//a.js
  module.exports = function (str) {
        console.log(str);
  }

//b.js
  var s = require("./a");
  s("嘻嘻嘻嘻");

若是將第一種方式的exports按照第二種方式寫成下面這樣就會出錯:

//a.js
 exports = function (str) {
    console.log(str);
}
//b.js

 var s = require("./a");
 s("哈哈哈哈");

exportsmodule.exports的初始值指向的是空對象,即{}。從源碼能夠看到,其實模塊的require方法實質上是調用了_load方法,而_load方法,最終返回的是module.exports

圖片描述

圖片描述


來分析一下出錯的緣由。

因爲最開始的時候,exportsmodule.exports都指向同一個對象。

第一種方式,是在給這個空對象{}添加屬性,又由於module.exports也是指向這個對象的,因此最終require方法返回的module.exports是指向了這個具備log方法的對象的,能夠引用到模塊。

第二種方式是讓module.exports指向一片新的內存空間,exports指向的仍然是{},可是因爲require方法返回的是module.exports,因此最終也能引入模塊。

可是最後那種寫法是讓exports指向一片新的內存空間,module.exports指向的仍然仍是{},那麼最終require方法是將module.exports返回,因此會致使報錯,說s不是一個function。

因此:

請牢記:require方法返回的是module.exportsui

相關文章
相關標籤/搜索