RequireJ определяет deps по умолчанию

обычно модуль requirejs выглядит так:

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

});

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

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

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

Это возможно?

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


person dev.pus    schedule 07.07.2012    source источник


Ответы (1)


Интересующие вас модули должны быть прикреплены к внешней области. По умолчанию Backbone, Underscore, 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:

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

person Steve McGuire    schedule 07.07.2012
comment
Привет, не могли бы вы привести пример лучшей альтернативы? Или загруженный модуль возвращает только объект/массив всех зависимостей? - person dev.pus; 07.07.2012