在 CMD 规范中,一个模块就是一个文件
- define(fatctory)是一个全局函数
- define接受factory参数,factory可以是一个函数,也可以是一个对象或者字符串。
- factory为函数时,表示是模块的构造方法,执行该构造方法,可以得到模块向外提供的接口。factory方法在执行时,默认会传递三个参数:require、exports和module:如下
define(function(require,exports,module){
//模块代码
});
-
-
- require是factory的第一个参数
- require(id)是一个方法,接受模块标识作为唯一参数,用来获取其他模块提供的接口。
-
define(function(require,exports){
//获取模块接口
var a = require('./a');
//调用模块a的方法
a.dosometiong();
})
-
-
-
- require.async(id,callback)----方法用来在模块内部异步加载,并在加载完成后执行指定回调。callback参数可选。
-
-
define(function(require,exports,module){
//异步加载一个模块,在加载完成时,执行回调
require.async('./b',function(b){
b.doSomething();
})
//异步加载多个模块,在加载完成时,执行回调
require.async(['./c','./b'],function(c,b){
c.doSomething();
b.doSomething();
})
注意:
require
是同步往下执行,require.async
则是异步回调执行。require.async
一般用来加载可延迟异步加载的模块。
-
-
-
- require.resolve(id)略
- exports 是一个对象,用来向外提供模块接口。
- 除了给
exports
对象增加成员,还可以使用return
直接向外提供接口。(略) - modules是一个额对象,上面存储了与当前模块相关联的一些属性和方法。(略)
-
-
define(function(require,exports){
//对外提供foo属性
exports.foo = 'bar';
//对外提供doSomgthion方法
exports.doSomething = function(){};
})
-
-
- 除了给
exports
对象增加成员,还可以使用return
直接向外提供接口。
- 除了给
-
- define也可以接受两个以上参数。字符串id表示模块标识,数组deps是模块依赖。比如
define('hello',[jquery],funtion(require,exports,module){
//模块代码
});
注意:id
和 deps
参数可以省略。省略时,可以通过构建工具自动生成。
模块系统的启动
在 Sea.js 里,要启动模块系统:
<script src="path/to/sea.js"></script>
<script>
seajs.use('./main');
</script>
- seajs.use用来在页面中加载模块
- seajs.use(id.callback)--通过use方法,可以在页面中加载任意模块:
//加载模块main,并在记载完成时,执行指定回调
seajs.use('./main',function(main){
main.init();
});
- use方法还可以一次加载多个模块:
//并发记载模块a和模块b,并在都加载完成时,执行指定回调
seajs.use(['./a','./b'],function(a,b){
a.init();
b.init();
})
callback
参数可选,省略时,表示无需回调。
配置文件
- 配置可以直接写在 html 页面上,也可以独立出来成为一个文件。
// seajs 的简单配置 seajs.config({ base: "../sea-modules/", alias: { "jquery": "jquery/jquery/1.10.1/jquery.js" } })
// 加载入口模块 seajs.use("../static/hello/src/main")
独立成一个文件时,一般通过 script 标签在页面中同步引入。