gpt4 book ai didi

javascript - 为什么在指定 YUI 模块时需要 YUI.add,如果需要,非 YUI 模块如何工作?

转载 作者:行者123 更新时间:2023-11-29 09:53:10 27 4
gpt4 key购买 nike

我们使用 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 还声称 here加载程序可以与非 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())来说这不是一个问题吗?

最佳答案

区分使用 YUI3 特性(沙盒 Y.Lang 等)的自定义模块和完全外部代码很重要。

在第一种情况下,YUI.add()包装器始终是必需的,因为沙箱 Y变量在模块回调之外不可用(YUI.add() 的第二个参数)。不幸的是,由于 Y.Loader 中的限制,在手写模块中重复模块配置是必要的(组合加载魔术发生的地方)。使用 YUI 的模块 build tools自动添加包装器和元数据。

使用完全外部代码,您只需提供 fullpath配置属性,YUI 会做正确的事情。在内部,YUI 知道给定 <script> 的时间。请求完成,并将成功与配置的模块名称相关联。

为了简化事情,我将使用 YUI.applyConfig演示配置位。使用它,您可以创建任意数量的 YUI 沙箱(通过 YUI().use(...) )并混合配置,而不是到处重复它。

YUI.applyConfig({
"modules": {
"leaflet": {
"fullpath": "http://cdn.leafletjs.com/leaflet-0.6.4/leaflet.js"
},
"my-leaflet-thing": {
"path": "path/to/my-leaflet-thing.js",
"requires": [
"base-build",
"node-base",
"leaflet"
]
}
}
});

my-leaflet-thing.js 看起来像这样:

YUI.add("my-leaflet-thing", function (Y) {
// a safe reference to the global "L" provided by leaflet.js
var L = Y.config.global.L;

Y.MyLeafletThing = Y.Base.create("myLeaflet", Y.Base, {
initializer: function () {
var id = this.get('node').get('id');
var map = L.map(id);
// etc
}
}, {
ATTRS: {
node: {
getter: Y.one
}
}
});

// third argument is a version number,
// but it doesn't affect anything right now
}, "1.0.0", {
"requires": [
"base-build",
"node-base",
"leaflet"
]
});

鉴于此设置,由于这需要非异步库,您可以安全地执行此操作:

YUI().use("my-leaflet-thing", function (Y) {
var instance = new Y.MyLeafletThing({
"node": "#foo"
});
});

注意:如果一个外部文件动态加载它自己(例如,async Google Maps API),YUI 将只知道初始请求成功,而不是整个文件链加载。要解决这个问题,您需要在 fullpath 中使用查询字符串回调参数。配置,与需要它的模块中的一些全局公开回调相关联。

在这些情况下,最好进行内部 Y.use() (注意沙箱变量)以更好地封装所需的全局变量。

配置:

YUI.applyConfig({
"modules": {
"google-maps-api": {
"fullpath": "http://maps.googleapis.com/maps/api/js" +
"?v=3&sensor=false&callback=initGMapsAPI"
},
"my-google-map-thing": {
"path": "path/to/my-google-map-thing.js",
"requires": [
"base-build",
"node-base"
]
}
}
});

my-google-map-thing.js:

YUI.add("my-google-map-thing", function (Y) {
// publish a custom event that will be fired from the global callback
Y.publish('gmaps:ready', {
emitFacade: true,
fireOnce: true
});

// private sentinel to determine if Y.use() has been called
var isUsed = false;

// expose global function that matches "callback" parameter value
Y.config.global.initGMapsAPI = function () {
// Y.config.global.google is now available
Y.fire('gmaps:ready');
};

Y.MyGoogleMapThing = Y.Base.create("myGoogleMap", Y.Base, {
initializer: function () {
Y.on('gmaps:ready', this.render, this);
if (!isUsed) {
isUsed = true;
Y.use("google-maps-api");
}
},
render: function () {
// safe reference to global "google"
var google = Y.config.global.google;
var id = this.get('node').get('id');
var map = new google.maps.Map(id, {
// ...
});
// etc
}
}, {
ATTRS: {
node: {
getter: Y.one
}
}
});

}, "1.0.0", {
"requires": [
"base-build",
"node-base"
]
});

总结:YUI.add()仅在编写依赖于 YUI3 沙盒资源的模块时才需要。加载外部代码,只要它是同步的,就像使用 fullpath 一样简单。配置属性。异步外部加载有点麻烦,但仍然可行。

关于javascript - 为什么在指定 YUI 模块时需要 YUI.add,如果需要,非 YUI 模块如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18109852/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com