最近小組一個大神搭建了一套基於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