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 - 如何引入js代码
Mar 09 Javascript
JavaScript使用Math.Min返回两个数中较小数的方法
Apr 06 Javascript
JavaScript在Android的WebView中parseInt函数转换不正确问题解决方法
Apr 25 Javascript
使用AngularJS实现可伸缩的页面切换的方法
Jun 19 Javascript
Jquery常用的方法汇总
Sep 01 Javascript
实例讲解避免javascript冲突的方法
Jan 03 Javascript
全面解析JavaScript里的循环方法之forEach,for-in,for-of
Apr 20 Javascript
AngularJS基于ngInfiniteScroll实现下拉滚动加载的方法
Dec 14 Javascript
AngularJs实现聊天列表实时刷新功能
Jun 15 Javascript
JavaScript实现的鼠标跟随特效示例【2则实例】
Dec 22 Javascript
element-ui tooltip修改背景颜色和箭头颜色的实现
Dec 16 Javascript
JavaScript直接调用函数与call调用的区别实例分析
May 22 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
php empty函数判断mysql表单是否为空
2010/04/12 PHP
PHP删除目录及目录下所有文件的方法详解
2013/06/06 PHP
php中try catch捕获异常实例详解
2014/11/21 PHP
Thinkphp无限级分类代码
2015/11/11 PHP
php while循环控制的简单实例
2016/05/30 PHP
Nginx实现反向代理
2017/09/20 Servers
PDO::beginTransaction讲解
2019/01/27 PHP
JavaScript使用prototype定义对象类型(转)[
2006/12/22 Javascript
jquery实现动态菜单的实例代码
2013/11/28 Javascript
JavaScript通过this变量快速找出用户选中radio按钮的方法
2015/03/23 Javascript
使用javascript实现判断当前浏览器
2015/04/14 Javascript
JQuery使用index方法获取Jquery对象数组下标的方法
2015/05/18 Javascript
jQuery实现自定义checkbox和radio样式
2015/07/13 Javascript
深入浅析javascript中的作用域(推荐)
2016/07/19 Javascript
jQuery+Ajax实现用户名重名实时检测
2017/06/01 jQuery
基于Bootstrap表单验证功能
2017/11/17 Javascript
jquery实现选项卡切换代码实例
2019/05/14 jQuery
使用Vue 实现滑动验证码功能
2019/06/27 Javascript
python实现网页链接提取的方法分享
2014/02/25 Python
python操作摄像头截图实现远程监控的例子
2014/03/25 Python
python采用getopt解析命令行输入参数实例
2014/09/30 Python
用python标准库difflib比较两份文件的异同详解
2018/11/16 Python
openCV提取图像中的矩形区域
2020/07/21 Python
Django xadmin安装及使用详解
2020/10/26 Python
HTML5实现移动端弹幕动画效果
2019/08/01 HTML / CSS
adidas爱尔兰官方网站:阿迪达斯运动鞋和运动服
2019/11/01 全球购物
Theflamel意大利:女士奢华服装、鞋子和配件
2020/01/11 全球购物
为什么会有内存对齐
2016/10/10 面试题
党员公开承诺践诺书
2014/03/25 职场文书
实习评语大全
2014/04/26 职场文书
演讲稿的格式及范文
2014/08/22 职场文书
幼儿园校园小喇叭广播稿
2014/10/17 职场文书
学习群众路线的心得体会
2014/11/05 职场文书
小学运动会开幕词
2015/01/28 职场文书
2015小学教师年度考核工作总结
2015/05/12 职场文书
创业计划书之熟食店
2019/10/16 职场文书