Разница между require() и define() в RequireJS?

В RequireJS, в чем основная разница между использованием require() и define();

require(['a'], function(a) {
    // some code
});

// A.js
define(['b','c','d','e'], function() {
    //some code
});

Любые варианты использования были бы очень полезны.


person copenndthagen    schedule 30.08.2013    source источник
comment
См. stackoverflow.com/questions/9507606/   -  person Mark Meyer    schedule 30.08.2013
comment
Это это дубликат, но здесь объяснение должно быть дано с точки зрения примера.   -  person z--    schedule 30.08.2013


Ответы (5)


Одно основное отличие, которое раздражало меня в начале использования, заключалось в том, что define может никогда не вызываться.

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

Определите: если вам нужен XXX, сначала загрузите эти другие вещи, а затем верните результат этой функции.

Требовать: Загрузите эти другие вещи, затем запустите эту функцию. (без "если")

Пример. Допустим, вы включили этот JS-файл на свою страницу:

// this is in company/welcomepage.js
define(['company/ui_library'],
    function(uiLib) {
        console.log('Welcome to {company}!');
    }
);

Если это единственный файл Javascript, вы можете открыть свою страницу, и в журнале консоли ничего не будет, несмотря на то, что скрипт говорит приветствовать пользователя. Однако это изменится, если где-то на странице или в другом скрипте вы вставите следующее:

require(['company/welcomepage'], function() {
    // optionally insert some other page-initialization logic here
});

Теперь страница будет отображать приветственное сообщение в консоли при загрузке.

Фактически, при наличии второго тега не было бы необходимости вручную включать welcomepage.js в качестве тега <script>; он загрузит его из своего местоположения, как только увидит запрос и поймет, что он ему нужен.

person Katana314    schedule 30.08.2013
comment
Спасибо за ваш ответ... Не могли бы вы привести базовый пример... - person copenndthagen; 02.09.2013
comment
@Katana314...не могли бы вы уточнить... - person copenndthagen; 03.09.2013
comment
@testndtv Добавлен пример; Надеюсь, поможет. - person Katana314; 03.09.2013
comment
Небольшой момент: поскольку /company/welcomepage.js объявляет зависимость от 'company/ui_library', будет загружен файл /company/company/ui_library.js -- это то, что вы хотели? - person Don Hatch; 12.02.2017
comment
Возникли проблемы с воспроизведением. Если это единственный файл Javascript, ... в журнале консоли в chrome 57.0.2987.37 ничего не будет, requirejs 2.3.2. Очевидно, что это не может быть единственный файл javascript; вам нужен require.js. Если мой html говорит <script src="require.js"></script><script src="company/welcomepage.js"></script>, я получаю Uncaught Error: Mismatched anonymous define() module: function (uiLib) { console.log('Welcome to {company}!'); }. Если мой html говорит <script data-main="company/welcomepage.js" src="require.js"></script>, я получаю консольное сообщение. Можете ли вы привести полный пример? - person Don Hatch; 12.02.2017
comment
@DonHatch Первый пункт: AMD можно настроить либо всегда начинать с определенного корневого пути, либо распознавать определенное имя папки как имеющее определенный дом (например, jquery находится в apis.google.com/cdn/jquery). Во втором примере: у меня эта ошибка не возникала при тестировании с requirejs 2.1.5 или в Dojo. Если вы правы, возможно, с тех пор его поведение изменилось; возможно, как способ помочь людям выявить такие проблемы на ранней стадии, прежде чем они будут сбиты с толку. В вашем третьем примере (data-main) явно требуется файл, и поэтому он решает его запустить. - person Katana314; 14.02.2017

require и requirejs одинаковы.

require === requirejs // true

require — это способ загрузки определенного модуля. Например, чтобы загрузить модуль logger, я мог бы сделать:

require(["logger"], function(logger){
  logger.bla("S");
});

Здесь я вызываю require, указываю уже определенный модуль с именем logger и использую его, вызывая его метод bla.

define — это способ определения модуля. Например, чтобы определить модуль logger, я мог бы сделать:

// logger.js
define(function(){
  return {
    bla: function(x){
      alert(x);
    }
  }
});

Здесь я вызвал define и определил модуль logger. в этом модуле я вернул функцию bla, которую хочу раскрыть.

Иногда define очень похожа на exports, потому что define также может зависеть и использовать другие модули точно так же, как require может использовать другие модули. Позвольте мне показать вам тот же модуль logger, на этот раз с использованием модуля

// logger.js
define(["popup"], function(popup){
  return {
    bla: function(x){
      popup.show(x);
    }
  }
});

Здесь модуль регистратора I defined также имеет зависимость с именем popup, поэтому он выглядит как require.

person user566245    schedule 03.07.2015
comment
нигде, кроме вашего комментария, не говорится «логгер» - так что же определяет его как модуль «логгер»? Комментарий или имя файла? - person Scott; 09.07.2018
comment
Отличный ответ. Я кодил на Javascript пару лет и всегда находил его запутанным по сравнению с Java для объектно-ориентированного программирования. Ваш ответ краток, и это именно то, что мне нужно было услышать, чтобы прояснить использование requireJS для модулей (вместо обычного необработанного способа немедленного вызова функций) - person kiwicomb123; 26.08.2018

Я считаю, что вы всегда используете определение для своих определений модулей. Для этого у вас есть несколько вариантов, вы можете определить модуль с его зависимостями в массиве в качестве первого аргумента для определения (как в опубликованном вами примере).

Или вы можете использовать упрощенную оболочку CommonJS, например:

define(function (require) {
    var otherModule = require('otherModule');
    return function () {
        return otherModule.operation();
    };
});

Возможно, вы перепутали формат зависимости службы JSONP, который использует require() для загрузки службу, а затем укажите define() в качестве обратного вызова JSONP, который в конечном итоге определит модуль после ответа службы.

Итак, в конце концов, вы используете define() для определения модулей и require() для их загрузки.

person Joni Bekenstein    schedule 30.08.2013

define — это то, как мы объявляем модуль в соответствии с форматом модуля AMD (существуют и другие доступные форматы модуля, такие как CommonJS, ES2015< /em>, System.register, UMD)

в то время как ..

require – это конструкция загрузки модуля, доступная с такими загрузчиками модулей, как RequireJs, SystemJS, встроенный загрузчик модулей Node. . Он используется, когда вы хотите использовать модуль, определенный в одном из вышеуказанных форматов модулей.

person Rajdeep Sharma    schedule 03.09.2017

require() и define() используются для загрузки зависимостей. Между этими двумя методами есть большая разница.

Это очень простые ребята

Require(): метод используется для запуска немедленных функций. define(): метод используется для определения модулей для использования в нескольких местах (повторное использование).

person Baalu    schedule 09.10.2016