原帖
http://www.cnblogs.com/leoo2sk/archive/2011/06/27/write-javascript-with-seajs.html (张洋)
SeaJs下载
https://github.com/seajs/seajs/
https://github.com/seajs/seajs/tree/master/build
示例
假设开发一个Web应用TinyApp,在TinyApp中使用jQuery框架。
TinyApp的首页会用到module1.js,module1.js依赖module2.js和module3.js,同时module3.js依赖module4.js。
//index.html
<script src="./sea.js"></script>
<script>
seajs.use('./init', function(init) {
init.initPage();
});
</script>
//jquery.js
define(function(require, exports, module) = {
//原jquery.js代码...
module.exports = $.noConflict(true);
});
//init.js
define(function(require, exports, module) = {
var $ = require('jquery');
var m1 = require('module1');
exports.initPage = function() {
$('.content').html(m1.run());
}
});
//module1.js
define(function(require, exports, module) = {
var $ = require('jquery');
var m2 = require('module2');
var m3 = require('module3');
exports.run = function() {
return $.merge(['module1'], $.merge(m2.run(), m3.run()));
}
});
//其他module略...
模块定义函数define
//code of the module...
});
工厂函数factory解析
require——模块加载函数,用于记载依赖模块。
exports——接口点,将数据或方法定义在其上则将其暴露给外部调用。
module——是一个对象,存储模块的元数据。
module具体如下:
module.id——模块的ID。
module.dependencies——一个数组,存储了此模块依赖的所有模块的ID列表。
module.exports——与exports指向同一个对象。
三种编写模块的模式
1.基于exports的模式
var a = require('a'); //引入a模块
var b = require('b'); //引入b模块
var data1 = 1; //私有数据
var func1 = function() { //私有方法
return a.run(data1);
}
exports.data2 = 2; //公共数据
exports.func2 = function() { //公共方法
return 'hello';
}
});
2.直接返回一个对象表示模块
//...代码省略...
return {
data2: 2,
func2: function() {
return 'hello';
}
};
});
3.模块定义没有其它代码,只返回一个对象(对于定义纯JSON数据的模块非常合适)
data: 1,
func: function() {
return 'hello';
}
});
模块寻址
1.绝对地址
2.相对地址
例如在“http://example/js/b.js”中载入
则载入“http://example/js/c.js”
3.基址地址
seajs.config()中指定 base
4.不会自动添加“.js”的情况
(1)载入css时
(2)含有“?”时
(3)路径以”#”结尾时
三个载入模块的API
seajs.use、require和require.async
1.seajs.use - 用于载入入口模块
seajs.use('./a');
//回调模式
seajs.use('./a', function(a) {
a.run();
});
//多模块模式
seajs.use(['./a', './b'], function(a, b) {
a.run();
b.run();
});
给sea.js的script标签加“data-main”属性省略seajs.use
2.require - 当一个模块中需要用到其它模块时一般用require加载
传给require的路径标识必须是字符串字面量,不能是表达式
3.require.async - js文件在用到时才下载,实现代码按需加载
//code of callback...
});
全局配置
base: 'path/to/jslib/',
alias: {
'app': 'path/to/app/'
},
charset: 'utf-8',
timeout: 20000,
debug: false
});
base表示基址寻址时的基址路径
alias可以对较长的常用路径设置缩写。
charset表示下载js时script标签的charset属性。
timeout表示下载文件的最大时长,以毫秒为单位。
debug表示是否工作在调试模式下。