library - requirejs example
Con los módulos de AMD, ¿cuándo(o por qué) está bien utilizar require() dentro de define()? (1)
Hay algunas razones por las que puede querer usar require()
en un módulo.
Pero primero, asegúrese de solicitar una referencia a la variable require
correcta. En su ejemplo, la referencia a require
es un global . Desea una referencia a un require
que esté dentro del contexto de su módulo (a veces llamado "requerimiento 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 los identificadores de módulo relativos (por ejemplo, "./peerModule" o "../unclePath/cousinModule") se resuelvan correctamente. (Esta es una de las razones, curl.js no tiene un require
global por defecto).
Las razones para usar un local require
:
- no sabe qué módulos se necesitan en tiempo de compilación (o en tiempo de carga) debido a las condiciones de tiempo de ejecución
- Usted desea explícitamente diferir la carga de algunos módulos hasta que sean necesarios
- desea cargar una variación de un módulo en función de los resultados de la detección de características (aunque algo así como el complemento "tiene!" del dojo podría ser una mejor solución (lo siento, el enlace me elude))
Por último, AMD define un segundo uso de la necesidad de compatibilidad con los módulos creados en CommonJS Modules / 1.1 que luego se incluyen en una 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 de Javascript del lado del servidor pueden encontrar este formato atractivo. :)
Algunos cargadores de AMD (como RequireJS 0.2+, dojo 1.7+, bdLoad y curl.js 0.6+) detectarán este formato híbrido AMD / CJSM1.1 y encontrarán dependencias al escanear el módulo en busca de llamadas require
.
Mi comprensión de los módulos de AMD (utilizando, por ejemplo, RequireJs o curl.js) es:
require()
se utiliza para cargar de forma asíncrona diferentes módulos y cuando se carga, se ejecuta la devolución de llamada fn.
Y para definir un módulo, tendría scripts separados que usan define()
Pero he visto que algunos módulos utilizan 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 esto me parece confuso porque habría pensado que si un módulo tuviera dependencias, entonces deberían pasarse a través de la función principal de define([dependancies], fnDefinition)
y no dentro de ella a través de require()
como se muestra en el ejemplo anterior.
¿Hay un razonamiento detrás de esto?