お客様の Web サイトに組み込む JavaScript プラグインを開発しました。私が作成したプラグインは、jQuery 1.8.2 と KnockoutJS v3.0.0 の 1 つの大きなパッケージとしてバンドルされ、クライアントに配信されるいくつかの外部ライブラリに依存しています。
プラグインはほとんどのサイトで正常に動作しますが、ホスト サイトが RequireJS を使用している場合、KnockoutJS が RequireJS の存在を自動的に検出して使用しようとするため、パッケージの読み込みに失敗します。スローされるエラーは次のとおりです。
Mismatched anonymous define() module
明らかに、RequireJS サイトでエラー メッセージの「説明」を見つけました。残念ながら、それを回避する方法がわかりません。KnockoutJS ライブラリのローカル コピーで、問題のある行を見つけました。
(function(factory) {
// Support three module loading scenarios
if (typeof require === 'function' && typeof exports === 'object' && typeof module === 'object') {
// [1] CommonJS/Node.js
var target = module['exports'] || exports; // module.exports is for Node.js
factory(target);
} else if (typeof define === 'function' && define['amd']) {
// [2] AMD anonymous module
define(['exports'], factory);
} else {
// [3] No module loader (plain <script> tag) - put directly in global namespace
factory(window['ko'] = {});
}
}
このファイルを手動で編集して、条件 [2] が実行されず、条件 [3] のみが実行されるようにすると、すべて正常に動作します。もちろん、これはやりたくありません。外部ライブラリを編集する必要があるためです。後でアップグレードできるように、外部ライブラリを元の状態に保ちたいと考えています。
これを機能させる方法があるかもしれないと感じていますが、RequireJS の仕組みがわかりません。明らかに、KnockoutJS は RequireJS とうまくやろうとしていますが、私の場合は失敗しています。この場合、RequireJS は存在しますが、KnockoutJS を使用する必要はありません。
これら 2 つのライブラリを並行して動作させるにはどうすればよいですか?
編集
自分のライブラリが読み込まれるタイミングと、ホスト サイトが既に読み込まれている他のすべてのライブラリを制御することはできません。実際、ほとんどの場合、私のプラグインが組み込まれます。それは、WordPress、Webs.com、Weebly などのひどい WYSIWYG プラットフォームを使用する Web 開発経験のない人によるものです。 body 要素のどこかに含まれている場合もあります。
また、明確にするために、私のライブラリは RequireJS を使用していません。私のライブラリを使用しようとしている顧客の 1 人が RequireJS を使用しており、私のライブラリが含まれると、KnockoutJS (私のライブラリにバンドルされていますが、まだホスト サイトにはありません) が例外をスローすることがあります。自分自身を RequireJS に登録します (または、少なくともそれは例外に関する私の推測です)。
原則として、コードが依存するライブラリをオンデマンドでロードすることに反対しているわけではありませんが、実際には、ライブラリをロードするために追加の要求/応答サイクルが必要になるため、ユーザーのエクスペリエンスが遅くなります。