2

RequireJS は、AMD をサポートしない従来の/レガシー ライブラリをロードするための shim 構成を提供します。シム構成により、前述のライブラリを変数にエクスポートできます。

'backbone' : {
            deps : ['underscore', 'jquery'],
            exports : 'Backbone'
}

上記のように、Backbone は AMD と互換性がないため、shim 構成を使用してライブラリを変数にエクスポートします。同様に、これは Underscore に対しても実行できます。

'underscore' : {
            exports : '_'
}

ただし、Underscore の shim 構成を指定しなくても、問題なく動作します。どのように ?誰かがこれについていくつかの洞察を与えることができますか?

4

2 に答える 2

3

Backbone にはアンダースコアの依存関係があります。この依存関係は、require や shim などで取得する必要はありません。
バックボーンは、アンダースコア ライブラリへのインターフェイスを含むグローバル名前空間に _ が存在することのみを期待します。

バックボーンが必要な場合、アプリ開発者として、shim オプションと deps プロパティを使用して依存関係を提供し、この特定のモジュールにすべての依存関係があることを伝えます。

exports プロパティは、backbone や _.

だからあなたの質問に答えるために。アンダースコアのシム構成を提供しない場合、次の行は失敗します。

var _ = require('underscore');

この場合、ローカル名前空間の変数 _ は未定義になり、バックボーンはグローバル名前空間の _ を使用します。

あなたの疑問に答えるために。バックボーンソースでどのように機能しますか。

// Require Underscore, if we're on the server, and it's not already present.
    var _ = root._;
    if (!_ && (typeof require !== 'undefined')) _ = require('underscore');

上記は、アンダースコアが必要なバックボーン ソースの抜粋です。上記のコメントから、これがサーバー側で必要であることは明らかです。ブラウザでウィンドウを参照するときのルート オブジェクト。したがって、最初のチェック "!_" は、ブラウザーの原因 _ が gloabl オブジェクト (別名ウィンドウ) で使用可能な場合に false を返します。そのため、require はブラウザーでは発生しません (アンダースコアが既に存在する場合)。

于 2013-05-03T09:28:53.290 に答える
2

アンダースコアがバックボーンで使用されるグローバル変数_を定義し、バックボーンのシム構成が依存関係を正しく設定するため、バックボーンの前にアンダースコアとjqueryがロードされるため、機能します。

ただし、アンダースコアのシム構成がなく、モジュールにインポートしようとすると機能しません。

define(['underscore'], function(_) {

})
于 2013-05-03T09:03:04.213 に答える