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 代码也可以变得优美的实现方法
Jun 22 Javascript
把html页面的部分内容保存成新的html文件的jquery代码
Nov 12 Javascript
javascript showModalDialog模态对话框使用说明
Dec 31 Javascript
在JavaScript应用中使用RequireJS来实现延迟加载
Jul 01 Javascript
浅析Bootstrap验证控件的使用
Jun 23 Javascript
Javascript数组中push方法用法分析
Oct 31 Javascript
详解webpack解惑:require的五种用法
Jun 09 Javascript
react开发教程之React 组件之间的通信方式
Aug 12 Javascript
JS基于对象的特性实现去除数组中重复项功能详解
Nov 17 Javascript
微信小程序如何修改radio和checkbox的默认样式和图标
Jul 24 Javascript
vue学习笔记之过滤器的基本使用方法实例分析
Feb 01 Javascript
JavaScript实现串行请求的示例代码
Sep 14 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
自己前几天写的无限分类类
2007/02/14 PHP
PHP UTF8编码内的繁简转换类
2009/07/20 PHP
显示youtube视频缩略图和Vimeo视频缩略图代码分享
2014/02/13 PHP
php文件上传类完整实例
2016/05/14 PHP
PHP设计模式之策略模式原理与用法实例分析
2019/04/04 PHP
情人节专属 纯js脚本1k大小的3D玫瑰效果
2012/02/11 Javascript
javascript动态加载实现方法一
2012/08/22 Javascript
javascript采用数组实现tab菜单切换效果
2012/12/12 Javascript
node.js中使用q.js实现api的promise化
2014/09/17 Javascript
node.js开机自启动脚本文件
2014/12/24 Javascript
iframe中子父类窗口调用JS的方法及注意事项
2015/08/25 Javascript
AngularJs expression详解及简单示例
2016/09/01 Javascript
Angular和Vue双向数据绑定的实现原理(重点是vue的双向绑定)
2016/11/22 Javascript
jquery操作select取值赋值与设置选中实例
2017/02/28 Javascript
Vue单文件组件基础模板小结
2017/08/10 Javascript
ES6基础之默认参数值
2019/02/21 Javascript
vue计算属性computed的使用方法示例
2019/03/13 Javascript
JavaScript如何处理移动端拍摄图片旋转问题
2019/11/16 Javascript
解决VUEX的mapState/...mapState等取值问题
2020/07/24 Javascript
小程序实现左滑删除的效果的实例代码
2020/10/19 Javascript
[13:40]TI3青蛙君全程回顾 DOTA2我们为梦想再战
2013/09/13 DOTA
[45:44]完美世界DOTA2联赛PWL S2 FTD vs PXG 第一场 11.27
2020/12/01 DOTA
通过python下载FTP上的文件夹的实现代码
2013/02/10 Python
python调用shell的方法
2013/11/20 Python
Python编写检测数据库SA用户的方法
2014/07/11 Python
Python下使用Psyco模块优化运行速度
2015/04/05 Python
python下paramiko模块实现ssh连接登录Linux服务器
2015/06/03 Python
python PyAutoGUI 模拟鼠标键盘操作和截屏功能
2019/08/04 Python
Python使用微信itchat接口实现查看自己微信的信息功能详解
2019/08/22 Python
Hotter Shoes英国官网:英伦风格,舒适的鞋子
2017/12/28 全球购物
学校大课间活动方案
2014/01/30 职场文书
综合实践教学反思
2014/01/31 职场文书
结对共建工作方案
2014/06/02 职场文书
毕业答辩开场白范文
2015/05/27 职场文书
后天观后感
2015/06/08 职场文书
解决Jenkins集成SonarQube遇到的报错问题
2021/07/15 Java/Android