1

を使用/ロードしようとしてUnderscoreJS 1.7.0いますRequireJS 2.1.14-3。私のアプリケーションの起動時、UnderscoreJS は適切にロードされていますが、「未定義」です。以下の詳細を参照してください。

main.js

define(function() {
    // Configuration of RequireJS
    requirejs.config({
        enforceDefine : true,

        map : {
            '*': { 
                ...
                'underscore' : 'webjars/underscorejs/1.7.0/underscore'
            },
        },

        // The base URL is just the top-level directory where the files are stored
        baseUrl : './',

        // Kick-start the application by loading these files
        deps : [ 'MyPanel' ],
    });
});

それを使用するモジュール:

define(['ractive',
    'underscore',
    ...], 
    function(Ractive,
            _,
            ...){
var Foo = Ractive.extend({
    ...

    oninit: function(){
        var anArray = [1, 2, 3]
        _.each(anArray, function(item){
               ...
        })
    }
}

そしてブラウザコンソールの結果: ブラウザの結果

underscoreJS ファイルはブラウザーによって読み込まれます。

モジュールがロードされました

これは詳細である必要がありますが、Javascript依存関係をmavenと で管理しましたwebjars

では、なぜ私の_ undefinedですか?

4

1 に答える 1

1

Underscore 1.7.0 のソースを見ると、次のように登録されていることがわかります。

if (typeof define === 'function' && define.amd) {
    define('underscore', [], function() {
        return _;
    });
}

の最初の引数に注意してくださいdefine。これにより、モジュールの名前が としてハードコードされ'underscore'ます。

問題は、mapこのハードコーディングされた名前と互換性のない構成を使用していることです。あなたがすることは、RequireJS に「すべてのモジュール ( "*") で、そのモジュールが という名前のモジュールを必要とする場合、'underscore'代わりにその名前のモジュールを返してください」と伝えることです'webjars/underscorejs/1.7.0/underscore'。したがって、必要な場合'underscore'

  1. RequireJS は'webjars/underscorejs/1.7.0/underscore'代わりに指定されたモジュールを探します。

  2. このようなモジュール名のデフォルト パスを使用し、その場所でファイルを検索します。ファイルをロードして実行します。

  3. ただし、ファイルにはではなくdefineを定義する呼び出しが含まれています。そのため、RequireJS はリクエストを受け入れることができません。'underscore''webjars/underscorejs/1.7.0/underscore'

の代わりに、アンダースコアの構成をmap使用する必要があります。paths何かのようなもの:

paths : {
    'underscore' : 'webjars/underscorejs/1.7.0/underscore'
}

これは RequireJS に「'underscore'その場所で名前が付けられたモジュールが見つかる」などのことを伝えます'webjars/underscorejs/1.7.0/underscore'。これを使用すると、要求されたモジュールの名前と定義されたモジュールの名前が一致します。

于 2015-03-20T16:14:26.607 に答える