我们有一个系统,其中多个后端服务提供前端内容,最终合并到一个网页中。
目前,我们使用YUI3加载程序来支持YUI和其他javascript库的javascript和css依赖关系管理(例如jQuery,knockout)。
我想知道的是,有没有办法(使用YUI3的加载程序或其他一些加载程序)使这个过程能够在页面上拥有多个版本的库?
例如,如果所有使用代码都将$ object作为参数而不是使用全局$,那么从理论上讲,加载器可以在全局范围之外存储$ version 1.1和$ 1.2的副本,并将这些对象传递给正当地使用代码。
答案 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
不可用的地方。其他模块同时适用于X
和Y
。或者您只需关闭一个YUI().use()
并启动一个单独的模块,每个模块都有自己的模块(参见:http://yuilibrary.com/yui/docs/yui/yui-multi.html)。
对于外部模块,请在大约42分钟后观看此视频。它显示了如何加载外部模块并将它们集成到Y
或X
或任何您想要调用的模块中。在回调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
回调中,否则你将删除后来模块的依赖项。
第二种是远程的,太长而无法解释。因为它可能根本不会发生,所以让我把它留待以后。