YUI模块开发原理详解


Posted in Javascript onNovember 18, 2013

随着互联网应用越来越重,js代码越来越庞大,如何有效的去组织自己的代码,变得非常重要。我们应该学会去控制自己的代码,而不是到最后一堆bug完全不知道从哪冒出来。前端的模块化开发可以帮助我们有效的去管理代码,特别是多人开发的时候,提高开发效率。

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所有的依赖关系

<scriptsrc="http://yui.yahooapis.com/3.13.0/build/yui/yui-min.js"></script>
<script>
YUI().use('module1', function (Y) { ... });
</script>

下面就分析下上面这行代码会发生什么事。
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 < len; 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实际的过程比上面要复杂的多。

Javascript 相关文章推荐
JavaScript的面向对象(二)
Nov 09 Javascript
js实现拉伸拖动iframe的具体代码
Aug 03 Javascript
js 获取、清空input type=&quot;file&quot;的值(示例代码)
Dec 24 Javascript
一个简单的实现下拉框多选的插件可移植性比较好
May 05 Javascript
javascript使用window.open提示“已经计划系统关机”的原因
Aug 15 Javascript
Javascript核心读书有感之词法结构
Feb 01 Javascript
分享15个大家都熟知的jquery小技巧
Dec 02 Javascript
javascript正则表达式总结
Feb 29 Javascript
JavaScript使用正则表达式获取全部分组内容的方法示例
Jan 17 Javascript
详解微信小程序实现跑马灯效果(附完整代码)
Apr 29 Javascript
layui实现多图片上传并限制上传的图片数量
Sep 26 Javascript
JS实现容器模块左右拖动效果
Jan 14 Javascript
深入领悟JavaScript中的面向对象
Nov 18 #Javascript
基于mouseout和mouseover等类似事件的冒泡问题解决方法
Nov 18 #Javascript
ExtJS自定义主题(theme)样式详解
Nov 18 #Javascript
设为首页和收藏的Javascript代码(亲测兼容IE,Firefox,chrome等浏览器)
Nov 18 #Javascript
jquery cookie的用法总结
Nov 18 #Javascript
JS JSON对象转为字符串的简单实现方法
Nov 18 #Javascript
javascript获取ckeditor编辑器的值(实现代码)
Nov 18 #Javascript
You might like
wordpress之wp-settings.php
2007/08/17 PHP
用PHP解决的一个栈的面试题
2014/07/02 PHP
PHP实现的多文件上传类及用法示例
2016/05/06 PHP
PHP静态延迟绑定和普通静态效率的对比
2017/10/20 PHP
给文字加上着重号的JS代码
2013/11/12 Javascript
JavaScript获取table中某一列的值的方法
2014/05/06 Javascript
jQuery实现form表单元素序列化为json对象的方法
2015/12/09 Javascript
Jquery操作cookie记住用户名
2016/03/29 Javascript
JS中正则表达式只有3种匹配模式(没有单行模式)详解
2016/07/28 Javascript
JS 实现Base64编码与解码实例详解
2016/11/07 Javascript
js实现打地鼠小游戏
2017/02/13 Javascript
使用AngularJS2中的指令实现按钮的切换效果
2017/03/27 Javascript
jQuery Datatable 多个查询条件自定义提交事件(推荐)
2017/08/24 jQuery
Angularjs 根据一个select的值去设置另一个select的值方法
2018/08/13 Javascript
js实现上下左右键盘控制div移动
2020/01/16 Javascript
echarts实现获取datazoom的起始值(包括x轴和y轴)
2020/07/20 Javascript
解决vue项目打包上服务器显示404错误,本地没出错的问题
2020/11/03 Javascript
[02:12]DOTA2英雄基础教程 变体精灵
2013/12/16 DOTA
python实现进程间通信简单实例
2014/07/23 Python
Python中的赋值、浅拷贝、深拷贝介绍
2015/03/09 Python
python 多线程实现检测服务器在线情况
2015/11/25 Python
python中的字典使用分享
2016/07/31 Python
Python基础教程之tcp socket编程详解及简单实例
2017/02/23 Python
Python中functools模块函数解析
2017/03/12 Python
Python 专题四 文件基础知识
2017/03/20 Python
Python使用迭代器捕获Generator返回值的方法
2017/04/05 Python
Python 实现两个服务器之间文件的上传方法
2019/02/13 Python
详解Python实现进度条的4种方式
2020/01/15 Python
Python 中如何写注释
2020/08/28 Python
Python利用matplotlib绘制折线图的新手教程
2020/11/05 Python
大学英语演讲稿范文
2014/04/24 职场文书
教师师德演讲稿
2014/05/06 职场文书
参观邀请函范文
2015/02/02 职场文书
初中班级口号霸气押韵
2015/12/24 职场文书
班级元旦晚会开幕词
2016/03/04 职场文书
MySQL空间数据存储及函数
2021/09/25 MySQL