2011-12-02 6 views
44

Comencé a leer varios tutoriales sobre RequireJS. En ninguno de ellos fue la palabra clave "definir" explicada satisfactoriamente para mí. ¿Alguien podría ayudarme con esto?Explicación de la definición de la biblioteca RequireJS

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? ¿Puede alguien darme más información sobre este tipo de definiciones?

Adición: Gracias nnnnnn y pradeek por sus respuestas. Aquí en Europa eran las 2:30 de la noche cuando estaba publicando la pregunta. Tal vez, por lo tanto, no reconocí que era una simple llamada a la función.

Respuesta

57

define no es específico de RequireJS, es parte de AMD specification. Burke observará que RequireJS no implementa exactamente cómo AMD lo especifica, ya que AMD realmente no tenía en mente a los navegadores.

define no tiene una función anónima. define es un método disponible para los 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 es valiosa para usted. Así que voy a repasar el que usted proporcionó, ya que es la forma más común de declarar un módulo.

define([array], object);

matriz es una lista de los módulos que este módulo depende. Hay una relación de 1 a 1 entre módulos y archivos. No puede tener múltiples módulos en un archivo ni múltiples archivos para un solo módulo.

Objeto es el módulo que está definiendo. Esto puede ser cualquier cosa, una estructura o una función que devuelve una estructura. Lea los documentos en RequireJS para obtener más detalles.

Si objeto es una función, los argumentos pasados ​​a la función son los módulos listados como dependencias en el primer argumento de definición. También es importante tener en cuenta que cuando pasa una función como object, solo se ejecutará una vez. Sin embargo, se puede acceder en cualquier momento a los métodos o propiedades creados en esta creación de instancias, a los que pueden acceder 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 tienen sentido. Los documentos RequireJS son excelentes como un comienzo rápido sobre cómo funcionan los módulos AMD.

1

Encontré esta página Why AMD? muy útil. Para resumir desde esta página, la especificación de AMD es útil para superar el problema de "escribir un montón de etiquetas de script con dependencias implícitas que debe realizar 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 de contaminación del espacio de nombres global. Consulte la sección "It is an improvement over the web's current "globals and script tags" because".

5

Encontré define definido cerca de la parte inferior de require.js (yo también se preguntaba qué clase de cosa que esta palabra define es, y esta es la respuesta I 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]); 
}; 
0

Creo que el RequireJs API specification 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 formas sintácticas de define.

Cuestiones relacionadas