您的位置:首页 > Web前端 > JavaScript

commenjs 规范里exports 和 module.exports的关系和区别

2013-01-02 01:38 543 查看
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如图:



输出:



测结果可用 第2、4条解释。

补充:看了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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: