Con módulos AMD, ¿cuándo (o por qué) está bien usar requirir () dentro de Define ()?

StackOverflow https://stackoverflow.com/questions/7835116

  •  27-10-2019
  •  | 
  •  

Pregunta

Mi comprensión de los módulos AMD (usando, por ejemplo, requeríajs o curl.js) es:

require() se usa para cargar asincrónicamente diferentes módulos y cuando se carga, la devolución de llamada FN se ejecuta.

Y para definir un módulo, tendrías scripts separados que usan define()

Pero he visto usar algunos módulos require() Dentro de su definición de función, por ejemplo

define([a, b, c], function(i, ii, iii){ 
    require([d, e, f], function(d, e, f) {
        // do some stuff with these require()'d dependancies
    })
    /* rest of the code for this module */ 
}) 

Pero me parece confuso porque habría pensado que si un módulo tiene dependientes, entonces deberían pasar a través de la principal define([dependancies], fnDefinition) función y no dentro de ella a través de require() Según el ejemplo anterior está haciendo.

¿Hay algún razonamiento detrás de esto?

¿Fue útil?

Solución

Hay algunas razones por las que es posible que desee usar require() en un módulo.

Pero primero, asegúrese de solicitar una referencia al correcto require variable. En su ejemplo, la referencia a require es un global. Quieres una referencia a un require Eso se alcanza al contexto de su módulo (a veces llamado "Requerido local"). Esto es facil:

define(["a", "b", "c", "require"], function(i, ii, iii, require){ 
    require(["d", "e", "f"], function(moduleD, moduleE, moduleF) {
        // do some stuff with these require()'d dependencies
    })
    /* rest of the code for this module */ 
}); 

La razón principal por la que esto es importante es garantizar que las ID de módulo relativas (p. Ej. " (Esta es una de las razones, Curl.js no tiene un global require por defecto.)


Razones para usar un local require:

  1. No sabe qué módulos se necesitan en la hora de compilación (o en el tiempo de carga) debido a las condiciones de tiempo de ejecución
  2. Usted desea diferir explícitamente la carga de algunos módulos hasta que sean necesarios
  3. Desea cargar una variación de un módulo basado en los resultados de la detección de características (aunque algo como el complemento de Dojo "HS!" Podría ser una mejor solución (lo siento, el enlace que me elude)))

Por último, AMD define un segundo uso de require Para compatibilidad con módulos creados en los módulos CommonJS/1.1 que luego se envuelven en un define. Estos se ven así:

define(function(require, exports, module){ 
    var a = require("pkgZ/moduleA"), // dependency
        b = require("pkgZ/moduleB"); // dependency
    /* rest of the code for this module */ 
}); 

Los desarrolladores JavaScript del lado del servidor pueden encontrar este formato atractivo. :)

Algunos cargadores AMD (como RequestJS 0.2+, Dojo 1.7+, BDLOAD y Curl.js 0.6+) detectarán este formato AMD/CJSM1.1 híbrido y encontrarán dependencias escaneando el módulo para require llamadas.

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