Javascript Portlet中的YUI版本冲突问题

Javascript Portlet中的YUI版本冲突问题,javascript,yui,liferay,portlet,Javascript,Yui,Liferay,Portlet,我正在从portlet加载yui.js 3.3.0版本文件,但liferay使用的是3.2.0 yui.js文件, 所以每当我加载页面时,js错误就会像 G_ENV._loaded[VERSION]未定义-此错误出现在yui.js中,该文件是liferay使用的3.2.0版本 所以它的替换值就像G_ENV._加载了[3.2.0],这将抛出一个错误,因为我们从portlet加载了3.3.0版本 我替换了portlet中的yui.js3.2.0版本文件,但它抛出了一些其他js错误 它在3.2.0中是

我正在从portlet加载yui.js 3.3.0版本文件,但liferay使用的是3.2.0 yui.js文件, 所以每当我加载页面时,js错误就会像

G_ENV._loaded[VERSION]未定义-此错误出现在yui.js中,该文件是liferay使用的3.2.0版本

所以它的替换值就像G_ENV._加载了[3.2.0],这将抛出一个错误,因为我们从portlet加载了3.3.0版本

我替换了portlet中的yui.js3.2.0版本文件,但它抛出了一些其他js错误

它在3.2.0中是如何工作的,或者有没有办法更新yui的现有版本

这是yui.js在这行中的代码,它的抛出错误

                      if (!G_ENV._loaded[VERSION][name]) {
                            missing.push(name);
                        } else {
                            used[name] = true; // probably css
                        }
任何人都会受到任何帮助,任何人都会面临这种问题


谢谢

升级、更改或覆盖Liferay中的本机YUI安装非常困难,原因有两个。第一,Liferay 6.0的UI框架(Alloy)在YUI 3.2.0上运行。第二,本机门户模板将alloy ui实例化到全局YUI对象(YUI.AUI)上,这很糟糕,因为它使YUI框架与可怕地实现的AUI紧密耦合。在加载页面时以及window.onload事件之后,浏览器在YUI对象上调用此AUI引用。如果您试图替换或修改全局YUI对象,它会使运行Liferay UI的Alloy出错

因为升级是不可能的,下一个最好的选择是只引入您想要使用的新YUI模块。此外,您还可以试用Liferay 6.1 CE,它内置了3.4.1,但它看起来仍处于测试阶段

下面是一个从YUI 3.4.1引入和使用dom核心模块并在运行于YUI 3.2.0的Liferay 6中使用它的示例。我从YUI的文档中了解到如何将YUI 2模块引入3()。要快速找出每个模块的依赖关系,可以使用YUI的在线配置程序


事实上,问题并不是因为合金被推到YUI物体上。通过简单地执行以下操作就可以解决这一问题: 加载新YUI后,
YUI.AUI=AUI

问题是因为everywhere Alloy(甚至页面上已经加载了YUI模块)引用了YUI,它希望它是YUI的特定版本

在许多情况下,这并没有什么大不了的,因为YUI版本之间的API距离不远。然而,在3.2和3.3之间,小部件中有一些变化,以及其他可能导致问题的一般性变化

问题是YUI目前没有一种可接受的方式将库的多个版本加载到页面上,而不会导致某种冲突。 (因为YUI全局get及其属性(如YUI.Env)被覆盖)

然而,我一直在思考一种可能的方法来处理这个问题,使用动态生成的iframe在不同的窗口中加载一个单独的YUI实例,并将其传递到原始页面)

如果我能做到这一点,我们将把它移植到Alloy的所有版本,这样Liferay用户也可以利用它

乔希,如果你有什么更好的办法来处理这件事,我一定洗耳恭听


谢谢,

啊,我知道你已经在2011年6月写过了:。另请参见。顺便提一下:我的用例是将小部件(就像推特订阅源的小部件、自定义谷歌搜索框、天气、类似Facebook的小部件)注入其他人的页面,而其他人的页面也可能使用YUI本身。更新:“s:“在沙盒iFrame中加载不同版本的YUI,并通过在
Y.Multi
实例上将其作为属性公开,使其可在父框架中使用。这主要用于测试。你可能不应该用它来做任何真实的事情。”这在某种程度上取决于Liferay吗?我在一个简单的HTML页面中尝试了同样的方法,加载
,然后使用上面的
基:'http://yui.yahooapis.com/3.4.1/build/“
。但是,它会继续记录版本是3.2.0,而不是3.4.1。(请参阅。)你真的用了乔希公认的答案吗?
var config = {
ignore : ["skin-sam-overlay","skin-sam-widget","skin-sam-widget-stack","skin-sam-tabview"],
groups: {
    yui341: {
        base: '/js/yui-3.4.1/build/',
        modules:  {
            yui341_yui_base: {
                path: 'yui-base/yui-base.js'
            },
            yui341_oop: {
                path: 'oop/oop.js',
                requires: ['yui341_yui_base']
            },
            yui341_features: {
                path: 'features/features.js',
                requires: ['yui341_yui_base']
            },
            yui341_dom_core: {
                path: 'dom-core/dom-core.js',
                requires: ['yui341_yui_base','yui341_oop','yui341_features']
            }
        }
    }
}
};

YUI(config).use('yui341_dom_core',function(Y){
    //YUI 3.4.1 config modules are now accessable through 'use' call
    console.log(Y.version);  //say hello to the newer version (3.4.1)
    Y.use('dom-core',function(Y){
        //Finally have access to native 3.4.1 module
        console.log(Y.DOM);
    });
});