Requerir:
Según el archivo de configuración a continuación
La copia del código es la siguiente:
módulo = [
{'nombre': 'jQuery', 'src': '/js/lib/jQuery-1.8.3.js'},
{'name': 'swfobject', 'src': '/js/utils/swfobject.js'},
{'name': 'fancybox', 'src': '/js/jQuery/jQuery.fancybox.js', 'requerir': ['jQuery']},
{'name': 'uploadify', 'src': '/js/utils/uploadify.js', 'requirir': ['swfobject']},
{'name': 'jqform', 'src': '/js/jQuery/jQuery.Form.js', 'requerir': ['jQuery']},
{'name': 'registrar', 'src': '/js/page/reg.js', 'requirir': ['jqform']},
{'name': 'Login', 'src': '/js/pagin/login.js', 'requerir': ['fancybox', 'jqform']},,
{'name': 'upload', 'src': '/js/page/upload.js', 'requerir': ['fancybox', 'jqForm', 'uploadify']}
]
Escribir una función
Def getFiles (nombre)
Regrese a la página especificada por cierto nombre, la lista de archivos JS a cargar, y aquellos con dependencias primero deben cargarse
Solución de guarniciones
Esta pregunta parece simple a primera vista, pero no lo es.
La dificultad radica en el momento de carga del módulo de dependencia. Si existe tal dependencia: AB&C, BC, el módulo A depende del módulo B y el módulo C, y el módulo B depende del módulo C, ¡no puede cargar C dos veces!
La solución dada por Xiaocai es solo una idea, y debe haber un mejor algoritmo que este. Xiaocai cree que se puede resolver usando algoritmos como árboles binarios, pero Xiaocai no sabe cómo hacerlo ~~~
Este algoritmo no considera escenarios de dependencia circular.
El código es el siguiente:
La copia del código es la siguiente:
/**
* No se consideran dependencias circulares
* @Type {function}
*/
var LoadModule = (function () {
/**
* Encapsulación de lógica de negocios
* @Type {{Chainhead: {}, ChainCurrent: {}, srccache: {}, main: main, load: load, findModule: findModule}}
*/
var lógica = {
Chainhead: {}, // encabezado de la lista de enlaces
ChainCurrent: {}, // El nodo actual de la lista vinculada
srccache: {}, // módulo cache src
/**
* Interfaz externa
* @Param Módulos Objeto de configuración
* @Param Nombre Nombre del módulo
* @returns {array} Lista de módulos de dependencia, ordenada en orden de carga
*/
Main: function (módulos, nombre) {
var namearray = [], // Lista de nombres del módulo
srCarray = [], // Lista de módulos de dependencia
namestr = "", // Módulo de nombre de cadena Conjunto
repeatregex =/(^|) ([/w]+).*/2/, // Deduplicación del nombre del módulo Regular
i = 0;
// Carga gruesa todos los módulos de dependencia
this.load (módulos, nombre)
// Construcción del nombre del nombre del módulo Conjunto
this.ChainCurrent = this.chainhead;
while (this.chainCurrent.next) {
namearray.push (this.chainCurrent.name);
this.ChainCurrent = this.ChainCurrent.Next;
}
namestr = namearray.Join ("") + ""; // estándares unificados, complete un espacio al final
// depender del módulo para deduplicar
while (repeatregEx.exec (namestr)) {
namestr = namestr.replace (Repeatregex, function (G0, G1, G2) {
return g0.substring (0, (g0.length - g2.length));
});
}
namestr = namestr.substring (0, (namestr.length - 1)); // eliminar espacios adicionales adicionales
// Convertir el nombre del módulo de dependencia en la ruta del módulo
namearray = namestr.split ("");
para (i = 0; i <namearray.length; i ++) {
srCarray.push (this.srccache [namearray [i]]);
}
regresar srcarray;
},
/**
* Módulo de carga recursivamente
* @Param Módulos Objeto de configuración
* @Param Nombre Nombre del módulo
*/
Load: function (módulos, nombre) {
var nodo = {},
módulo = this.findmodule.call (módulos, "nombre", nombre),
i = 0;
// juzga si el módulo existe
if (! módulo) {
Error de tirar ("Depender del módulo" + nombre + "no encontrado");
}
// Lista de enlaces de dependencia del módulo de construcción
node.name = nombre;
// node.src = module.src;
this.srccache [name] = module.src;
node.next = this.chainhead;
this.chainhead = nodo;
// dependencia recursiva
if (module.require && module.require.length) {
para (i = 0; i <module.require.length; i ++) {
this.load (módulos, módulo.require [i]);
}
}
},
/**
* Buscar módulos basados en nombres de atributos especificados y valores de atributo
* @Param Nombre Atributo Nombre
* @Param Value Atributo Valor
* @returns {*}
*/
findModule: function (nombre, valor) {
varilla var = esto,
item = {},
i = 0;
// Módulo de transferencia
para (i = 0; i <array.length; i ++) {
item = array [i];
// Obtener el módulo especificado
if (elemento && elemento [nombre] === Valor) {
artículo de devolución;
}
}
// no se puede encontrar nulo
regresar nulo;
}
};
// Exponer la interfaz externa
Función de retorno () {
return Logics.main.apply (lógicos, argumentos);
};
} ());
/**
* Prueba de USECASE
* @tipo {*[]}
*/
módulos var = [
{'nombre': 'jQuery', 'src': '/js/lib/jQuery-1.8.3.js'},
{'name': 'swfobject', 'src': '/js/utils/swfobject.js'},
{'name': 'fancybox', 'src': '/js/jQuery/jQuery.fancybox.js', 'requerir': ['jQuery']},
{'name': 'uploadify', 'src': '/js/utils/uploadify.js', 'requirir': ['swfobject']},
{'name': 'jqform', 'src': '/js/jQuery/jQuery.Form.js', 'requerir': ['jQuery']},
{'name': 'registrar', 'src': '/js/page/reg.js', 'requirir': ['jqform']},
{'name': 'Login', 'src': '/js/pagin/login.js', 'requerir': ['fancybox', 'jqform']},,
{'name': 'cargar', 'src': '/js/page/upload.js', 'requerir': ['fancybox', 'jqForm', 'login', 'uploadify']}
];
console.log (LoadModule (módulos, "cargar"));