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 isType() 类型判断代码
Feb 14 Javascript
jQuery实现动态添加和删除一个div
Aug 12 Javascript
JavaScript中的this机制
Jan 30 Javascript
Jquery ajax请求导出Excel表格的实现代码
Jun 08 Javascript
jQuery实现移动端手机商城购物车功能
Sep 24 Javascript
js断点调试心得分享(必看篇)
Dec 08 Javascript
微信小程序获取用户绑定手机号方法示例
Jul 21 Javascript
Vue开发环境跨域访问问题
Jan 22 Javascript
Vue组件基础用法详解
Feb 05 Javascript
vue+axios全局添加请求头和参数操作
Jul 24 Javascript
Vue+element+cookie记住密码功能的简单实现方法
Sep 20 Javascript
vue操作dom元素的3种方法示例
Sep 20 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 dirname()与__FILE__常量的应用
2013/06/24 PHP
php打开文件fopen函数的使用说明
2013/07/05 PHP
几道坑人的PHP面试题 试试看看你会不会也中招
2014/08/19 PHP
使用PHP+MySql+Ajax+jQuery实现省市区三级联动功能示例
2017/09/15 PHP
通过PHP设置BugFree获取邮箱通知
2019/04/25 PHP
jquery 弹出层注册页面等(asp.net后台)
2010/06/17 Javascript
JavaScript函数详解
2014/11/17 Javascript
JavaScript通过select动态更换图片的方法
2015/03/23 Javascript
浅谈javascript函数式编程
2015/09/06 Javascript
JS实现常见的TAB、弹出层效果(TAB标签,斑马线,遮罩层等)
2015/10/08 Javascript
JS、jQuery中select的用法详解
2016/04/21 Javascript
JavaScript入门教程之引用类型
2016/05/04 Javascript
Jquery Easyui自定义下拉框组件使用详解(21)
2020/12/31 Javascript
Node.js与Sails redis组件的使用教程
2017/02/14 Javascript
vue双向绑定简要分析
2017/03/23 Javascript
微信小程序 新建登录页并实现tabBar隐藏
2017/06/13 Javascript
react native实现往服务器上传网络图片的实例
2017/08/07 Javascript
vue input输入框关键字筛选检索列表数据展示
2020/10/26 Javascript
JS常见错误(Error)及处理方案详解
2020/07/02 Javascript
Python实现从url中提取域名的几种方法
2014/09/26 Python
使用Python实现下载网易云音乐的高清MV
2015/03/16 Python
在Python中编写数据库模块的教程
2015/04/29 Python
Python入门_浅谈for循环、while循环
2017/05/16 Python
python读取中文txt文本的方法
2018/04/12 Python
Python 计算任意两向量之间的夹角方法
2019/07/05 Python
Python获取时间戳代码实例
2019/09/24 Python
Python迭代器Iterable判断方法解析
2020/03/16 Python
在python里创建一个任务(Task)实例
2020/04/25 Python
解决keras使用cov1D函数的输入问题
2020/06/29 Python
python递归函数用法详解
2020/10/26 Python
印度手工编织服装和家居用品商店:Fabindi
2019/10/07 全球购物
群胜软件Java笔试题
2012/09/29 面试题
2014国庆节标语口号
2014/09/19 职场文书
会计工作总结范文2014
2014/12/23 职场文书
生鲜超市—未来中国最具有潜力零售业态
2019/08/02 职场文书
不知如何爱孩子,这些方法教会您
2019/08/06 职场文书