Pregunta

Empecé a leer varios tutoriales sobre RequireJS.En ninguno de ellos se me explicó satisfactoriamente la palabra clave "definir".Alguien podría ayudarme con lo siguiente:

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

¿Qué es "definir"?¿Se define una función con una matriz y una función anónima dentro de ella?¿O es otra cosa?¿Alguien puede darme más información sobre este tipo de definiciones?

Suma:Gracias nnnnnn y pradeek por sus respuestas.Aquí en Europa eran las 2:30 de la noche cuando estaba publicando la pregunta.Quizás por eso no reconocí que era una simple llamada a función.

¿Fue útil?

Solución

define no es específico de RequireJS, es parte del especificación AMD.Burke notará que RequireJS no implementa exactamente como lo especifica AMD, ya que AMD realmente no tuvo en cuenta los navegadores.

define no tiene una función anónima. define es un método disponible para archivos JavaScript basados ​​en AMD para cargar sus datos.Bibliotecas como RequireJS lo ponen a su disposición.La implementación específica probablemente no sea valiosa para usted.Así que repasaré el que proporcionaste, ya que es la forma más común de declarar un módulo.

define( [array], object );

Matriz es una lista de módulos de los que depende este módulo.Existe una relación de 1 a 1 entre módulos y archivos.No puede tener varios módulos en un archivo ni varios archivos para un módulo.

El objeto es el módulo que estás definiendo.Puede ser cualquier cosa, una estructura o una función que devuelva una estructura.Lea los documentos en RequerirJS para más detalles.

Si el objeto es una función, los argumentos pasados ​​a la función son los módulos enumerados como dependencias en el primer argumento definido.También es importante tener en cuenta que cuando pasas una función como object, sólo se ejecutará una vez.Sin embargo, se puede acceder a los métodos o propiedades creados en esta instanciación en cualquier momento y luego se puede acceder a ellos mediante otros módulos que enumeran este módulo como una dependencia.

Buena suerte, recomiendo jugar con esto y leer los documentos cuando las cosas no tengan sentido.Los documentos de RequireJS son excelentes como un comienzo rápido sobre cómo funcionan los módulos AMD.

Otros consejos

encontré define definido cerca del fondo de la necesidad.js (yo también me preguntaba qué tipo de cosa define La palabra es, y esta es la respuesta yo estaba buscando):

/**
 * 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]);
};

Encontré esta página ¿Por qué amd? muy útil. Para resumir de esta página, la especificación AMD es útil para superar "escribir un montón de etiquetas de script con dependencias implícitas que debe ordenar manualmente". Es útil para cargar las dependencias antes de ejecutar las funciones requeridas, similar a import En otros lenguajes de programación como Python. AMD también previene el problema global de contaminación del espacio de nombres. Controlar "It is an improvement over the web's current "globals and script tags" because" sección.

Pienso que el Especificación de API de requisitojs lo resume bastante bien:

Si el módulo tiene dependencias, el primer argumento debe ser una matriz de nombres de dependencia, y el segundo argumento debe ser una función de definición. Se llamará a la función para definir el módulo una vez que todas las dependencias se hayan cargado. La función debe devolver un objeto que define el módulo.

Enumeran ejemplos de todas las diversas formas sintácticas de define.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top