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.Autocomplete实现自动完成功能(详解)
Jul 13 Javascript
jQuery1.6 使用方法一
Nov 23 Javascript
js操纵跨frame的三级联动select下拉选项实例介绍
May 19 Javascript
关于编写性能高效的javascript事件的技术
Nov 28 Javascript
Lab.js初次使用笔记
Feb 28 Javascript
js+HTML5基于过滤器从摄像头中捕获视频的方法
Jun 16 Javascript
jquery根据td给相同tr下其他td赋值的实现方法
Oct 05 Javascript
Vue.js tab实现选项卡切换
May 16 Javascript
vue-cli webpack模板项目搭建及打包时路径问题的解决方法
Feb 26 Javascript
在vue项目中,使用axios跨域处理
Mar 07 Javascript
javascript设计模式 ? 单例模式原理与应用实例分析
Apr 09 Javascript
Javascript的promise,async和await的区别详解
Mar 24 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
elgg 获取文件图标地址的方法
2010/03/20 PHP
php-perl哈希算法实现(times33哈希算法)
2013/12/30 PHP
理解Javascript_07_理解instanceof实现原理
2010/10/15 Javascript
在chrome浏览器中,防止input[text]和textarea在聚焦时出现黄色边框的解决方法
2011/05/24 Javascript
jquery检测input checked 控件是否被选中的方法
2014/03/26 Javascript
JS实现固定在右下角可展开收缩DIV层的方法
2015/02/13 Javascript
JavaScript将当前时间转换成UTC标准时间的方法
2015/04/06 Javascript
关于JavaScript 原型链的一点个人理解
2016/07/31 Javascript
KnockoutJS 3.X API 第四章之表单submit、enable、disable绑定
2016/10/10 Javascript
vue实现简单实时汇率计算功能
2017/01/15 Javascript
AngularJS动态菜单操作指令
2017/04/25 Javascript
javascript 数据存储的常用函数总结
2017/06/01 Javascript
NodeJS实现图片上传代码(Express)
2017/06/30 NodeJs
vue中如何创建多个ueditor实例教程
2017/11/14 Javascript
JS关于刷新页面的相关总结
2018/05/09 Javascript
JS如何获取地址栏的参数实例讲解
2018/10/06 Javascript
jQuery表单校验插件validator使用方法详解
2020/02/18 jQuery
jQuery实现视频展示效果
2020/05/30 jQuery
Vue组件为什么data必须是一个函数
2020/06/11 Javascript
[00:52]玛尔斯技能全介绍
2019/03/06 DOTA
浅谈python类属性的访问、设置和删除方法
2016/07/25 Python
pytorch AvgPool2d函数使用详解
2020/01/03 Python
python实现简单的购物程序代码实例
2020/03/03 Python
世界上最大的艺术和工艺用品商店:MisterArt.com
2018/07/13 全球购物
高清安全摄像头系统:Lorex Technology
2018/07/20 全球购物
电子商务毕业生求职信
2013/11/10 职场文书
入党积极分子批评与自我批评思想汇报
2014/09/14 职场文书
公安机关查摆剖析材料
2014/10/10 职场文书
2015年简历自我评价范文
2015/03/11 职场文书
教师继续教育反思周记
2015/06/25 职场文书
歌咏比赛主持词
2015/06/29 职场文书
OpenCV全景图像拼接的实现示例
2021/06/05 Python
图解排序算法之希尔排序Java实现
2021/06/26 Java/Android
总结Python变量的相关知识
2021/06/28 Python
关于springboot配置druid数据源不生效问题(踩坑记)
2021/09/25 Java/Android
利用Python实现翻译HTML中的文本字符串
2022/06/21 Python