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 相关文章推荐
文本域中换行符的替换示例
Mar 04 Javascript
js子页面获取父页面数据示例
May 15 Javascript
最全面的百度地图JavaScript离线版开发
Sep 10 Javascript
JS冒泡事件与事件捕获实例详解
Nov 25 Javascript
jQuery NProgress.js加载进度插件的简单使用方法
Jan 31 jQuery
解决vue 格式化银行卡(信用卡)每4位一个符号隔断的问题
Sep 14 Javascript
Vue绑定内联样式问题
Oct 17 Javascript
vue-quill-editor+plupload富文本编辑器实例详解
Oct 19 Javascript
微信小程序MUI侧滑导航菜单示例(Popup弹出式,左侧不动,右侧滑动)
Jan 23 Javascript
详解vue-cli3开发Chrome插件实践
May 29 Javascript
五分钟搞懂Vuex实用知识(小结)
Aug 12 Javascript
node koa2 ssr项目搭建的方法步骤
Dec 11 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
apache+php完美解决301重定向的两种方法
2011/06/08 PHP
PHP 9 大缓存技术总结
2015/09/17 PHP
PHP利用imagick生成组合缩略图
2016/02/19 PHP
PHP数组常用函数实例小结
2018/08/20 PHP
编写高性能的JavaScript 脚本的加载与执行
2010/04/19 Javascript
Jquery拖拽并简单保存的实现代码
2010/11/28 Javascript
基于jquery的一行代码轻松实现拖动效果
2010/12/28 Javascript
js弹出的对话窗口永远保持居中显示
2012/12/15 Javascript
jquery中animate动画积累的解决方法
2013/10/05 Javascript
JS取文本框中最小值的简单实例
2013/11/29 Javascript
jQuery中:checked选择器用法实例
2015/01/04 Javascript
教你如何使用firebug调试功能了解javascript闭包和this
2015/03/04 Javascript
jQuery实现表格展开与折叠的方法
2015/05/04 Javascript
javascript HTML5 Canvas实现圆盘抽奖功能
2016/04/11 Javascript
基于CSS3和jQuery实现跟随鼠标方位的Hover特效
2016/07/25 Javascript
jQuery实现Select下拉列表进行状态选择功能
2017/03/30 jQuery
红黑树的插入详解及Javascript实现方法示例
2018/03/26 Javascript
原生JS与JQ获取元素的区别详解
2020/02/13 Javascript
[03:04]DOTA2英雄基础教程 影魔
2013/12/11 DOTA
Python的Flask框架中集成CKeditor富文本编辑器的教程
2016/06/13 Python
Python实现在线音乐播放器
2017/03/03 Python
Python实现合并两个列表的方法分析
2018/05/28 Python
python切片的步进、添加、连接简单操作示例
2019/07/11 Python
在django view中给form传入参数的例子
2019/07/19 Python
Mac PyCharm中的.gitignore 安装设置教程
2020/04/16 Python
使用PyCharm安装pytest及requests的问题
2020/07/31 Python
Python生成并下载文件后端代码实例
2020/08/31 Python
关于python中remove的一些坑小结
2021/01/04 Python
美国全球旅游运营商:Pacific Holidays
2018/06/18 全球购物
北美主要的汽车零部件零售商:AutoShack.com
2019/02/23 全球购物
华为C++笔试题
2014/08/05 面试题
学生的自我鉴定范文
2013/10/24 职场文书
运动会入场词200字
2014/02/15 职场文书
公司聘任书模板
2014/03/29 职场文书
销售类求职信
2014/06/13 职场文书
计生个人工作总结
2015/02/28 职场文书