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 相关文章推荐
Prototype源码浅析 String部分(三)之HTML字符串处理
Jan 15 Javascript
js转义字符介绍
Nov 05 Javascript
动态的绑定事件addEventListener方法的使用
Jan 24 Javascript
关于JavaScript命名空间的一些心得
Jun 07 Javascript
浅谈JavaScript中的string拥有方法的原因
Aug 28 Javascript
jQuery插件Validate实现自定义表单验证
Jan 18 Javascript
JavaScript 2048 游戏实例代码(简单易懂)
Mar 25 Javascript
jQuery获取Table某列的值(推荐)
Mar 03 Javascript
vue动态改变背景图片demo分享
Sep 13 Javascript
解决LayUI加上form.render()下拉框和单选以及复选框不出来的问题
Sep 27 Javascript
关于引入vue.js 文件的知识点总结
Jan 28 Javascript
vue实现简单学生信息管理
May 30 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 连接mysql连接被重置的解决方法
2011/02/15 PHP
thinkPHP多表查询及分页功能实现方法示例
2017/07/03 PHP
php下的原生ajax请求用法实例分析
2020/02/28 PHP
struts2+jquery+json实现异步加载数据(自写)
2013/06/24 Javascript
关于jQuery中.attr()和.prop()的问题探讨
2013/09/06 Javascript
一款基jquery超炫的动画导航菜单可响应单击事件
2014/11/02 Javascript
jQuery实现隔行背景色变色
2014/11/24 Javascript
jQuery实现灰蓝风格标准二级下拉菜单效果代码
2015/08/31 Javascript
JavaScript仿支付宝密码输入框
2015/12/29 Javascript
js/jquery控制页面动态加载数据 滑动滚动条自动加载事件的方法
2017/02/08 Javascript
关于Node.js的events.EventEmitter用法介绍
2017/04/01 Javascript
Vue中的ref作用详解(实现DOM的联动操作)
2017/08/21 Javascript
小程序自定义组件实现城市选择功能
2018/07/18 Javascript
Vue 路由切换时页面内容没有重新加载的解决方法
2018/09/01 Javascript
微信小程序发送短信验证码完整实例
2019/01/07 Javascript
微信小程序学习笔记之目录结构、基本配置图文详解
2019/03/28 Javascript
vue中的过滤器实例代码详解
2019/06/06 Javascript
在Layui 的表格模板中,实现layer父页面和子页面传值交互的方法
2019/09/10 Javascript
[01:14:10]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS Orenda
2014/05/22 DOTA
[29:59]完美世界DOTA2联赛PWL S3 Forest vs access 第二场 12.11
2020/12/13 DOTA
python 文件与目录操作
2008/12/24 Python
phpsir 开发 一个检测百度关键字网站排名的python 程序
2009/09/17 Python
python登录pop3邮件服务器接收邮件的方法
2015/04/30 Python
python中requests小技巧
2017/05/10 Python
Python实现的多线程同步与互斥锁功能示例
2017/11/30 Python
python+opencv实现动态物体识别
2018/01/09 Python
示例详解Python3 or Python2 两者之间的差异
2018/08/23 Python
Python字符串大小写转换拼接删除空白
2019/09/19 Python
使用python 的matplotlib 画轨道实例
2020/01/19 Python
Django中的模型类设计及展示示例详解
2020/05/29 Python
HTML5是否真的可以取代Flash
2010/02/10 HTML / CSS
英国皇家造币厂:The Royal Mint
2018/10/05 全球购物
小班评语大全
2014/05/04 职场文书
青年干部培训班学习心得体会
2016/01/06 职场文书
苹果电脑mac os中货币符号快捷输入
2022/02/17 杂记
Python使用Web框架Flask开发项目
2022/06/01 Python