Erfordern:
Gemäß der folgenden Konfigurationsdatei
Die Codekopie lautet wie folgt:
modul = [
{'name': 'jQuery', 'src': '/js/lib/jQuery-1.8.3.js'},
{'name': 'swfObject', 'src': '/js/utils/swfObject.js'},
{'name': 'FancyBox', 'src': '/js/jQuery/jQuery.fancybox.js', 'Reforde': ['jQuery']},
{'Name': 'Uploadify', 'src': '/js/utils/uploadify.js', 'Request': ['swfObject']},,
{'name': 'jqform', 'src': '/js/jQuery/jquery.form.js', 'erfordern': ['jQuery']},,
{'name': 'Register', 'src': '/js/page/reg.js', 'fordern': ['jqform']},
{'name': 'login', 'src': '/js/page/login.js', 'require': ['FancyBox', 'jqform']},
{'Name': 'Upload', 'src': '/js/page/upload.js', 'Require': ['FancyBox', 'JQForm', 'Uploadify']}
]
Schreiben Sie eine Funktion
Def get files (Name)
Kehren Sie zu der durch einen bestimmten Namen angegebenen Seite zurück, die Liste der zu geladenen JS -Dateien, und diejenigen mit Abhängigkeiten müssen zuerst geladen werden
Beilagenlösung
Diese Frage scheint auf den ersten Blick einfach zu sein, aber nicht.
Die Schwierigkeit liegt im Ladezeitpunkt des Abhängigkeitsmoduls. Wenn es eine solche Abhängigkeit gibt: AB & C, BC, Modul A hängt von Modul B und Modul C ab und Modul B hängt vom Modul C ab, Sie können C nicht zweimal geladen lassen!
Die von Xiaocai angegebene Lösung ist nur eine Idee, und es muss einen besseren Algorithmus geben. Xiaocai glaubt, dass es mit Algorithmen wie binären Bäumen gelöst werden kann, aber Xiaocai weiß nicht, wie es geht ~~~
Dieser Algorithmus berücksichtigt keine zirkulären Abhängigkeitsszenarien.
Der Code ist wie folgt:
Die Codekopie lautet wie folgt:
/**
* Es werden keine kreisförmigen Abhängigkeiten berücksichtigt
* @type {function}
*/
var loadModule = (function () {
/**
* Geschäftslogikverkapselung
* @type {{chainhead: {}, chaincurrent: {}, srccache: {}, main: main, laden: laden, findModule: findModule}}
*/
var logics = {
Kettenhead: {}, // Linklistenheader
Chaincurrent: {}, // Der aktuelle Knoten der verknüpften Liste
srccache: {}, // Modul SRC -Cache
/**
* Externe Schnittstelle
* @Param Module Konfigurationsobjekt
* @param Name Modul Name
* @Returns {Array} Abhängigkeitsmodulliste, sortiert in der Reihenfolge des Ladens
*/
Haupt: Funktion (Module, Name) {
var namearray = [], modulame Namensliste
srcarray = [], // Abhängigkeitsmodulliste
Namestern = "", // Modul Name String Set Set
repeatregex =/(^|) ([/w]+).*/2/, // Modulname Deduplication regelmäßig
i = 0;
// Grob alle Abhängigkeitsmodule laden
Diese.Load (Module, Name)
// Konstruktion des Modulnamens Zeichenfolge Set
this.chaincurrent = this.chainhead;
while (this.chaincurrent.next) {
namearray.push (this.chaincurrent.name);
this.chaincurrent = this.chaincurrent.Next;
}
namestr = namearray.join ("") + ""; // Unified Standards, füllen Sie am Ende einen Raum aus
// Abhängig von dem Modul zum Deduplikat
while (repeatregex.exec (namestern)) {
namestr = namestr.replace (Repeatregex, Funktion (G0, G1, G2) {
return g0.substring (0, (g0.length - g2.Length));
});
}
namestr = namestr.substring (0, (namestr.Length - 1)); // Zusätzliche zusätzliche Räume entfernen
// Konvertieren Sie den Namen des Abhängigkeitsmoduls in den Modulpfad
namenearray = namestr.split ("");
für (i = 0; i <namearray.length; i ++) {
srcarray.push (this.srccache [namearray [i]]);
}
Return Srcarray;
},
/**
* Rekursives Ladenmodul
* @Param Module Konfigurationsobjekt
* @param Name Modul Name
*/
Laden: Funktion (Module, Name) {
var node = {},
module = this.findmodule.call (Module, "Name", Name),
i = 0;
// beurteilen, ob das Modul existiert
if (! Modul) {
Wurffehler ("vom Modul abhängen" + Name + "Nicht gefunden");
}
// Linkliste der Modulabhängigkeit des Moduls konstruieren
node.name = name;
// node.src = modul.src;
this.srccache [name] = modul.src;
node.next = this.chainhead;
this.chainhead = node;
// rekursive Abhängigkeit
if (module.require && module.require.length) {
für (i = 0; i <modul.require.length; i ++) {
diese.Load (module, modul.require [i]);
}
}
},
/**
* Finden Sie Module basierend auf angegebenen Attributnamen und Attributwerten
* @param Name Attributname
* @Param -Wert -Attributwert
* @returns {*}
*/
findModule: function (name, value) {
var array = this,,
item = {},,
i = 0;
// Modul übertragen
für (i = 0; i <array.length; i ++) {
item = array [i];
// Erhalten Sie das angegebene Modul
if (item && item [name] === Wert) {
Gegenstand zurückgeben;
}
}
// Rückkehr Null kann nicht gefunden werden
null zurückkehren;
}
};
// externe Schnittstelle freilegen
return function () {
return logics.main.apply (logics, argumente);
};
} ());
/**
* Testen Sie UsEcase
* @Typ {*[]}
*/
var module = [
{'name': 'jQuery', 'src': '/js/lib/jQuery-1.8.3.js'},
{'name': 'swfObject', 'src': '/js/utils/swfObject.js'},
{'name': 'FancyBox', 'src': '/js/jQuery/jQuery.fancybox.js', 'Reforde': ['jQuery']},
{'Name': 'Uploadify', 'src': '/js/utils/uploadify.js', 'Request': ['swfObject']},,
{'name': 'jqform', 'src': '/js/jQuery/jquery.form.js', 'erfordern': ['jQuery']},,
{'name': 'Register', 'src': '/js/page/reg.js', 'fordern': ['jqform']},
{'name': 'login', 'src': '/js/page/login.js', 'require': ['FancyBox', 'jqform']},
{'Name': 'Upload', 'src': '/js/page/upload.js', 'Require': ['FancyBox', 'JQForm', 'Login', 'Uploadify']}
];
console.log (LoadModule (Module, "Upload"));