私たちのプロジェクトは、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 プラグイン 詳細を調べて、解決策が見つかったらここに投稿します。