我们的项目是一个非常庞大的单页企业应用程序,基于 RequireJS 和 Backbone.js,对于一些复杂的 UI,我们使用jqWidgets。
特别是,这些 jqWidgets 是导致我们问题的原因。使用旧的 jqWidgets 3.3 实现了许多应用程序功能,对于所有新功能,我们希望使用 3.6,但是将旧功能移植到 3.6 非常棘手,并且会花费我们目前没有的时间。
为了节省这段时间,我们想要做的是让 3.3 和 3.6 一起工作而不会产生任何问题,并在以后有可能的情况下进行移植部分。
到目前为止我已经尝试过:
requirejs.config({
paths: {
"jquery": "vendor/jquery",
"jqx": "vendor/jqwidgets/3.3",
"jqx3.6": "vendor/jqwidgets/3.6",
... other libs...
},
shim: {
... other shims ...
// jqWidgets3.3
"jqx/jqxcore": {
deps: ["jquery"]
},
"jqx/<<some_plugin>>": {
deps: ["jqx/jqxcore"],
exports: "$.fn.<<some_plugin>>"
},
// jqWidgets3.6
"jqx3.6/jqxcore": {
deps: ["jquery"]
},
"jqx3.6/<<some_plugin>>": {
deps: ["jqx3.6/jqxcore"],
exports: "$.fn.<<some_plugin>>"
},
}
});
旧功能中的用法:
require(["jquery", "jqx/<<some_plugin>>"], function($) {
$('<<some_selector>>').<<some_plugin>>(...options...);
});
新功能中的用法:
require(["jquery", "jqx3.6/<<some_plugin>>"], function($) {
$('<<some_selector>>').<<some_plugin>>(...options...);
});
由于这两个插件都应用于相同的 jQuery 对象,因此使用不同的名称/路径引用它们是可行的,但会产生很多错误。示例:如果您在应用程序中使用的第一个功能是使用 jqWidgets 3.3 加载的,那么使用 3.6 的下一个使用的功能可能会损坏,反之亦然。仅当您在每次使用功能后刷新页面时它才有效——这有点毫无意义,因为它是单页应用程序。
所以我的问题是:是否有可能让 jqWidgets 3.3 和 3.6 一起工作,然后依赖他们自己的 jQuery 对象,这样就不会发生这种冲突?
// 附录 1:我认为潜在的解决方案在于对这个问题的评论:RequireJS - 具有多个 jQuery 版本的 jQuery 插件 如果我找到一个解决方案,我会仔细查看并在此处发布一个解决方案。