Exiger:
Selon le fichier de configuration ci-dessous
La copie de code est la suivante:
module = [
{'name': 'jQuery', 'src': '/ js / lib / jquery-1.8.3.js'},
{'name': 'swfObject', 'src': '/ js / utils / swfobject.js'},
{'name': 'fantaisie', 'src': '/ js / jquery / jquery.fancybox.js', 'require': ['jQuery']},
{'name': 'uploadify', 'src': '/ js / utils / uploadify.js', 'require': ['swfObject']},
{'name': 'jqform', 'src': '/ js / jquery / jquery.form.js', 'require': ['jQuery']},
{'name': 'registre', 'src': '/ js / page / reg.js', 'require': ['jqform']},
{'name': 'ligin', 'src': '/ js / page / login.js', 'require': ['sancybox', 'jqform']},
{'name': 'upload', 'src': '/ js / page / upload.js', 'require': ['sancybox', 'jqform', 'uploadify']}
]]
Écrire une fonction
Def Getfiles (nom)
Retour à la page spécifiée par un certain nom, la liste des fichiers JS à charger et ceux qui ont des dépendances doivent d'abord être chargés
Solution de plats d'accompagnement
Cette question semble simple à première vue, mais ce n'est pas le cas.
La difficulté réside dans le synchronisation de chargement du module de dépendance. S'il y a une telle dépendance: AB&C, BC, le module A dépend du module B et du module C, et le module B dépend du module C, vous ne pouvez pas obtenir C deux fois!
La solution donnée par Xiaocai n'est qu'une idée, et il doit y avoir un meilleur algorithme que cela. Xiaocai pense qu'il peut être résolu à l'aide d'algorithmes tels que les arbres binaires, mais Xiaocai ne sait pas comment le faire ~~~
Cet algorithme ne tient pas compte des scénarios de dépendance circulaire.
Le code est le suivant:
La copie de code est la suivante:
/ **
* Aucune dépendance circulaire n'est considérée
* @Type {fonction}
* /
var loadmodule = (function () {
/ **
* Encapsulation logique commerciale
* @Type {{Chainhead: {}, ChainCurrent: {}, srccache: {}, Main: Main, chargement: chargement, findmodule: findmodule}}
* /
var logiques = {
Chainhead: {}, // En-tête de liste de liens
Chaincurrent: {}, // Le nœud actuel de la liste liée
srccache: {}, // module src cache
/ **
* Interface externe
* objet de configuration des modules @param
* @param nom du module nom
* @returns {Array} Liste des modules de dépendance, triée par ordre de chargement
* /
Main: fonction (modules, nom) {
var nameArray = [], // Liste des noms du module
SrcArray = [], // Liste des modules de dépendance
NAMESTR = "", // Nom du module Set Set
repeatregex = / (^ |) ([/ w] +). * / 2 /, // Nom du module Deduplication régulière
i = 0;
// charge grossière tous les modules de dépendance
this.load (modules, nom)
// Construire le jeu de chaîne de noms de module
this.chaincurrent = this.chainhead;
while (this.chaincurrent.next) {
namearray.push (this.chaincurrent.name);
this.chaincurrent = this.chaincurrent.next;
}
NAMESTR = NAMEARRAY.JOIN ("") + ""; // Normes unifiées, remplissez un espace à la fin
// dépend du module pour déduir
while (repeatregex.exec (namestr)) {
NAMESTR = NAMESTR.replace (RepeatRegex, Fonction (G0, G1, G2) {
return g0.substring (0, (g0.length - g2.Length));
});
}
NAMESTR = NAMESTR.SUBSTRING (0, (NAMESTR.Length - 1)); // Retirez des espaces supplémentaires supplémentaires
// convertir le nom du module de dépendance en chemin de module
nameArray = NAMESTR.Split ("");
pour (i = 0; i <namearray.length; i ++) {
srcarray.push (this.srccache [namearray [i]]);
}
retour srcarray;
},
/ **
* Module de chargement récursivement
* objet de configuration des modules @param
* @param nom du module nom
* /
chargement: fonction (modules, nom) {
var node = {},
module = this.findmodule.call (modules, "nom", nom),
i = 0;
// juger si le module existe
if (! module) {
lancer une erreur ("dépendre du module" + nom + "non trouvé");
}
// Construire la liste des liens de dépendance du module
node.name = name;
// node.src = module.src;
this.srccache [name] = module.src;
node.next = this.chainhead;
this.chainhead = nœud;
// dépendance récursive
if (module.require && module.require.length) {
pour (i = 0; i <module.require.length; i ++) {
this.load (modules, module.require [i]);
}
}
},
/ **
* Trouver des modules basés sur des noms d'attribut spécifiés et des valeurs d'attribut
* @param nom d'attribut nom
* valeur d'attribut de valeur @param
* @returns {*}
* /
findModule: fonction (nom, valeur) {
Var Array = ceci,
item = {},
i = 0;
// Module de transfert
pour (i = 0; i <array.length; i ++) {
item = array [i];
// Obtenez le module spécifié
if (item && item [name] === valeur) {
return item;
}
}
// retour null ne peut être trouvé
retourner null;
}
};
// exposer l'interface externe
return function () {
return logics.main.apply (logiques, arguments);
};
} ());
/ **
* Tester UseCase
* @taper {*[]}
* /
modules var = [
{'name': 'jQuery', 'src': '/ js / lib / jquery-1.8.3.js'},
{'name': 'swfObject', 'src': '/ js / utils / swfobject.js'},
{'name': 'fantaisie', 'src': '/ js / jquery / jquery.fancybox.js', 'require': ['jQuery']},
{'name': 'uploadify', 'src': '/ js / utils / uploadify.js', 'require': ['swfObject']},
{'name': 'jqform', 'src': '/ js / jquery / jquery.form.js', 'require': ['jQuery']},
{'name': 'registre', 'src': '/ js / page / reg.js', 'require': ['jqform']},
{'name': 'ligin', 'src': '/ js / page / login.js', 'require': ['sancybox', 'jqform']},
{'name': 'upload', 'src': '/ js / page / upload.js', 'require': ['sancybox', 'jqform', 'ligin', 'uploadify']}
]]
console.log (loadModule (modules, "téléchargement"));