我正在开发一个拥有大量遗留代码的大型网站。内联脚本,旧库等等。这是我无法删除的东西,因为它被用在许多页面上,但我们正朝着一个新的方向前进。需要,牵线木偶和骨干。我不能只用我们的数千行代码重构它们。反正不是马上。所以,与此同时,我们将拥有一个双头怪物。遗留代码的方式,骨干中的新代码,木偶,requirejs应用程序。
我的问题是在我当前的,非常基本的,基于requirejs的设置中加载jquery。我有jquery v1.9.1填充在require之前加载,但它似乎与从头部加载的不同版本的jquery(1.7.2)有某种冲突。在整个网站上,附加到旧版本jquery的所有功能(例如基于twitter引导程序jquery的插件等)似乎被我正在加载的jquery版本消除了。我的猜测是垫片,它在任何基于需求的代码之前加载jquery,据我所知,无论如何,它正在杀死我的旧jquery对象。
我该如何避免这种情况?如何将我的新版本的jquery包含在require.js对象中,而不是让它干扰旧的遗留代码?
非常感谢你。如果被要求可以提供代码详细信息,但我希望我在这里尝试做的概念足够清楚。
答案 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。)