Когда я должен использовать require () и когда использовать define ()?


316

Последние несколько дней я играюсь с requirejs. Я пытаюсь понять разницу между определением и требованием.

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

Могут ли эти два быть использованы вместе и для каких целей должен использоваться каждый из них?

Ответы:


331

Когда defineвы регистрируете модуль в require.js, от которого вы можете зависеть в определениях других модулей или в операторах require. С requireвами «просто» загрузить / использовать модуль или файл javascript, который можно загрузить с помощью require.js. Для примеров посмотрите на документацию

Мое эмпирическое правило:

  • Определите: если вы хотите объявить модуль, от которого будут зависеть другие части вашего приложения.

  • Требуется: если вы просто хотите загружать и использовать вещи.


331

Из исходного кода require.js (строка 1902):

/**
 * The function that handles definitions of modules. Differs from
 * require() in that a string for the module should be the first argument,
 * and the function to execute after dependencies are loaded should
 * return a value to define the module corresponding to the first argument's
 * name.
 */

define()Функция принимает два дополнительных параметра (строки , которые представляют собой идентификатор модуля и массив необходимых модулей) и один необходимый параметр (метод фабрики).

Возвращение фабричного метода ДОЛЖНО возвращать реализацию для вашего модуля (так же, как это делает Шаблон модуля ).

require()Функция не должна возвращать реализацию нового модуля.

Используя, define()вы спрашиваете что-то вроде: «запустите функцию, которую я передаю в качестве параметра, и присвойте все, что возвращает идентификатору, который я передаю, но перед этим проверьте, загружены ли эти зависимости» .

Если require()вы говорите что-то вроде «функция, которую я передаю, имеет следующие зависимости, проверьте, загружены ли эти зависимости перед ее запуском» .

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


2
Есть ли разница в том, используется ли require внутри модуля define'd или вне его? Если он используется внутри модуля, почему бы просто не установить требования в определении модуля, а не использовать require?
Петри

Почему этот ответ так отличается от того, что я прочитал здесь requirejs.org/docs/api.html#deffunc ??
Джеймс Лин,

2
@Petri, похоже, вы наблюдаете поведение RequireJS версии 2 при загрузке модулей асинхронно. «RequireJS 2.0 не будет выполнять заводскую функцию модуля (переданную функцию define()) до тех пор, пока не будет вызван require([])запрос, или что-то, что зависит от него». github.com/jrburke/requirejs/wiki/...
alxndr

2

метод define для облегчения определения модуля и метод require для обработки загрузки зависимостей

define используется для определения именованных или безымянных модулей на основе предложения с использованием следующей подписи:

define(
module_id /*optional*/, 
[dependencies] /*optional*/, 
definition function /*function for instantiating the module or object*/
);

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

Обратитесь к https://addyosmani.com/writing-modular-js/ для получения дополнительной информации.


2

Основные правила:

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

  2. Вы используете требование просто загрузить зависимость

    //sample1.js file : module definition 
    define(function() {
          var sample1 = {};
          //do your stuff
         return sample1;
     });
    
    //sample2.js file : module definition and also has a dependency on jQuery and sample1.js
    define(['jquery', 'sample1'], function($,sample1) {
        var sample2 = {
            getSample1:sample1.getSomeData();
        };
        var selectSomeElement = $('#someElementId');
        //do your stuff....
        return sample2;
    });
    
    //calling in any file (mainly in entry file)
    require(['sample2'], function(sample2) {
        // sample1 will be loaded also
    });
    

Надеюсь, это поможет вам.


1

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.