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插件制作简单示例说明
Feb 03 Javascript
jQuery 追加元素的方法如append、prepend、before
Jan 16 Javascript
根据当前时间在jsp页面上显示上午或下午
Aug 18 Javascript
JS实现三级折叠菜单特效,其它级可自动收缩
Aug 06 Javascript
jQuery表单验证之密码确认
May 22 jQuery
react-redux中connect()方法详细解析
May 27 Javascript
Node.js实现连接mysql数据库功能示例
Sep 15 Javascript
对VUE中的对象添加属性
Sep 18 Javascript
解决vue A对象赋值给B对象,修改B属性会影响到A的问题
Sep 25 Javascript
基于AngularJs select绑定数字类型的问题
Oct 08 Javascript
Js通过AES加密后PHP用Openssl解密的方法
Jul 12 Javascript
vue-video-player 解决微信自动全屏播放问题(横竖屏导致样式错乱问题)
Feb 25 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 array_slice函数的使用以及参数详解
2008/08/30 PHP
关于尾递归的使用详解
2013/05/02 PHP
phplist及phpmailer(组合使用)通过gmail发送邮件的配置方法
2016/03/30 PHP
PHP面向对象程序设计之对象生成方法详解
2016/12/02 PHP
php实现给二维数组中所有一维数组添加值的方法
2017/02/04 PHP
PHP递归遍历文件夹去除注释并压缩php源代码的方法示例
2018/05/23 PHP
php使用yield对性能提升的测试实例分析
2019/09/19 PHP
浅谈Javascript事件处理程序的几种方式
2012/06/27 Javascript
JS返回iframe中frameBorder属性值的方法
2015/04/01 Javascript
JavaScript中DOM详解
2015/04/13 Javascript
jquery插件ajaxupload实现文件上传操作
2015/12/09 Javascript
angular ngClick阻止冒泡使用默认行为的方法
2016/11/03 Javascript
bootstrapfileinput实现文件自动上传
2016/11/08 Javascript
Vue-resource实现ajax请求和跨域请求示例
2017/02/23 Javascript
微信小程序实现添加手机联系人功能示例
2017/11/30 Javascript
Angular ng-animate和ng-cookies用法详解
2018/04/18 Javascript
移动端底部导航固定配合vue-router实现组件切换功能
2019/06/13 Javascript
js针对图片加载失败的处理方法分析
2019/08/24 Javascript
[43:48]Ti4正赛第一天 VG vs NEWBEE 2
2014/07/19 DOTA
[38:23]完美世界DOTA2联赛循环赛 FTD vs PXG BO2第二场 11.01
2020/11/02 DOTA
python解决网站的反爬虫策略总结
2016/10/26 Python
听歌识曲--用python实现一个音乐检索器的功能
2016/11/15 Python
浅谈Python实现2种文件复制的方法
2018/01/19 Python
python打包压缩、读取指定目录下的指定类型文件
2018/04/12 Python
Python实现随机创建电话号码的方法示例
2018/12/07 Python
使用python的pandas为你的股票绘制趋势图
2019/06/26 Python
python读文件的步骤
2019/10/08 Python
Python模块的定义,模块的导入,__name__用法实例分析
2020/01/07 Python
Python selenium使用autoIT上传附件过程详解
2020/05/26 Python
python有几个版本
2020/06/17 Python
HTML5之web workers_动力节点Java学院整理
2017/07/17 HTML / CSS
HTML5 创建canvas元素示例代码
2014/06/04 HTML / CSS
PacSun官网:加州生活方式服装、鞋子和配饰
2018/03/10 全球购物
LACOSTE波兰官网:Polo衫、服装和鞋类
2020/09/29 全球购物
死亡诗社观后感
2015/06/05 职场文书
学习nginx基础知识
2021/09/04 Servers