我有许多不同版本的 javascript 库可以动态加载。
例如,假设我要加载 foo 库的多个版本。我有:
foo-0.1.js
foo-0.2.js
Foo 不是兼容 AMD 的库,也没有无冲突模式。这是我无法控制的第三方库。它只是按照以下方式做一些事情:
window.Foo = fooFunction;
这些库版本在插件场景中异步和动态加载。加载实际上是由requirejs完成的,但这并不重要。假设函数的内容被下载并执行。
假设我们有一个需要 foo-0.1 的 MODULE_1 插件和一个需要 foo-0.2 的 MODULE_2 插件。
当用户请求时(例如通过单击其名称),MODULE_1 被初始化并加载 foo-0.1。它设置用户界面(画布)并等待用户输入。window.foo 对象现在指向版本 0.1。
然后,用户请求 MODULE_2,它被初始化并开始加载 foo-0.2,然后设置它的画布并等待用户输入。现在 window.foo 被覆盖并指向 foo-0.2。
最后,用户点击 MODULE_1 的用户界面,它对情况做出反应并尝试做某事。但是 window.foo 指向的是 foo-0.2 对象,它与 MODULE_1 不兼容,并且崩溃得很惨。
我想要的是将 foo-0.1 存储在一个对象中,将 foo-0.2 存储在另一个对象中。加载 foo-0.1 和 foo-0.2 时有什么方法可以更改窗口对象吗?
PS。我认为这不会起作用:
/* MODULE_1 */
// load foo-0.1
// when ready:
var foo-0.1 = window.foo
/* MODULE_1 */
// load foo-0.2
// when ready:
var foo-0.2 = window.foo
因为我不能确定两者之一的就绪事件会在另一个的就绪事件之前加载(对吗?)
PPS:我很清楚RequireJs multiversion support,但除非加载的库符合 AMD 标准,否则它不会工作。