100

here APIからrequirejsドキュメントを読みました

requirejs.config({
    shim: {
        'backbone': {
            //These script dependencies should be loaded before loading
            //backbone.js
            deps: ['underscore', 'jquery'],
            //Once loaded, use the global 'Backbone' as the
            //module value.
            exports: 'Backbone'
        },
        'underscore': {
            exports: '_'
        },
        'foo': {
            deps: ['bar'],
            exports: 'Foo',
            init: function (bar) {
                //Using a function allows you to call noConflict for
                //libraries that support it, and do other cleanup.
                //However, plugins for those libraries may still want
                //a global. "this" for the function will be the global
                //object. The dependencies will be passed in as
                //function arguments. If this function returns a value,
                //then that value is used as the module export value
                //instead of the object found via the 'exports' string.
                return this.Foo.noConflict();
            }
        }
    }
});

しかし、私はシムの一部を取得していません。shim を使用する理由と設定方法を教えてください。

シムを使用する理由と時期を例を挙げて説明してください。ありがとう。

4

3 に答える 3

113

shim の主な用途は、AMD をサポートしていないライブラリですが、それらの依存関係を管理する必要があります。たとえば、上記の Backbone と Underscore の例では、Backbone には Underscore が必要であることがわかっているので、次のようにコードを記述したとします。

require(['underscore', 'backbone']
, function( Underscore, Backbone ) {

    // do something with Backbone

}

RequireJS は Underscore と Backbone の両方に対して非同期リクエストを開始しますが、どちらが最初に戻ってくるかはわかりません。そのため、Backbone が Underscore をロードする前に何かをしようとする可能性があります。

注:このアンダースコア/バックボーンの例は、両方のライブラリが AMD をサポートする前に作成されました。しかし、この原則は、AMD をサポートしていない今日のライブラリにも当てはまります。

「init」フックを使用すると、他の高度なことを実行できます。たとえば、ライブラリが通常は 2 つの異なるものをグローバル名前空間にエクスポートするが、それらを単一の名前空間で再定義したい場合などです。または、ロードしているライブラリのメソッドにモンキー パッチを適用したい場合もあります。

より多くの背景:

于 2013-03-18T20:50:55.753 に答える
-2

宣言するには、requirejs.config にパスを追加する必要があります。例:

requirejs.config({
    paths: {
          'underscore' : '.../example/XX.js' // your JavaScript file
          'jquery' : '.../example/jquery.js' // your JavaScript file
    }
    shim: {
        'backbone': {
            deps: ['underscore', 'jquery'],
            exports: 'Backbone'
        },
        'underscore': {
            exports: '_'
        },
        'foo': {
            deps: ['bar'],
            exports: 'Foo',
            init: function (bar) {
                return this.Foo.noConflict();
            }
        }
    }
});
于 2016-05-19T09:47:31.353 に答える