2013-12-12 3 views
2

Я пытаюсь начать работу с RequireJS, и я сталкиваюсь с раздражающей проблемой. , ,RequireJS - чувствительный к регистру jQuery?

require.config({ 
    baseUrl: 'app_content/scripts', 
    paths: { 
     // the left side is the module ID, 
     // the right side is the path to 
     // the jQuery file, relative to baseUrl. 
     // Also, the path should NOT include 
     // the '.js' file extension. This example 
     // is using jQuery 1.9.0 located at 
     // js/lib/jquery-1.9.0.js, relative to 
     // the HTML page. 
     'jQuery': 'lib/jQuery/jQuery-2.0.3' 
    } 
}); 

Это, с использованием верхнего регистра Q, не работает, но если я изменить его на jquery, что он делает. Кроме того, это верно в моих необходимых областях ...

<script type="text/javascript"> 
    require(["jQuery"], function ($) { 
     console.log($); 
    }); 
</script> 

Это возвращает undefined, но если я изменить все, чтобы прямо jquery, это работает.

Является ли это ожидаемым поведением, и есть ли что-нибудь, что я могу с этим поделать?

ответ

2

Да, jQuery определяет себя как «jquery», все строчные буквы. Это нормально.

Если открыть источник JQuery вы найдете:

// Register as a named AMD module, since jQuery can be concatenated with other 
// files that may use define, but not via a proper concatenation script that 
// understands anonymous AMD modules. A named AMD is safest and most robust 
// way to register. Lowercase jquery is used because AMD module names are 
// derived from file names, and jQuery is normally delivered in a lowercase 
// file name. Do this after creating the global so that if an AMD module wants 
// to call noConflict to hide this version of jQuery, it will work. 
if (typeof define === "function" && define.amd) { 
    define("jquery", [], function() { return jQuery; }); 
} 

Таким образом, вы должны относиться к нему как "jquery" везде в RequireJS вызовов. Проблема здесь в том, что define, который использует jQuery, - это "named define", что мы обычно не используем при создании модулей. Оптимизатор RequireJS добавляет эти имена для нас, когда мы запускаем его.

Во всяком случае, когда «под названием define» используется имя модуля устанавливается на имя, данное define, а не по именам файлов (как в противном случае тот случай, когда мы не используем именованный define).

Можно переименовать "jquery" в "jQuery", как это:

require.config({ 
    baseUrl: "./js", 
    paths: { 
     "jquery": "jquery-1.10.2" 
    } 
}); 

define("jQuery", ["jquery"], function ($) { 
    return $; 
}); 

require(["jQuery"], function ($) { 
    console.log($); 
    console.log($("body")[0]); 
}); 

Я использование версии define, которая принимает имя в качестве первого параметра. Полный пример here.

+0

Хотя это верно, оно не охватывает то, что изменяет конфигурацию данного RequireJS * появляется *, чтобы заставить его работать. – user2864740

+0

Путь другой: что препятствует использованию * альтернативного идентификатора модуля ('jQuery')? – user2864740

+0

Я обновил ответ. – Louis

Смежные вопросы