Помощью RequireJS определить депс по умолчанию


Обычно модуль requirejs выглядит следующим образом:

define('ModuleName', ['jquery', 'underscore', 'backbone'], function($, _, Backbone){

});

Поскольку каждый файл в моей установке требует подчеркивания и магистрали, я хотел бы иметь их автоматически доступными в модуле без необходимости определять их как зависимости.

Итак, что-то вроде:

define('ModuleName', ['jquery'], function($){
    $("div.someClass").addClass('hide'); // works
    var Model = Backbone.Model.extend(); // works too
});

Возможно ли это?

Если да, то как или какое ключевое слово я должен искать?

1 4

1 ответ:

Модули, которые вас интересуют, должны быть прикреплены к внешней области видимости. По умолчанию магистраль, подчеркивание, jQuery и т. д. остаются присоединенными к глобальной области, если вы не вызовете noConflict () на них (не все модули обеспечивают эту тонкость). Подключение модулей к глобальной области действия не является отличным решением, но позволит выполнить то, что вы просите, и в любом случае это поведение по умолчанию. Лучшей альтернативой было бы определить внешний модуль (или просто вызов require ()), который содержит те зависимости в дополнение к вашим именованным субмодулям. В противном случае, большая часть причин для использования RequireJS теряется.

Отредактировано, например:

require(['underscore', 'backbone'],
    function (_, Backbone) {
        define('ModuleName', ['jquery'], function($){
            $("div.someClass").addClass('hide'); // works
            var Model = Backbone.Model.extend(); // works too
         });

        //Other modules here, otherwise this is pointless too
    }
);

Даже это полезно только в том случае, если вы определяете несколько именованных модулей в одном файле. Лучшим решениемс моей точки зрения, к сожалению, является явный импорт ваших модулей и разрешение неявного именования модулей, но приведенный выше пример ближе всего к тому, что вы просите. Что касается неявных имен модулей, то из RequireJS api docs :

Вы можете явно назвать модули сами, но это делает модули менее портативный - если вы переместите файл в другой каталог, вы будете нужно сменить имя.