加载两个版本的jquery,一个带有require,一个只是常规的旧头

时间:2014-01-25 01:29:22

标签: jquery backbone.js requirejs marionette

我正在开发一个拥有大量遗留代码的大型网站。内联脚本,旧库等等。这是我无法删除的东西,因为它被用在许多页面上,但我们正朝着一个新的方向前进。需要,牵线木偶和骨干。我不能只用我们的数千行代码重构它们。反正不是马上。所以,与此同时,我们将拥有一个双头怪物。遗留代码的方式,骨干中的新代码,木偶,requirejs应用程序。

我的问题是在我当前的,非常基本的,基于requirejs的设置中加载jquery。我有jquery v1.9.1填充在require之前加载,但它似乎与从头部加载的不同版本的jquery(1.7.2)有某种冲突。在整个网站上,附加到旧版本jquery的所有功能(例如基于twitter引导程序jquery的插件等)似乎被我正在加载的jquery版本消除了。我的猜测是垫片,它在任何基于需求的代码之前加载jquery,据我所知,无论如何,它正在杀死我的旧jquery对象。

我该如何避免这种情况?如何将我的新版本的jquery包含在require.js对象中,而不是让它干扰旧的遗留代码?

非常感谢你。如果被要求可以提供代码详细信息,但我希望我在这里尝试做的概念足够清楚。

2 个答案:

答案 0 :(得分:0)

您是否尝试过jQuery.noConflict ...

<script src='jquery-1.3.2.js'></script>
<script>
var jq132 = jQuery.noConflict();
</script>
<script src='jquery-1.4.2.js'></script>
<script>
var jq142 = jQuery.noConflict();
</script>

答案 1 :(得分:0)

RequireJS的网站documents是一个配置jQuery以加载noConflict的方法。即使您没有使用"jquery",此方法也允许您像往常一样要求jQuery noConflict。配置如下(直接引用文档):

require.config({
    // Add this map config in addition to any baseUrl or
    // paths config you may already have in the project.
    map: {
      // '*' means all modules will get 'jquery-private'
      // for their 'jquery' dependency.
      '*': { 'jquery': 'jquery-private' },

      // 'jquery-private' wants the real jQuery module
      // though. If this line was not here, there would
      // be an unresolvable cyclic dependency.
      'jquery-private': { 'jquery': 'jquery' }
    }
});

jquery-private模块如下(也直接引自文档):

// and the 'jquery-private' module, in the
// jquery-private.js file:
define(['jquery'], function (jq) {
    return jq.noConflict( true );
});

以这种方式加载,你要求RequireJS加载的jQuery版本不应该干扰之前加载的任何其他jQuery版本。

但是,有一个重要的问题:RequireJS加载的任何东西以及需要访问RequireJS加载的jQuery版本的东西都必须是AMD模块(即它必须使用define并在其中列出"jquery"依赖)。否则,它将使用在RequireJS之前加载的jQuery版本。虽然只加载了一个版本的jQuery,但你可以在RequireJS配置中使用shim来加载这样的软件,如果使用上面的方法,垫片不会在这里删除它。

例如,Backbone中的这个line存在问题:

Backbone.$ = root.jQuery || root.Zepto || root.ender || root.$;

因此,您必须修改Backbone以将自己定义为AMD模块或找到某人已经打包的版本。 (就像那个here。)