源码网,源码论坛,源码之家,商业源码,游戏源码下载,discuz插件,棋牌源码下载,精品源码论坛

 找回密码
 立即注册
楼主: ttx9n

[JavaScript] YUI模块开发原理详解

[复制链接]

7万

主题

861

回帖

32万

积分

论坛元老

Rank: 8Rank: 8

积分
329525
发表于 2013-11-18 10:18:46 | 显示全部楼层 |阅读模式
这篇文章主要介绍YUI模块化开发的原理,提供了代码给大家学习参考使用

随着互联网应用越来越重,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实际的过程比上面要复杂的多。

回复

使用道具 举报

0

主题

1万

回帖

0

积分

中级会员

Rank: 3Rank: 3

积分
0
发表于 2022-8-12 10:08:48 | 显示全部楼层
哈哈哈哈哈哈
回复 支持 反对

使用道具 举报

16

主题

2万

回帖

174

积分

注册会员

Rank: 2

积分
174
发表于 2022-8-14 18:58:24 | 显示全部楼层
啊啊啊啊啊啊啊啊啊啊啊啊啊啊
回复 支持 反对

使用道具 举报

3

主题

2万

回帖

301

积分

中级会员

Rank: 3Rank: 3

积分
301
发表于 2022-9-23 03:30:40 | 显示全部楼层
搞个免费的用用
回复 支持 反对

使用道具 举报

2

主题

2万

回帖

381

积分

中级会员

Rank: 3Rank: 3

积分
381
发表于 2022-11-10 04:34:52 | 显示全部楼层
的谁vdvdsvdsvdsdsv
回复 支持 反对

使用道具 举报

3

主题

2万

回帖

156

积分

注册会员

Rank: 2

积分
156
发表于 2022-11-11 16:09:37 | 显示全部楼层
可以,看卡巴
回复 支持 反对

使用道具 举报

7

主题

2万

回帖

398

积分

中级会员

Rank: 3Rank: 3

积分
398
发表于 2023-6-20 11:21:26 | 显示全部楼层
来看看!!!
回复 支持 反对

使用道具 举报

0

主题

1万

回帖

0

积分

中级会员

Rank: 3Rank: 3

积分
0
发表于 2024-8-8 23:26:30 | 显示全部楼层
。。。。。。。。。。。。。。。
回复 支持 反对

使用道具 举报

0

主题

1万

回帖

0

积分

中级会员

Rank: 3Rank: 3

积分
0
发表于 2024-9-23 17:25:01 | 显示全部楼层
老衲笑纳了
回复 支持 反对

使用道具 举报

27

主题

2万

回帖

331

积分

中级会员

Rank: 3Rank: 3

积分
331
发表于 2024-10-16 12:22:44 | 显示全部楼层
哦哦哦哦哦哦哦哦哦
回复 支持 反对

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

手机版|小黑屋|网站地图|源码论坛 ( 海外版 )

GMT+8, 2025-2-5 10:45 , Processed in 0.070974 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表