YUI 3 的 loader 已经很优雅地融合在YUI(config).use('moduleName', callback)中:

YUI({
base: 'http://t-yubo/assets/yui/3.0.0/build/',
debug: true,
filter: 'debug',
modules: {
jquery: {
fullpath: 'http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js'
}
}
}).use('jquery', 'node', function(Y) {
jQuery('body').text('YUI kisses jQuery!');
});

config参数,在 yui-base 模块里,原封不动地传给了 Loader:

// use loader to expand dependencies and sort the
// requirements if it is available.
if (Y.Loader) {
dynamic = true;
this._useQueue = this._useQueue || new Y.Queue();
loader = new Y.Loader(Y.config);
loader.require(a);
loader.ignoreRegistered = true;
loader.allowRollup = false;
loader.calculate();
a = loader.sorted;
}

注意 debug 和 filter 等参数值,用来切换调试状态非常方便。另外,通过 fullpath, 可以很方便加载任意 js/css 文件。

Loader 的基本工作原理

1. 将 YUI 自带的所有 modules 信息,存放在一个很大的数据对象里:

modules = {
moduleName: {
requires: [...],
optional: [...],
skinnable: true,
submodules: { ... },
plugins: { ... }
},
...
}

2. 根据传入参数和上面的数组,将需要加载的模块按依赖关系排好顺序。核心方法是calculate:

calculate: function(o) {
if (o || this.dirty) {
this._config(o);
this._setup();
this._explode();
if (this.allowRollup && !this.combine) {
this._rollup();
}
this._reduce();
this._sort();
// Y.log("after calculate: " + this.sorted);
this.dirty = false;
}

封装成了 6 个辅助方法,其中_sort方法最考验算法。

3. 按照依赖关系排好顺序的模块信息存放在this.sorted属性中。接下来,调用 get 模块加载即可,具体请参考源码中的_insert, _continue, loadNext等方法。

以上是主线,还有很多细节和分支就不多说了。loader 总共 2000 多行代码,相当不易。

快乐学习,欢迎讨论。

YUI 3 学习笔记:loader相关推荐

  1. YUI 3 学习笔记:YUI Base

    基于 github 上 yui 3.0 2009-06-19 version YUI Base 包含 7 个 submodules: 展开的详细图请看:yui-base-full.png 一些好的想法 ...

  2. oracle数据库开多线程,学习笔记:Oracle表数据导入 DBA常用单线程插入 多线程插入 sql loader三种表数据导入案例...

    天萃荷净 oracle之数据导入,汇总开发DBA在向表中导入大量数据的案例,如:单线程向数据库中插入数据,多线程向数据表中插入数据,使用sql loader数据表中导入数据案例 1.Oracle数据库 ...

  3. java学习笔记13--反射机制与动态代理

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note13.html,转载请注明源地址. Java的反射机制 在Java运行时环境中,对于任意 ...

  4. java jvm学习笔记二(类装载器的体系结构)

    欢迎装载请说明出处:http://blog.csdn.net/yfqnihao                  在了解java虚拟机的类装载器之前,有一个概念我们是必须先知道的,就是java的沙箱, ...

  5. amazeui学习笔记--css(HTML元素2)--代码Code

    amazeui学习笔记--css(HTML元素2)--代码Code 一.总结 1.行内代码:code标签<code> 2.代码片段:pre标签<pre> 3.限制代码块高度:添 ...

  6. ReactJS学习笔记——npm、JSX、webpack

    2019独角兽企业重金招聘Python工程师标准>>> #ReactJS学习笔记--npm.JSX.webpack [toc] React是一个JavaScript库文件,使用它的目 ...

  7. LVS学习笔记--概念

    最近在学习南非蚂蚁大大的博客上的一些文章,主要在学习LVS,现在就是将自己学习到的内容记录下来,做一个学习笔记与大家分享. 南非蚂蚁大大的博客是http://ixdba.blog.51cto.com ...

  8. Vue 学习 第六天学习笔记

    Vue 学习 第六天学习笔记 1.webpack  使用复习 第一步:先建立文件夹. 第二步,用webpack将其初始化,建立管理.npm 的包管理工具管理起来, npm init -y  .注意{查 ...

  9. jvm学习笔记(一)

    jvm学习笔记(一) 文章目录 jvm学习笔记(一) 1.全部笔记链接 3.类加载器 作用 类别 加载步骤 获得类加载器 4.双亲委派机制 5.沙箱安全机制 沙箱概念 JAVA沙箱的基本组件 基本组件 ...

最新文章

  1. Git 分布式版本控制系统
  2. python在工作上可以干什么-学习Python以后能在企业里工作中能做什么?
  3. python 判断子序列_LeetCode 392. 判断子序列 | Python
  4. Hadoop配置文件
  5. 云服务器的发展历程,盘点微软Azure云服务器的发展历程
  6. 使用XAMPP轻松建站(上)
  7. VB 创建快捷方式函数(可带参数)
  8. Linux scp连接很慢,ssh连接很慢问题分析
  9. css左侧投影_css单边投影与双侧投影
  10. 【JZOJ4743】【NOIP2016提高A组模拟9.2】积木
  11. mysql编译安装后各种常见错误集锦
  12. ARC094F Normalization
  13. win10下装黑苹果双系统_预算5000的黑苹果/WIN双系统台式电脑组装建议
  14. 2020-10-28网络安全之网络安全产品
  15. 科技赋能时代 用ocr身份证识别
  16. 电感式传感器的原理大白话
  17. 【转】DICOM医学图像处理:浅析SWF、MWL、SPS、MPPS
  18. 楼氏电子推出Raspberry Pi 开发工具包,为新物联网应用和行业语音整合提供支持
  19. 无名2021/01/18
  20. 虚拟主机换云服务器,云虚拟主机想换云服务器

热门文章

  1. 数据结构课程设计【C++实现】
  2. 认证学习4 - Bearer认证(Token认证)讲解、代码实现、演示
  3. Git学习之旅--撤销与删除
  4. Pandas和Numpy:常见函数参数inplace的作用
  5. 常用的参数和非参数检验方法
  6. Linux 中 Netcat 工具的使用
  7. C++ Opencv 实现Canny算法
  8. 图像处理2:图像边缘检测(python+opencv)
  9. Kotlin入门第四节
  10. CSS Display与Visibility区别和用法