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

相关文章
相关标签/搜索