Именование модулей в RequireJS

Мы можем использовать совместимые с AMD версии BackboneJS и UnderscoreJS.

Я просмотрел совместимую с AMD библиотеку для обоих (https://github.com/amdjs/) и ниже приведен соответствующий код, чтобы сделать их совместимыми с AMD.

BackboneJS (АМД);

else if (typeof define === 'function' && define.amd) {
// AMD
define(['underscore', 'jquery', 'exports'], function(_, $, exports) {
// Export global even in AMD case in case this script is loaded with
// others that may still expect a global Backbone.
root.Backbone = factory(root, exports, _, $);
});

UnderscoreJS (АМД);

 // AMD define happens at the end for compatibility with AMD loaders
// that don't enforce next-turn semantics on modules.
if (typeof define === 'function' && define.amd) {
define('underscore', function() {
return _;
});
}

Теперь, чтобы использовать эти совместимые с AMD библиотеки в нашем коде, мы говорим;

requirejs.config({
    enforceDefine: true,
    paths: {
        "jquery": "libs/jquery-1.8.3",
        "underscore": "libs/underscore-amd",
        "backbone": "libs/backbone-amd"
    }
});

Теперь я прочитал, что имя для магистрального модуля может быть любым, но имя для подчеркивания должно быть «подчеркивание», а для подчеркивания важна заглавная буква.

Почему разница основана на том, как определена библиотека?


person copenndthagen    schedule 04.11.2014    source источник


Ответы (1)


Функцию define можно вызывать как с именем определяемого модуля, так и без него. Этот вызов не имеет имени модуля. Он начинается с массива зависимостей:

define(['underscore', 'jquery', 'exports'], function(_, $, exports) {

RequireJS назначит имя модуля на основе базового имени файла, в котором появляется define, или на основе имени, которое вы указали в конфигурации paths. Вы можете поставить paths: { platypus: '... path to file' } и ваш модуль будет называться platypus.

Этот вызов имеет имя модуля:

define('underscore', function() {

Он называет модуль как underscore. (Первый аргумент не является массивом, поэтому RequireJS интерпретирует его как имя модуля.) И когда имя установлено с помощью define, оно никогда не меняется. Поэтому, когда вы ставите его как зависимость, он должен называться underscore. (Вы можете использовать map в конфигурации RequireJS, чтобы переназначить имя, но в конечном итоге имя модуля будет исправлено на underscore.) Если вы попробуете приведенный выше пример platypus с этим модулем, RequireJS выдаст ошибку, потому что он найдет модуль с именем underscore, но не найдет его. по имени platypus.

Указание имен модулей в вызовах define без явной и существенной причины для этого является плохой практикой. Документация для RequireJS рекомендует этого не делать:

Эти [т.е. имена модулей] обычно генерируются инструментом оптимизации. Вы можете сами явно называть модули, но это делает модули менее переносимыми — если вы переместите файл в другой каталог, вам нужно будет изменить имя. Обычно лучше избегать кодирования имени модуля и просто позволить инструменту оптимизации записать имена модулей. Инструменту оптимизации необходимо добавить имена, чтобы в файл можно было объединить более одного модуля, чтобы обеспечить более быструю загрузку в браузере.

person Louis    schedule 04.11.2014
comment
Итак, если я правильно понимаю, порядок/последовательность таковы... если имя модуля не определено внутри модуля через define() (скажем, магистраль)... тогда оно называется в соответствии с тем, что определено в путях (при выполнении требуютjs.config()) - person copenndthagen; 05.11.2014