RequireJs - Определить vs Требовать
Для модулей я не возвращаю объект, который я использовал, вместо определения. Например, у меня есть следующий плагин jQuery (jquery.my-plugin.js):
require(['jquery'], function($) {
$.fn.myPlugin = function(options) {
...
};
});
Теперь, если я скажу следующее в другом модуле:
require(['jquery', 'jquery.my-plugin'], function($) {
$('#element').myPlugin();
});
Я нашел, что это не работает, потому что myPlugin не был зарегистрирован. Однако, если я изменяю требование к определению в моем модуле jquery.my-plugin, тогда он отлично работает.
Я был бы признателен, если бы кто-нибудь мог понять, почему я должен это делать. Мне нравится понимать что-то полностью, прежде чем я начну использовать его. Благодаря
Ответы
Ответ 1
По сути, когда вы используете 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
Ниже приведен код, который должен находиться внутри jquery.my-plugin.js, который определяет модуль под названием "jquery.my-plugin", который может использоваться как зависимость в другом месте.
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 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
});