在seajs中exports和module.exports使用方式
define(function(require, exports, module) {
exports.fn = function() {};
});
define(function(require, exports, module) {
module.exports = {
fn: function() {}
};
});
define(function(require, exports, module) {
module.exports.fn=function() {};
});
简单从这三种效果来看,基本没什么区别。
如果我们将module.exports置为空对象。module.exports={}
exports的值没变。
module.exports.fn 和exports .fn是没有区别的。
module.exports={}和module.exports.fn还是有区别的。
前者是重新指向一个空对象。后者是在原来的对象上增加一个方法fn.
看下如下几个代码结构。
define('wq.gwq.feedlist', function(require, exports, module){
"use strict";
var _feedHelper = require('wq.gwq.feedlistHelper');
var _feedEvent = require('wq.gwq.feedlistEvent');
}
define('wq.gwq.feedlistHelper', function(require, exports, module){
"use strict";
module.exports = {
fn:function(){}
}
}
define('wq.gwq.feedlistEvent', function(require, exports, module) {
"use strict";
var _feedHelper = require('wq.gwq.feedlistHelper');
$(body).on("click",function(){
_feedHelper.fn();
});
}
上述代码块运行的时候,报异常。在feedlistEvent 里面的_feedHelper无法找到fn。即没有fn方法。
解决方法:
1、feedlist中调换引用方法的顺序。即:
var _feedEvent = require('wq.gwq.feedlistEvent');
var _feedHelper = require('wq.gwq.feedlistHelper');
2、改变feedlistHelper的对外暴露方法的方式。即:
module.exports.fn = function(){};
或
exports.fn = function(){};
从上面两种解决方式可以看出:
require返回的是module.exports指向的对象。
在require该模块的时候,如果该模块还没有添加方法。那么后续可以使用exports.fn
或module.exports.fn
的方式给添加,因为这两种都是给module.exports指向的对象增加方法。
但是使用module.exprots = {},这种则是将指针重置。已经require之后的功能,则无法生效了。
如果在require之前设置,则require可以引用新的对象。