1、模块对外输出接口都是通过“module.exports”来实现输出的。即使是通过“exports”定义的接口,也是通过把接口添加到"module.exports"上对外输出的。
2、"exprots"输出的结构如key:value 散列值的字面量对象({ }),module.exprots可以输出任何合法的js数据类型(boolean, number, date, JSON, string, function, array, and so on)。
3、如果“exports”里和"module.exports"定义了相同的字段,那么有定义的会覆盖先定义的。
4、如果“module.exprots”直接被赋予任何合法的js数据类型。那么模块输出仅仅是直接被赋值的数据。(形如:module.exprots=“yyp”;或者module.exprots=funtion(){};)
接下来是见证以上四条依据的时刻:
测试1:
文件1如图:
文件2如图:
输出:
测结果可用 第1条解释。
测试二:
文件1如图:
文件2如图:
输出:
测结果可用 第3条解释。
测试三:
文件1如图:
文件2如图:
输出:
补充:看了express.js的源码后,发现用以上4条解释不了;源代码如下:
/**
* Expose `createApplication()`.
*/
exports = module.exports = createApplication;
/**
* Framework version.
*/
//exports.version = '3.0.0beta7';
/**
* Expose mime.
*/
exports.mime = send.mime;
/**
* Create an express application.
*
* @return {Function}
* @api public
*/
function createApplication() {
var app = connect();
utils.merge(app, proto);
app.request = { __proto__: req };
app.response = { __proto__: res };
app.init();
return app;
}
所以又测试了几个不同情况,由于情况多,就不上测试情形了,结合测试又总结了一条:
5:“ module.exports” 要是被赋值Object数据类型(被{ }包起来的数据格式)以外的数据类型之后 。 module.exports就直接返回的是被赋值的非Object数据,
而exports只要背赋值是Object数据类型(被{ }包起来的数据格式)或者函数(也就是可以增加属性的类型)还可以输出接口,如果赋值的数据类型是不能增加属性的,则输不出接口,exports能输出接口的前提是 module.exports的值是Object数据类型(被{ }包起来的数据格式)。
第5条是对第4条的一个补充吧,自己感觉理解的也不深,只是做个笔录,为以后加深理解做铺垫。
"在当前模块下,module对象引用当前模块,因此module.exports与exports指向同一对象的引用。在某些情况下,为了较快捷的取到导出对象,也可以直接覆盖exports对象为要导出的对象。" 摘自-http://blog.csdn.net/zzulp/article/details/8100927
参考
突袭HTML5之WebSocket入门5 - 包管理工具npm
http://www.hacksparrow.com/node-js-exports-vs-module-exports.html