Nodejs中module.exports和exports區別

最近小組一個大神搭建了一套基於webpack + gulp的框架,表示不明覺厲,而後接到一個需求要在這個框架裏面作開發,因而邊模仿邊請教大神,也算是搞定了。可是做爲一個剛轉前端的小菜,雖然能夠完成功能,對於整個框架的原理仍是隻知其一;不知其二,不開心~ ~因此從基礎學起,開始學習Node.js咯。前端

Node.js中暴露引入接口使用exports/require,使用起來還挺方便,可是module.exports和exports好容易混淆,有時引入時還會莫名其妙地報錯,糾結了半天終於搞懂二者的區別了。java

Node.js在模塊編譯過程將模塊包裝成一個閉包,最終返回相似這樣的代碼:webpack

(function (exports, require, module, __filename, __dirname) {
    // module code...
});

其中,module是模塊自己,它跟exports的關係是:web

exports = module.exports = {};

能夠看出,exports和module.exports指向同一個對象,而require引用模塊後,返回給調用者的是module.exports,這就出現兩種狀況了:
一、暴露屬性/方法,使用exports是沒有問題的:gulp

exports.attr = "attr";
exports.fn = function(){};

緣由是exports和module.exports指向同一個對象,上面兩行代碼都是exports爲一塊兒指向的那個對象添加屬性,使用require後返回module.exports也會被更改。固然,直接使用module.exports暴露屬性/方法也是能夠的。閉包

二、暴露一個類,要使用module.exports:框架

var obj = function(){};
module.exports = obj;

若是使用exports = obj是沒法require到這個類的,緣由是這至關於讓exports去指向別的對象了,關module.exports啥事,module.exports仍是老老實實地指向原來那個對象,沒變,因此require後,返回的module.exports天然得不到obj。學習

哈哈,我記得java裏內存管理中棧和堆就是這麼解的,類比~ui

相關文章
相關標籤/搜索