Javascript 在Require.js中使用多个版本的jQuery
我有一种情况,我必须在同一个页面上运行两个版本的jQuery(基本上,有一个运行1.4.2的网站,我有一个运行需要1.8.2的脚本的bookmarklet,我知道这不是一个好主意,但我现在坚持使用它) 现有版本是1.4.2合一,需要的更新版本是1.8.2 我正在使用require.js,已经看过一篇帖子,但不太明白什么是最好的方式: 在我的例子中,我有一个模块main.js:Javascript 在Require.js中使用多个版本的jQuery,javascript,jquery,requirejs,Javascript,Jquery,Requirejs,我有一种情况,我必须在同一个页面上运行两个版本的jQuery(基本上,有一个运行1.4.2的网站,我有一个运行需要1.8.2的脚本的bookmarklet,我知道这不是一个好主意,但我现在坚持使用它) 现有版本是1.4.2合一,需要的更新版本是1.8.2 我正在使用require.js,已经看过一篇帖子,但不太明白什么是最好的方式: 在我的例子中,我有一个模块main.js: (function () { var root = this; require.config({ baseUr
(function () {
var root = this;
require.config({
baseUrl: "http://localhost:9185/scripts/app/"
});
define3rdPartyModules();
loadPluginsAndBoot();
function define3rdPartyModules() {
define('jquery', [], function () { return root.jQuery.noConflict(true); });
define('ko', [], function () { return root.ko; });
}
function loadPluginsAndBoot() {
requirejs([], boot);
}
function boot() {
require(['bootStrapper'], function (bs) { bs.run(); });
}
})();
然后是一些与此类似的其他模块:
define('bootStrapper', ['jquery', 'presenter', 'repository', 'dataPrimer'],
function ($, presenter, repository, dataPrimer) {
//some stuff here
我是requirejs新手,在使用1.4.2版加载main.js之前加载它,如下所示:
$.getScript("http://localhost:9185/bundles/jsextlibs?v=GOyDBs-sBDxGR5AV4_K-m- OK9DoE0LGrun5FMPyCO9M1", function () {
$.getScript("http://localhost:9185/Scripts/lib/require.js", function () {
$.getScript("http://localhost:9185/bundles/jsapplibs?v=9TJUN0_624zWYZKwRjap4691P170My5FUUmi8_fzagM1");
$.getScript("http://localhost:9185/Scripts/main.js");
});
});
有人能告诉我如何修改我的代码,使我的所有模块都能使用1.8.2版,而不会干扰1.4.2版上已经运行的代码吗
谢谢
戴维
以上是我在main.js中使用的内容。有关完整的实现细节,请参阅我在github中的实现
这里jquery.min是jquery版本1.x
而jquery.modern是jquery版本2.x
我使用了console.log。因此,请检查启用浏览器控制台的示例。以上答案基于Require.js的文档。所以我认为这一定是解决你的问题的办法
这是我的推荐信。
.我遇到了一个几乎相同的问题,我设法用与Ajeeb K.p类似的方法解决了这个问题,但有几个关键区别。(Ajeeb的过程实际上并不适合我,在使用jQuery CDN时总是失败) 本质上,我创建了2个require.config实例,每个实例在属性中定义了不同版本的jQuery(使用公共require.config对象保持干燥,我将每个特定实例合并到该对象中)。当调用任意一个require.config实例时(如RequireJSAPI所说的“传递给require”),回调函数中的代码将运行一个IIFE,该IIFE将jQuery.noConflict(true)作为$parameter接收。IIFE中运行的任何代码(包括模块require'd)都运行最初传递给require的require.config实例中定义的jQuery版本 代码如下:
/*
* For merging each separate require.config object with a "common RequireJS config
* properties" object. Meant to avoid e.g. baseUrl, common libs etc. between the 2
* (lodash cannot be used for this, as it's not yet loaded until all this completes)
*/
var mergeObjs = function mergeObjs(objIn1, objIn2) {
var conglomerateObj = {};
Object.keys(objIn1).forEach(function(item) {
conglomerateObj[item] = objIn1[item];
});
return (function mergeIn(o1, o2) {
Object.keys(o2).forEach(function(key) {
if (typeof o1[key] === 'undefined') {
o1[key] = o2[key];
} else if (typeof o1[key] === 'object' && typeof o2[key] === 'object') {
o1[key] = mergeIn(o1[key], o2[key]);
}
});
return o1;
}(conglomerateObj, objIn2));
};
// 'Common' RequireJS config properties object. Both config objects use these values.
var reqCommon = {
baseUrl: '../scripts',
paths: {
lodash: '../public/lodash/lodash',
bootstrap: '../public/bootstrap/js/bootstrap.min'
}
};
// RequireJS config properties object 1. Configures section run with it to use an
// older version of jQuery (1.11.3) loaded using a CDN, for use with Bootstrap.
var req1 = require.config(mergeObjs({
context: 'version1',
paths: { jquery: 'https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min' }
}, reqCommon));
// RequireJS config properties object 2. Configures section run with it to use a
// newer version of jQuery. Used for almost everything except Bootstrap.
var req2 = require.config(mergeObjs({
context: 'version2',
paths: { jquery: '../public/jquery' } //new, local version of jQuery
}, reqCommon));
//
// 1st require'd block; runs with req1 RequireJS properties object used & thus
// jQuery 1.11.3. Mainly for running Bootstrap.
//
req1(['lodash', 'jquery'], function(main, ta, _) {
// This IIFE is intended to load the older jQuery version in regardless of the presence of jQuery v2.1.4
(function($) {
console.log('1st block 1st section jQuery version: ' + $.fn.jquery);
//--> shows 1.11.3 as version
window.jQuery = this.jQuery = $; // needed - Bootstrap uses jQuery on the window object.
//Load Bootstrap after jQuery 1.11.3 confirmed loaded
req1(['bootstrap'], function(bootstrap) {
console.log("1st block 2nd section: bootstrap loaded!");
console.log("1st block 2nd section: jQuery version: " + $.fn.jquery);
//--> still shows 1.11.3, even though block 2 has usually run by now
});
}(jQuery.noConflict(true)));
});
//
// 2nd require'd block; runs with req2 RequireJS properties object used & thus
// jQuery 2.1.4. For almost everything except Bootstrap.
//
req2(['main', 'testaddedjsfile', 'lodash', 'jquery'], function(main, ta, _) {
//this IIFE keeps the newer jQuery version separated from the old version.
(function($) {
console.log('2nd block jQuery version: ' + $.fn.jquery);
//--> shows 2.1.4 as version
}(jQuery.noConflict(true)));
// the bind helps ensure calls to $ don't inadvertently call window.$. which will be occupy.
});
底部第一个和第二个所需区块中的IIFEs对于完成此项工作至关重要
在添加在我自己的文件中合并对象(函数mergeObjs)和默认对象的功能之前,我的require-config对象(req1和req2)变得重复和混乱
下面包含引导来证明这个概念:我使用的特定引导模板要求jQuery的旧版本出现在窗口对象上……而我在应用程序中的其余代码使用的是2.1.4
上面的设置允许引导程序和我自己的代码毫无问题地运行,每个块始终使用适当版本的jQuery,但有一个警告:第二个块无法显式调用window.$(无论如何,这是个糟糕的主意)
很抱歉长度太长-这是一个非常棘手的问题。请看一下jQuery.noConflict(),谢谢,我一直在努力解决require.js中的用法。请阅读此内容-我的问题中有此链接。我不能让它工作:(我认为使用垫片是一个解决方案。在我看来,这篇文章是你需要的。
/*
* For merging each separate require.config object with a "common RequireJS config
* properties" object. Meant to avoid e.g. baseUrl, common libs etc. between the 2
* (lodash cannot be used for this, as it's not yet loaded until all this completes)
*/
var mergeObjs = function mergeObjs(objIn1, objIn2) {
var conglomerateObj = {};
Object.keys(objIn1).forEach(function(item) {
conglomerateObj[item] = objIn1[item];
});
return (function mergeIn(o1, o2) {
Object.keys(o2).forEach(function(key) {
if (typeof o1[key] === 'undefined') {
o1[key] = o2[key];
} else if (typeof o1[key] === 'object' && typeof o2[key] === 'object') {
o1[key] = mergeIn(o1[key], o2[key]);
}
});
return o1;
}(conglomerateObj, objIn2));
};
// 'Common' RequireJS config properties object. Both config objects use these values.
var reqCommon = {
baseUrl: '../scripts',
paths: {
lodash: '../public/lodash/lodash',
bootstrap: '../public/bootstrap/js/bootstrap.min'
}
};
// RequireJS config properties object 1. Configures section run with it to use an
// older version of jQuery (1.11.3) loaded using a CDN, for use with Bootstrap.
var req1 = require.config(mergeObjs({
context: 'version1',
paths: { jquery: 'https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min' }
}, reqCommon));
// RequireJS config properties object 2. Configures section run with it to use a
// newer version of jQuery. Used for almost everything except Bootstrap.
var req2 = require.config(mergeObjs({
context: 'version2',
paths: { jquery: '../public/jquery' } //new, local version of jQuery
}, reqCommon));
//
// 1st require'd block; runs with req1 RequireJS properties object used & thus
// jQuery 1.11.3. Mainly for running Bootstrap.
//
req1(['lodash', 'jquery'], function(main, ta, _) {
// This IIFE is intended to load the older jQuery version in regardless of the presence of jQuery v2.1.4
(function($) {
console.log('1st block 1st section jQuery version: ' + $.fn.jquery);
//--> shows 1.11.3 as version
window.jQuery = this.jQuery = $; // needed - Bootstrap uses jQuery on the window object.
//Load Bootstrap after jQuery 1.11.3 confirmed loaded
req1(['bootstrap'], function(bootstrap) {
console.log("1st block 2nd section: bootstrap loaded!");
console.log("1st block 2nd section: jQuery version: " + $.fn.jquery);
//--> still shows 1.11.3, even though block 2 has usually run by now
});
}(jQuery.noConflict(true)));
});
//
// 2nd require'd block; runs with req2 RequireJS properties object used & thus
// jQuery 2.1.4. For almost everything except Bootstrap.
//
req2(['main', 'testaddedjsfile', 'lodash', 'jquery'], function(main, ta, _) {
//this IIFE keeps the newer jQuery version separated from the old version.
(function($) {
console.log('2nd block jQuery version: ' + $.fn.jquery);
//--> shows 2.1.4 as version
}(jQuery.noConflict(true)));
// the bind helps ensure calls to $ don't inadvertently call window.$. which will be occupy.
});