0

修正できないスコープ (グローバル変数/名前空間) に問題があります。問題は、Require.js を使用して新しい機能を追加したプロジェクトに、いくつかのレガシー コードがあることです。このレガシー コードは標準<script>タグを使用して読み込まれますが、新しいコードは Require. Ractive.js を Require に AMD として追加すると、問題が発生します。レガシー コードは Prototype.js をロードするため、Ractive.js と衝突します。

主な問題は、配列の変更を観察するときです。具体的には、パターンオブザーバーで配列を観察すると。

ractive.observe('dataArray.*', function(newValue, oldValue, keypath) { alert(' status changed from ' + oldValue + ' to ' + newValue); }, {debug: true, init: false});

オブザーバーを配列に追加しないと、すべてが機能しますが、追加すると、undefined is not a functionprototype.js でエラーが発生します (これは、prototype.js をグローバルから削除すると発生しません)。

もう1つのこれは、パターンオブザーバーを使用しない場合に実際に機能することです。

それで、私の質問は、Require.js を構成して、AMD-s としてロードされたスクリプトのみを使用する方法はありますか? または、言い換えると、グローバル スクリプトを無視するように、AMD スクリプトの範囲を互いにのみに制限しますか?

前もって感謝します。

4

1 に答える 1

1

古いバージョンの Prototype.js をページに追加することで、同様のエラーを作成できました。Prototype.js が非標準のメソッドをArray.prototype(とりわけ) に追加するためだと思われます。これは、大規模なコードベースでこの種の衝突がかなり起こりやすくなるため、一般的に悪いことと見なされます。

Array.prototype.map具体的には、エラーは、パターン オブザーバーを処理するときにRactive が文字列を呼び出すことでした。関数は ES5 では標準ですが、古いブラウザー (IE8 など) では標準ではmapないため、Prototype はポリフィルを追加しますが、古いバージョンの Prototype では壊れたポリフィルです。その壊れたポリフィルは、エラーではなく文字列で呼び出すとエラーをスローします (独自のthis.each()メソッドを使用するため) - ES5 では珍しいが完全に受け入れられる操作です。

幸いなことに、Prototype の最近のバージョンは同じように壊れていないようです。1.6.1 (2009 年以降のドキュメント サイトのバージョン) でエラーを再現できましたが、最新の 1.7.2 バージョンでは再現できませんでした。

したがって、次の 2 つのオプションがあります。

  • プロトタイプを最新バージョンにアップグレードする
  • Prototype がロードされたら、壊れたmap()メソッドをオーバーライドします。MDN からこのポリフィルを使用できます(チェックを省略してif (!Array.prototype.map){...}ください)。

これらのうち、2 番目は、Prototype に依存するコードを壊す可能性が最も低いでしょう。

于 2014-05-01T21:18:04.103 に答える