YUI 团队非常勤快,已经撰写了一份很详细的文档:The Get Utility. 还制作了 Cheat Sheet PDF.

上面的文档非常详细,我都不知道写什么了。下面仅说几个注意点:

1. 上面的文档中,提到的 onProgress 事件,在实际源码中还没实现。

2. 注意以下两种写法不等价:

// 写法 A:
Y.Get.script(['1.js', '2.js']);
// 写法 B:
Y.Get.script('1.js');
Y.Get.script('2.js');

写法 A 是在加载完 1.js 后,再加载 2.js, 是同步依次加载。
写法 B 是异步同时加载 1.js 和 2.js.

3. 对于 css 文件,由于 Firefox, Safari 和 Chrome 下 link 元素无 onload 事件,因此在这些浏览器下,onSuccess 等事件仅表示 css 文件都已经开始下载,但可能并没下载完,而且下载顺序也不一定。

4. 在源码里,还存在某些残留的无用代码,比如q.varName, 源码注释和 Cheat Sheet 也都需要更新。beta1 到正式版,还有不少路要走。

5. YUI 的源码有个非常好的习惯,将字符串常量定义在起始处:

var TYPE_JS    = "text/javascript",
     TYPE_CSS   = "text/css",
     STYLESHEET = "stylesheet";

这能方便维护,同时能提高 YUICompressor 的压缩率。

6. 默认情况下,js 文件下载执行完成后,会自动 purge 掉。css 不会。考虑到删除节点的性能损耗,在需要获取大量 script 的情景中,比如获取搜索提示的 jsonp数据,建议将 autopurge 设为 false.

7. Douglas 《JavaScript: The Good Parts》3.2 节里提到:

The || operator can be used to fill in default values:

var middle = stooge["middle-name"] || "(none)";
var status = flight.status || "unknown";

这个说法并不严谨。因为stooge["middle-name"]可能为 falsy 值:”", false, 0, undefined, null, NaN
更严谨的写法如下:

var middle = ("middle-name" in stooge) ? stooge["middle-name"] : "(none)";
var status = (typeof fligt.status != "undefined") ? flight.status : "unknown";

注意:在大部分代码逻辑里,用o = o || {}来设默认值已经足够强健,不需要采用严谨写法。
YUI get 里采用了严谨写法,因为是底层框架,不得不非常小心。

8. 感觉 get 模块最难处理的,是妥善的组织好事件代码,在合适的时机触发合适的事件。事件一多,还要考虑浏览器兼容,要写好真不容易。(测试相当重要)

9. get 模块里,函数都是小颗粒的,每个函数的职责清晰单一,佩服作者的代码组织和重构功底。

10. yui-base 里新增加了 queue-base 组件,get 组件可以使用 queue-base 封装 queues,能稍微减少些代码。不过目前保持独立也挺好的,毕竟 queue-base 是否会保留在 YUI seed 里,还不一定。

学习完毕,欢迎讨论。