9

ページで require の複数のインスタンスをサポートする必要があると思いますが、それを実現するために 2 つの問題が発生しています。埋め込み可能なインタラクティブ オブジェクトを外部クライアント ページに提供するサービスに取り組んでいます。最上位の設計基準は、簡単に埋め込むことができること、クライアント環境に関する想定をできるだけ少なくすること、クライアント ページの js/css の世界でうまく機能することです。クライアントはスクリプト タグをページに追加してローダーをロードし、インライン スクリプトを使用して必要なコンテンツをロードします。

<script src="http://server.net/loader"></script> 
<script>               
       special_require(["loader"], function(loader) {
           loader.load({
               object: "objectname",
               target: "#where-i-want-it"
               // other config settings
           })
       })
   </script>

ローダーは、require.js ソースを無名関数内で実行して構成し、require と define を名前空間付きのグローバル変数としてエクスポートします (これらを special_require と special_define と呼びましょう)。次に、いくつかのモジュールが special_defined であり、「loader」で終了します。

// Using strategy 2 from http://requirejs.org/docs/faq-advanced.html#rename to 
// namespace require so it doesn't conflict with code on client sites.
;(function() {
    // Here, we use Jinja to drop in require.js, which will define itself in 
    // this non-global namespace.
    {% include 'loader/require.js' %}

    require.config({
        ...
    })
    window.special_require = require
    window.special_define = define
})()

special_define("loader", [...], function(...) { ... })

ほとんどの場合、これは非常にうまく機能します。私はクライアント ページで行われているすべての要求から完全に独立した要求を維持することができ、クライアントの js グローバル名前空間を軽く踏むことができます。しかし:

  1. クライアント ページがたまたま require をロードし、それを data-main 属性で呼び出している場合、require が表示され、baseUrl に対して data-main スクリプトをロードしようとすると、ロード エラーが発生します。require のソースを変更して、data-main 属性の検索を停止することができます。よりクリーンなソリューションはありますか?

  2. require コミュニティは、1 つのページに複数の require のインスタンスがあってはならないことを非常に明確にしています。require.js ソースは、それ自体の複製を避けるために最善を尽くしています。ですから、この道を進むことで、将来のトラブルに備えることになるのではないかと心配しています。そうは言っても、クライアントの require のインスタンスを (自分の読み込みコンテキストで) 使用する可能性については、さらに神経質になっています。Require 1.2、2.0、および 2.1 は互換性がなく、何を使用しているのかわかりません。私は、別の要件を実行することが理にかなっている異常な状況にあるのでしょうか? 私はトラブルに向かっていますか?require.js をロードして、可能であれば既存の require を延期できるようにする方法はありますか?

4

1 に答える 1

1

できると思います。例については、http: //requirejs.org/docs/api.html#multiversionを参照してください。

于 2013-10-14T15:21:59.800 に答える