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 相关文章推荐
jQuery Select(单选) 模拟插件 V1.3.62 改进版
Jul 17 Javascript
理解Javascript闭包
Nov 01 Javascript
jquery实现仿新浪微博评论滚动效果
Aug 06 Javascript
JS实现的网页背景闪电闪烁效果代码
Oct 17 Javascript
jQuery隐藏和显示效果实现
Apr 06 Javascript
更靠谱的H5横竖屏检测方法(js代码)
Sep 13 Javascript
在 Angular 中实现搜索关键字高亮示例
Mar 21 Javascript
如何使用vuejs实现更好的Form validation?
Apr 07 Javascript
JavaScript中数组常见操作技巧
Sep 01 Javascript
详解vscode中vue代码颜色插件
Oct 11 Javascript
webpack 从指定入口文件中提取公共文件的方法
Nov 13 Javascript
基于 Vue 的 Electron 项目搭建过程图文详解
Jul 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中的reflection反射机制测试例子
2014/08/05 PHP
php实现socket推送技术的示例
2017/12/20 PHP
JS将所有对象s的属性复制给对象r(原生js+jquery)
2014/01/25 Javascript
jQuery循环滚动新闻列表示例代码
2014/06/17 Javascript
jquery实现在网页指定区域显示自定义右键菜单效果
2015/08/25 Javascript
JS实现消息来时让网页标题闪动效果的方法
2016/04/20 Javascript
jQuery原理系列-常用Dom操作详解
2016/06/07 Javascript
JS简单实现DIV相对于浏览器固定位置不变的方法
2016/06/17 Javascript
微信小程序 表单Form实例详解(附源码)
2016/12/22 Javascript
基于JavaScript实现图片剪切效果
2017/03/07 Javascript
原生JS实现前端本地文件上传
2018/09/08 Javascript
vue中promise的使用及异步请求数据的方法
2018/11/08 Javascript
Vue使用lodop实现打印小结
2019/07/06 Javascript
JS highcharts动态柱状图原理及实现
2020/10/16 Javascript
[01:13]2015国际邀请赛线下观战现场
2015/08/08 DOTA
盘点提高 Python 代码效率的方法
2014/07/03 Python
python实现比较两段文本不同之处的方法
2015/05/30 Python
python3.5 tkinter实现页面跳转
2018/01/30 Python
Python切片操作深入详解
2018/07/27 Python
浅谈Python脚本开头及导包注释自动添加方法
2018/10/27 Python
python文字转语音实现过程解析
2019/11/12 Python
python科学计算之numpy——ufunc函数用法
2019/11/25 Python
flask框架自定义url转换器操作详解
2020/01/25 Python
opencv python Canny边缘提取实现过程解析
2020/02/03 Python
100%有机精油,美容油:House of Pure Essence
2018/10/30 全球购物
Petmate品牌官方网站:宠物用品
2018/11/25 全球购物
AURALog面试题软件测试方面
2013/10/22 面试题
女大学生毕业找工作的自我评价
2013/10/03 职场文书
大学生党校培训心得体会
2014/09/11 职场文书
法人委托书的范本格式
2014/09/11 职场文书
幼儿园教师考核评语
2014/12/31 职场文书
大卫科波菲尔读书笔记
2015/06/30 职场文书
大学生暑期实践报告
2015/07/13 职场文书
使用ORM新增数据在Mysql中的操作步骤
2021/07/26 MySQL
详解pytorch创建tensor函数
2022/03/22 Python
用Python仅20行代码编写一个简单的端口扫描器
2022/04/08 Python