我们使用 YUI3 加载器来管理加载我们的 javascript 和 css 文件。作为每个页面上的引导 js 代码的一部分,我们有如下内容:
YUI({
...
groups: {
...
myGroup: {
modules: {
"my-module": {
...
path: "MyModule.js",
requires: [ "yui-base" ]
},
}
...
}
}
}).use("my-module", function (Y) {
Y.MyModule.doStuff();
});
MyModule.js 有如下内容:
YUI.add('my-module', function (Y) {
Y.MyModule = function () {
...
_validator: Y.Lang.isString
};
}, '3.4.0', {
requires: [ "yui-base" ]
});
YUI在这里还声称加载器可以与非 YUI3 “模块”一起使用,因为它们在配置中指定了它们的依赖关系。他们为 yui2 组提供了以下示例模块配置:
yui2: {
combine: true,
base: 'http://yui.yahooapis.com/2.8.0r4/build/',
comboBase: 'http://yui.yahooapis.com/combo?',
root: '2.8.0r4/build/',
modules: { // one or more external modules that can be loaded along side of YUI
yui2_yde: {
path: "yahoo-dom-event/yahoo-dom-event.js"
},
yui2_anim: {
path: "animation/animation.js",
requires: ['yui2_yde']
}
}
}
这表明 YUI 足够聪明,只有在 yahoo-dom-event.js 加载并运行后才能加载和运行 YUI2 的 animation.js。
我不明白的是,如果这适用于非 YUI 模块,为什么我必须用 YUI.add 和冗余需求列表包装我自己的模块(因为在配置中也指定了需求)?
我尝试删除添加包装器(我将其替换为(function (Y) { /* module content */ })(YUI);
),但这会导致页面加载时出现 js 错误:Y.Lang 未定义。因此,似乎在没有包装 add() 调用的情况下,脚本在定义 Y.Lang 的基本 yui 脚本之前执行。但是,如果是这种情况,那么这对于非 YUI 模块(不调用 YUI.add())不会是个问题吗?