Requer:
De acordo com o arquivo de configuração abaixo
A cópia do código é a seguinte:
módulo = [
{'nome': 'jQuery', 'src': '/js/liby/jQuery-1.8.3.js'},
{'nome': 'swfobject', 'src': '/js/utils/swfobject.js'},
{'Nome': 'FancyBox', 'src': '/js/jQuery/jquery.fancybox.js', 'requer': ['jQuery']},
{'nome': 'uploadify', 'src': '/js/utils/uploadify.js', 'requer': ['swfobject']},
{'nome': 'jqform', 'src': '/js/jQuery/jquery.form.js', 'requer': ['jQuery']},
{'Nome': 'Register', 'src': '/js/page/reg.js', 'requer': ['jqform']},
{'nome': 'login', 'src': '/js/page/login.js', 'requer': ['FancyBox', 'jqform']},
{'nome': 'upload', 'src': '/js/page/upload.js', 'requer': ['FancyBox', 'jqform', 'uploadify']}
]
Escreva uma função
def getfiles (nome)
Retorne à página especificada por um determinado nome, a lista de arquivos JS a serem carregados e aqueles com dependências devem primeiro ser carregados
Solução de acompanhamentos
Esta pergunta parece simples à primeira vista, mas não é.
A dificuldade está no tempo de carregamento do módulo de dependência. Se houver tal dependência: ab & c, bc, módulo A depende do módulo B e do Módulo C e o Módulo B depende do módulo C, você não pode ser carregado C duas vezes!
A solução dada por Xiaocai é apenas uma idéia, e deve haver um algoritmo melhor do que isso. Xiaocai acha que pode ser resolvido usando algoritmos como árvores binárias, mas Xiaocai não sabe como fazer ~~~
Esse algoritmo não considera cenários de dependência circular.
O código é o seguinte:
A cópia do código é a seguinte:
/**
* Nenhuma dependência circular é considerada
* @Type {function}
*/
var loadModule = (function () {
/**
* Encapsulamento de lógica de negócios
* @Type {{ChainHead: {}, Charencurrent: {}, srccache: {}, main: main, carregamento: carregar, findModule: findModule}}
*/
var Logics = {
Chainhead: {}, // Cabeçalho da lista de links
ChainCurrent: {}, // O nó atual da lista vinculada
srccache: {}, // módulo src cache
/**
* Interface externa
* @param módulos Objeto de configuração
* Nome do nome @param Nome do módulo
* @returns {Array} Lista de módulos de dependência, classificada em ordem de carregamento
*/
Principal: function (módulos, nome) {
var namearray = [], // Lista de nomes do módulo
srCarray = [], // Lista de módulos de dependência
namestr = "", // String de nome do módulo Conjunto
repetirgex =/(^|) ([/w]+).*/2/, // Nome do módulo Deduplicação regular
i = 0;
// carrega grossa todos os módulos de dependência
this.load (módulos, nome)
// Construindo Nome do módulo STRING STRING Set
this.chainCurrent = this.chainHead;
while (this.chainCurrent.next) {
namearray.push (this.chainCurrent.name);
this.ChainCurrent = this.ChainCurrent.Next;
}
namestr = namearray.join ("") + ""; // Padrões unificados, preencha um espaço no final
// depende do módulo para desduplicar
while (repeatregex.exec (namest)) {
namestr = namest.replace (Repeatregex, função (G0, G1, G2) {
retornar g0.substring (0, (G0.Length - G2.Length));
});
}
namestr = namest.substring (0, (namest.length - 1)); // Remova espaços extras adicionais
// converte o nome do módulo de dependência em caminho do módulo
namearray = namest.split ("");
for (i = 0; i <namearray.length; i ++) {
srcarray.push (this.srccache [namearray [i]]);
}
retornar SrCarray;
},
/**
* Módulo de carregamento recursivamente
* @param módulos Objeto de configuração
* Nome do nome @param Nome do módulo
*/
Carregar: função (módulos, nome) {
var node = {},
módulo = this.findmodule.call (módulos, "nome", nome),
i = 0;
// julga se o módulo existe
if (! módulo) {
Erro de arremesso ("depende do módulo" + nome + "não encontrado");
}
// Lista de link de dependência do módulo Construindo
node.name = nome;
// node.src = module.src;
this.srccache [nome] = module.src;
node.Next = this.chainhead;
this.chaInhead = node;
// Dependência recursiva
if (module.require && module.require.length) {
for (i = 0; i <module.require.length; i ++) {
this.load (módulos, module.require [i]);
}
}
},
/**
* Encontre módulos com base em nomes de atributos especificados e valores de atributo
* @param nome Nome do atributo Nome
* @param valor de atributo valor
* @returns {*}
*/
FindModule: function (nome, valor) {
var array = this,
item = {},
i = 0;
// Módulo de transferência
for (i = 0; i <array.length; i ++) {
item = array [i];
// Obtenha o módulo especificado
if (item && item [nome] === value) {
item de retorno;
}
}
// retornar nulo não pode ser encontrado
retornar nulo;
}
};
// Expor a interface externa
Return function () {
return logics.main.apply (lógicas, argumentos);
};
} ());
/**
* Teste o USECASE
* @tipo {*[]}
*/
VAR módulos = [
{'nome': 'jQuery', 'src': '/js/liby/jQuery-1.8.3.js'},
{'nome': 'swfobject', 'src': '/js/utils/swfobject.js'},
{'Nome': 'FancyBox', 'src': '/js/jQuery/jquery.fancybox.js', 'requer': ['jQuery']},
{'nome': 'uploadify', 'src': '/js/utils/uploadify.js', 'requer': ['swfobject']},
{'nome': 'jqform', 'src': '/js/jQuery/jquery.form.js', 'requer': ['jQuery']},
{'Nome': 'Register', 'src': '/js/page/reg.js', 'requer': ['jqform']},
{'nome': 'login', 'src': '/js/page/login.js', 'requer': ['FancyBox', 'jqform']},
{'nome': 'upload', 'src': '/js/page/upload.js', 'requer': ['FancyBox', 'jqform', 'login', 'uploadify']}
];
console.log (loadModule (módulos, "upload"));