是否有一个javascript加载器支持在同一个浏览器窗口中使用多个版本的公共库?

时间:2013-08-13 20:09:50

标签: javascript dependencies amd yui3

我们有一个系统,其中多个后端服务提供前端内容,最终合并到一个网页中。

目前,我们使用YUI3加载程序来支持YUI和其他javascript库的javascript和css依赖关系管理(例如jQuery,knockout)。

我想知道的是,有没有办法(使用YUI3的加载程序或其他一些加载程序)使这个过程能够在页面上拥有多个版本的库?

例如,如果所有使用代码都将$ object作为参数而不是使用全局$,那么从理论上讲,加载器可以在全局范围之外存储$ version 1.1和$ 1.2的副本,并将这些对象传递给正当地使用代码。

1 个答案:

答案 0 :(得分:0)

我没有测试它,可能需要一些微调,但这是我认为可以做到的方式。

YUI Loader允许加载YUI本身的多个版本。这就是为什么它通常称为Y的参数提供给它在加载所请求的模块时调用的回调:

YUI().use('moduleA', 'moduleB', ... , function (Y) {

您可以多次致电YUI().use(),每个人都会根据要求提供自己的Y版本。

此外,您可以将呼叫嵌套到use()

YUI().use('moduleA', 'moduleB', ... , function (Y) {
     // ......
     Y.use('moduleC', function (X) {

对于第二个实例,我使用X作为回调的参数,因此您实际上可以使用X可用的'moduleC'Y不可用的地方。其他模块同时适用于XY。或者您只需关闭一个YUI().use()并启动一个单独的模块,每个模块都有自己的模块(参见:http://yuilibrary.com/yui/docs/yui/yui-multi.html)。

对于外部模块,请在大约42分钟后观看此视频。它显示了如何加载外部模块并将它们集成到YX或任何您想要调用的模块中。在回调onProgress事件时,通过调用Y将加载的模块添加到YUI实例中,即YUI.add()。提供给Y回调的YUI.add()参数与YUI().use()的回调中的参数相同。

因此,定义外部模块给每个模块或每个版本提供不同的模块名称,每个模块都指向该版本的相应路径。如果每个版本共享一个公共根路径,base配置属性中的groups配置(请参阅:http://yuilibrary.com/yui/docs/yui/loader.html#example-config)可以很方便。

我能想到的两件事。首先,如果外部库将所有内容加载到全局变量中,那么当您加载第二个版本时,将会有一些已经加载的内容的残余。如果这会产生冲突,则可能必须在将对该对象的引用放入Y后删除该全局对象。这应该在加载整批模块之后完成,可能在onSuccess回调中,而不是在onProgress回调中,否则你将删除后来模块的依赖项。

第二种是远程的,太长而无法解释。因为它可能根本不会发生,所以让我把它留待以后。