2013-06-28 3 views
49

Для модулей я не возвращаю объект, который я использовал, вместо определения. Например у меня есть следующий JQuery плагин (jquery.my-plugin.js):RequireJs - Определить vs Требовать

require(['jquery'], function($) { 
    $.fn.myPlugin = function(options) { 
     ... 
    }; 
}); 

Теперь, если я скажу следующее в другом модуле:

require(['jquery', 'jquery.my-plugin'], function($) { 
    $('#element').myPlugin(); 
}); 

Я нашел это Безразлично» т, потому что myPlugin не был зарегистрирован. Однако, если я изменяю требование на определение в моем модуле jquery.my-plugin, тогда он отлично работает.

Я был бы признателен, если бы кто-нибудь мог понять, почему я должен это делать. Мне нравится понимать что-то полностью, прежде чем я начну использовать его. Спасибо

+2

возможно дубликат [если использовать требуют и когда use define] (http://stackoverflow.com/questions/9507606/when-to-use-require-and-when-to-use-define) – Armand

ответ

90

По существу, когда вы используете require, вы говорите: «Я хочу этого, но я тоже хочу, чтобы все его зависимости». Поэтому в приведенном ниже примере нам требуется A, но для этого требуется поиск всех зависимостей и их загрузка перед продолжением.

require(['a'], function(a) { 
    // b, c, d, e will be loaded 
}); 

// File A 
define(['b','c','d','e'], function() { 
    return this; 
}); 

Общее правило заключается в использовании define, когда вы хотите, чтобы определить модуль, который будет повторно использоваться вашим приложением, и вы используете require просто загрузить зависимость.

+2

Гораздо лучше сказано, чем моя :) Удалит мою. – oooyaya

+0

Спасибо, но почему я не могу использовать require вместо define для File A? По существу, это будет делать то же самое, что для файла A требуется b, c, d и e, прежде чем он сможет выполнить. – nfplee

+51

Общее правило большого пальца - вы используете 'define', когда хотите определить модуль, который будет повторно использоваться вашим приложением, и вы используете' require' для просто загрузки зависимости. –

2

Ниже приведен код, который должен быть внутри jquery.my-plugin.js, который определяет модуль под названием «jquery.my-плагин», который может быть использован в качестве зависимости в другом месте.

define(['jquery'], function($) { //jquery is a dependency to the jquery.my-plugin module 
    $.fn.myPlugin = function(options) { //adds a function to the *global* jQuery object, $ (global since jQuery does not follow AMD) 
     ... 
    }; 
}); 

Ниже приведен фрагмент кода, где вы хотите, чтобы прикрепить функцию плагина к глобальному объекту JQuery, а затем использовать его ...

require(['jquery.my-plugin'], function() { // jquery.my-plugin is loaded which attaches the plugin to the global JQuery object as shown above, then this function fires 

    //the only reason $ is visible here is because it's global. If it was a module, you would need to include it as a dependency in the above require statement 
    $('#element').myPlugin(); //the $ refers to the global object that has the plugin attached 
}); 
+1

Все выглядит хорошо со мной. Да, объект $ определяется глобально, поэтому я предполагаю, что необязательно включать его в запрос require.Поступая таким образом, вы избегаете потенциальных проблем с конфликтующими библиотеками и согласуетесь с вышеприведенным утверждением. – nfplee