【问题标题】:Is there a javascript loader that supports using multiple versions of common libraries in the same browser window?是否有支持在同一浏览器窗口中使用多个版本的公共库的 javascript 加载器?
【发布时间】:2013-08-15 14:44:10
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您对后端服务有控制权吗?你只想要这个用于 jQuery 吗?如果对他们两个的回答都是肯定的,那么你可以使用 $.noConflict()。
  • 如果在编写 JS 代码时没有考虑到多个版本,那么您尝试做的事情基本上是不可能的。意味着更改所有这些 JS 文件以对 $ 使用不同的变量。 1.1 的 $ 如何知道使用它而不是 1.2 的 $?
  • @Shaunak:我希望它支持一堆库,而不仅仅是 jQuery。不过,noConflict() 函数很有趣。谢谢!

标签: javascript dependencies amd yui3


【解决方案1】:

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

YUI 加载器允许加载多个版本的 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 事件的回调中,通过调用YUI.add() 将加载的模块添加到YUI 实例中,即Y。提供给YUI.add() 回调的Y 参数与您将在YUI().use() 的回调中获得的参数相同。

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

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

第二个有点遥远,解释太长了。由于它可能根本不会发生,让我们稍后再说吧。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 2011-05-02
    • 1970-01-01
    • 2012-05-17
    相关资源
    最近更新 更多