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


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值