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中的回调函数和匿名函数的回调示例介绍
May 12 Javascript
实现前后端数据交互方法汇总
Apr 07 Javascript
javascript作用域链(Scope Chain)用法实例解析
Nov 30 Javascript
谈谈基于iframe、FormData、FileReader三种无刷新上传文件的方法
Dec 03 Javascript
JS常见问题之为什么点击弹出的i总是最后一个
Jan 05 Javascript
第一次接触神奇的Bootstrap菜单和导航
Aug 01 Javascript
jQuery过滤选择器用法示例
Sep 12 Javascript
基于jQuery实现Accordion手风琴自定义插件
Oct 13 Javascript
BootStrap Fileinput的使用教程
Dec 30 Javascript
javascript中contains是否包含功能实现代码(扩展字符、数组、dom)
Apr 07 Javascript
微信小程序实现自定义底部导航
Nov 18 Javascript
Vue 简单实现前端权限控制的示例
Dec 25 Vue.js
深入领悟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
destoon设置自定义搜索的方法
2014/06/21 PHP
分析php://output和php://stdout的区别
2018/05/06 PHP
激活 ActiveX 控件
2006/10/09 Javascript
硬盘浏览程序,保存成网页格式便可使用
2006/12/03 Javascript
Flash+XML滚动新闻代码 无图片 附源码下载
2007/11/22 Javascript
Javascript中的window.event.keyCode使用介绍
2011/04/26 Javascript
jquery中通过过滤器获取表单元素的实现代码
2011/07/05 Javascript
JavaScript高级程序设计阅读笔记(十六) javascript检测浏览器和操作系统-detect.js
2012/08/14 Javascript
jQuery仿Excel表格编辑功能的实现代码
2013/05/01 Javascript
jquery实现通用版鼠标经过淡入淡出效果
2014/06/15 Javascript
Jquery中offset()和position()的区别分析
2015/02/05 Javascript
jQuery实现折线图的方法
2015/02/28 Javascript
JavaScript的jQuery库中ready方法的学习教程
2015/08/14 Javascript
jQuery基于扩展实现的倒计时效果
2016/05/14 Javascript
详解Vue.js之视图和数据的双向绑定(v-model)
2017/06/23 Javascript
React Native悬浮按钮组件的示例代码
2018/04/05 Javascript
cdn模式下vue的基本用法详解
2018/10/07 Javascript
详解vue中使用protobuf踩坑记
2019/05/07 Javascript
jQuery删除/清空指定元素的所有子节点实例代码
2019/07/04 jQuery
原生js实现的观察者和订阅者模式简单示例
2020/04/18 Javascript
[02:27]2018DOTA2亚洲邀请赛趣味视频之钓鱼大赛 谁是垂钓冠军?
2018/04/05 DOTA
使用python遍历指定城市的一周气温
2017/03/31 Python
python使用Flask操作mysql实现登录功能
2018/05/14 Python
用Python实现数据的透视表的方法
2018/11/16 Python
java判断三位数的实例讲解
2019/06/10 Python
TensorFlow 读取CSV数据的实例
2020/02/05 Python
兰蔻英国官网:Lancome英国
2019/04/30 全球购物
JAVA代码查错题
2014/10/10 面试题
求职简历中自我评价
2014/01/28 职场文书
学生手册家长评语
2014/02/10 职场文书
于丹讲座视频观后感
2015/06/15 职场文书
同乡会致辞
2015/07/30 职场文书
解析Java异步之call future
2021/06/14 Java/Android
PostGIS的安装与入门使用指南
2022/01/18 PostgreSQL
PC版《死亡搁浅导剪版》现已发售 展开全新的探险
2022/04/03 其他游戏
Django中celery的使用项目实例
2022/07/07 Python