Подтвердить что ты не робот

Объяснение определения библиотеки RequireJS

Я начал читать несколько руководств о RequireJS. Ни в одном из них ключевое слово "define" не было удовлетворительно объяснено для меня. Может ли кто-нибудь помочь мне со следующим:

define(
  ["Models/Person", "Utils/random", "jquery"], 
  function (Person, randomUtility, $) {..}
)  

Что такое "определить"? Определяет функцию с массивом и анонимную функцию внутри? Или что-то еще? Может ли кто-нибудь дать мне больше информации об этих определениях?

Дополнение: Спасибо, nnnnnn и pradeek за ваши ответы. Здесь, в Европе, было 2:30 ночи, когда я отправлял вопрос. Может быть, поэтому я не узнал, что это был простой вызов функции.

4b9b3361

Ответ 1

define не является специфичным для RequireJS, он является частью спецификации AMD. Берк отметил, что RequireJS не реализует точно, как AMD указывает его, так как AMD действительно не учитывает браузеры.

define не имеет в нем анонимной функции. define - это метод, доступный для файлов JavaScript на базе AMD для загрузки их данных. Библиотеки, такие как RequireJS, делают это доступным для вас. Конкретная реализация, вероятно, не ценна для вас. Поэтому я рассмотрю тот, который вы предоставили, как наиболее распространенный способ объявить модуль.

define( [array], object );

Массив - это список модулей, от которых зависит этот модуль. Между модулями и файлами существует от 1 до 1. Вы не можете иметь несколько модулей в файле и несколько файлов для одного модуля.

Объект - это модуль, который вы определяете. Это может быть что угодно, структура или функция, которая возвращает структуру. Подробнее читайте в документах RequireJS.

Если объект является функцией, аргументы, переданные функции, являются модулями, перечисленными в качестве зависимостей в первом аргументе определения. Также важно отметить, что когда вы передаете функцию как object, она будет работать только один раз. Способы или свойства, созданные в этом экземпляре, могут быть доступны в любое время, но к ним могут быть доступны другие модули, которые перечисляют этот модуль как зависимость.

Удачи, я рекомендую поиграть с этим и прочитать документы, когда что-то не имеет смысла. Документы RequireJS отлично подходят для быстрого использования модулей AMD.

Ответ 2

Я нашел define, определенный в нижней части require.js(мне тоже было интересно, что это за слово define, и это тот ответ, который я искал):

/**
 * 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 = function (name, deps, callback) {
    var node, context;

    //Allow for anonymous modules
    if (typeof name !== 'string') {
        //Adjust args appropriately
        callback = deps;
        deps = name;
        name = null;
    }

    //This module may not have dependencies
    if (!isArray(deps)) {
        callback = deps;
        deps = null;
    }

    //If no name, and callback is a function, then figure out if it a
    //CommonJS thing with dependencies.
    if (!deps && isFunction(callback)) {
        deps = [];
        //Remove comments from the callback string,
        //look for require calls, and pull them into the dependencies,
        //but only if there are function args.
        if (callback.length) {
            callback
                .toString()
                .replace(commentRegExp, '')
                .replace(cjsRequireRegExp, function (match, dep) {
                    deps.push(dep);
                });

            //May be a CommonJS thing even without require calls, but still
            //could use exports, and module. Avoid doing exports and module
            //work though if it just needs require.
            //REQUIRES the function to expect the CommonJS variables in the
            //order listed below.
            deps = (callback.length === 1 ? ['require'] : ['require', 'exports', 'module']).concat(deps);
        }
    }

    //If in IE 6-8 and hit an anonymous define() call, do the interactive
    //work.
    if (useInteractive) {
        node = currentlyAddingScript || getInteractiveScript();
        if (node) {
            if (!name) {
                name = node.getAttribute('data-requiremodule');
            }
            context = contexts[node.getAttribute('data-requirecontext')];
        }
    }

    //Always save off evaluating the def call until the script onload handler.
    //This allows multiple modules to be in a file without prematurely
    //tracing dependencies, and allows for anonymous module support,
    //where the module name is not known until the script onload event
    //occurs. If no context, use the global queue, and get it processed
    //in the onscript load callback.
    (context ? context.defQueue : globalDefQueue).push([name, deps, callback]);
};

Ответ 3

Я нашел эту страницу Почему AMD? очень полезна. Чтобы обобщить эту страницу, спецификация AMD помогает преодолеть "написать кучу тегов script с неявными зависимостями, которые вы должны вручную заказать". Это полезно при загрузке зависимостей перед выполнением требуемых функций, аналогично import на других языках программирования, таких как python. AMD также предотвращает глобальную проблему загрязнения пространства имен. Отметьте раздел "It is an improvement over the web current "globals and script tags" because".

Ответ 4

Я думаю, что спецификация API требованийJJ хорошо подводит итог:

Если модуль имеет зависимости, первым аргументом должен быть массив имен зависимостей, а второй аргумент должен быть функцией определения. Функция будет вызываться для определения модуля после загрузки всех зависимостей. Функция должна возвращать объект, который определяет модуль.

Они перечисляют примеры всех различных синтаксических форм определений.