yui生成模块的方式是:
yui.add('module1', function (y) { ... }, '1.0.0', requires: ['module2']);
yui 是全局变量,类似于jquery中的$。add方法中第一个参数是模块的名称module1,第二个参数是一个匿名函数,里面是模块内容,第三个参数是版本名,第四个requires表示的是模块的依赖关系,如上是module1 依赖于module2(即module2要先于module1 执行)。
通常每个模块存放在一个js文件中,文件以模块名来命名,即模块module1存放在module1.js 文件中,module2存放在mudule2.js 文件中。
加载模块module1:
// 加载yui seed 文件,包含了yui所有的依赖关系
复制代码 代码如下:
下面就分析下上面这行代码会发生什么事。
1)yui 首先会分析module1 模块存在的依赖关系,创建一个url: http://localhost:3000/yui/combo?mudule2.js&module1.js。注意module2.js 在modul1.js 前面。
2)创建动态script标签,向服务器端请求js文件
复制代码 代码如下:
var script = document.createelement('script');
script = 'http://localhost:3000/yui/combo?mudule2.js&module1.js';
if(script.readystate) {
//ie
script.onreadystatechange = function () {
if (script.readystate == loaded || script.readystate == complete){
script.onreadystatechange = null;
//预留
}
};
} else {
//非ie
script.onload = function () {
//预留
};
}
document.body.append(script);
3)服务器端检测客户端传来的到请求,解析url,然后开始寻找module2.js 和 module1.js 两个js文件,并将两个文件按顺序拼成一个文件,返回给客户端。最后传回的js文件内容如下:
复制代码 代码如下:
//module2.js 中的内容
yui.add('module2', function (y) { y.module2 = {}; y.module2.name = 'module2'; }, '1.0.0', requires: []);
//module1.js 中的内容
yui.add('module1', function (y) { y.module1 = {}; y.module1.name = 'module1'; }, '1.0.0', requires: ['module2']);
4)客户端接受到返回的js,开始解析,即执行里面的yui下的add方法,执行过程大致如下:
复制代码 代码如下:
yui.modules = {};
//module2
yui.modules.push(function (y) { y.module2 = {}; y.module2.name = 'module2'; });
//module1
yui.modules.push(function (y) { y.module1 = {}; y.module1.name = 'module1'; });
5)解析完成后,自动触发步骤2中onload方法(ie中为onreadystatechange方法),下面是步骤2中“预留”处的代码:
复制代码 代码如下:
for(var i = 0, len = yui.modules.length; i //将模块中需要export出的api注册在this下面;this是yui的一个实例, this = new yui();
yui.modules[i](this);
}
//callback 是yui().use 中的回掉函数
//此时模块解析完成,传入this参数,在callback 就可以任意调用module1 和 module2 中输出的api了
callback(this);
以上是借助yui对模块化开发做一个简单的介绍,yui实际的过程比上面要复杂的多。
