JavaScript-Abhängigkeitsverwaltung
Ich bin derzeit die Verwaltung einer großen Anzahl von JS-Dateien und das dependency-Problem wächst über meinen Kopf. Jetzt habe ich jede Funktion in eine separate Datei und ich manuell pflegen einer Datenbank zu arbeiten, die Abhängigkeiten zwischen Funktionen.
Diese würde ich gerne automatisieren. Zum Beispiel wenn ich die Funktion f
Array.prototype.f = function() {};
verwiesen wird in einer anderen Funktion g
MyObject.g = function() {
var a = new Array();
a.f();
};
Ich möchte in der Lage sein, um zu erkennen, dass g auf f.
Wie mache ich das? Wo fange ich an? Muss ich eigentlich Schreibe einen compiler, oder kann ich die tweak Spidermonkey zum Beispiel? Hat jemand sonst schon tun?
Alle Zeiger, mich zu beginnen, ist sehr geschätzt
Dank
Dok
InformationsquelleAutor der Frage user386508 | 2010-07-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Während Sie könnte theoretisch schreiben Sie eine statische Analyse-tool erkannt, dass die Verwendung von globals definiert, die in anderen Dateien, wie zum Beispiel die Verwendung von
MyObject
haben, konnte man nicht realistisch analysierenprototype
Erweiterung Methoden.JavaScript ist eine dynamisch typisierte Sprache, so gibt es keinen praktischen Weg für jedes Werkzeug, zu wissen, dass
a
wenn an aus deng
- Funktion, ist eineArray
ist, wenn alsof()
heißt es ist eine Abhängigkeit. Es wird nur bestimmt, welche Variablen, die halten, was Typen zur Laufzeit, so finden Sie heraus, würden Sie einen Dolmetscher benötigen und die Sie sich vorgenommen haben, eine Turing-vollständige problem.Nicht zu vergessen das weitere dynamische Aspekte von JavaScript, die völlig trotzen statische Analyse, wie das abrufen von Eigenschaften, die von square bracket notation, die gefürchtete
eval
oder Zeichenfolgen in timeouts oder event-handler-Attribute.Ich denke, es ist ein bisschen wie ein non-starter wirklich. Sie sind wahrscheinlich besser von Abhängigkeiten zwischen manuell, sondern vereinfacht es durch gruppieren Verwandte Funktionen in Modulen, die sein wird, Ihre grundlegende Einheit der Abhängigkeit. OK, du wirst ziehen in ein paar mehr Funktionen, die Sie technisch brauchen, aber hoffentlich nicht zu viel.
Es ist auch eine gute Idee, um namespace jedes Modul, es ist also sehr klar, wo jeder Anruf wird gehen, machen es einfach zu halten, werden die Abhängigkeiten in der Steuerung manuell (zB. durch eine
//uses: ThisModule, ThatModule
Kommentar oben).Da Erweiterungen des integrierten Prototypen sind schwieriger zu verfolgen, halten Sie Sie auf ein minimum. Erweitern zB.
Array
gehören die ECMAScript Fifth Edition-Methoden (wieindexOf
) auf Browsern, die nicht bereits haben Sie eine gute Sache zu tun, wie eine grundlegende Korrektur, die alle Skripte verwenden. Das hinzufügen von komplett neuen beliebige Funktionalität zu bestehenden Prototypen ist fraglich.InformationsquelleAutor der Antwort bobince
Haben Sie versucht, mit einer dependency manager wie RequireJS oder LabJS? Ich bemerkte niemand Sie erwähnt in diesem thread.
Vom http://requirejs.org/docs/start.html:
Können geschachtelt werden diese Abhängigkeiten als auch, also helper/util, kann einige andere Dateien in sich selbst.
InformationsquelleAutor der Antwort Chris
Als @bobince bereits vorgeschlagen, dabei die statische Analyse auf ein JavaScript-Programm ist eine in der Nähe Unmögliche problem zu knacken. Google Closure compiler funktioniert es einigermaßen, aber dann hat es stützt sich auch auf externe Hilfe von JSDoc Kommentare.
Hatte ich eine ähnliches problem zu finden, die Reihenfolge, in der die JS-Dateien sollte verkettet in einem früheren Projekt, und da waren es lädt JS-Dateien, aktualisieren Sie manuell die Aufnahme, um Schienen zu langweilig. Stattdessen steckte ich mit bestimmten Konventionen, was zu einer Abhängigkeit für meine Zwecke und auf der Grundlage, dass und mit einfachen regexp 🙂 ich war in der Lage, generiert die richtige Aufnahme um.
Die Lösung verwendet eine topologische Sortieren Algorithmus zum generieren eines dependency graphdie dann aufgezählt werden, die Dateien in der Reihenfolge, in der Sie aufgenommen werden sollten, um alle Abhängigkeiten. Da jede Datei war im Grunde eine pseudo-Klasse, die mit MooTools syntax, es gab nur 3 Möglichkeiten, Abhängigkeiten geschaffen werden könnten, für meine situation.
new
Stichwort.Es war eine einfache, und auf jeden Fall eine gebrochene Lösung für die Allgemeine Benutzung, aber es diente mir gut. Wenn Sie interessiert sind, in die Lösung können Sie sehen, die code hier - es ist in Ruby geschrieben ist.
Wenn Ihr Abhängigkeiten sind komplexer, dann könnten Sie vielleicht manuell die Liste der Abhängigkeiten in den einzelnen JS-Datei selbst über Kommentare und einige einheimische syntax wie:
Dann Lesen Sie jede JS-Datei, analysiert den Bedarf Kommentare, und konstruieren ein abhängigkeitsdiagramm, das Ihnen die Aufnahme, um die Sie benötigen.
InformationsquelleAutor der Antwort Anurag
Es wäre schön, ein tool, das automatisch erkennen, kann diese Abhängigkeiten für Sie zu und wählen Sie, wie Sie geladen werden. Die besten Lösungen sind heute ein bisschen roher, aber. Ich erstellte ein dependency manager für meine besonderen Bedürfnisse, die ich möchte hinzufügen zur Liste (Pyramide Dependency Manager). Es hat einige der wichtigsten features, die lösen einige einmalige Fälle.
Einige Beispiel-code, um zu zeigen, wie es funktioniert während der Entwicklung.
Datei: dependencyLoader.js
Html-Dateien
Es erfordert, Sie zu erhalten eine einzige Datei für die Verwaltung von Abhängigkeiten. Ich denke über das erstellen von einem Programm generiert automatisch die loader-Datei für den header, aber da es unterstützt viele verschiedene Arten von Abhängigkeiten, die Aufrechterhaltung Sie Sie in einer Datei könnte tatsächlich besser sein.
InformationsquelleAutor der Antwort i8abug
JSAnalyse verwendet statische code-Analyse zum erkennen von Abhängigkeiten zwischen javascript-Dateien:
http://jsanalyse.codeplex.com/
Es erlaubt Ihnen auch, zu definieren, die die erlaubten Abhängigkeiten und um sicherzustellen, dass es während des build-Instanz. Natürlich, es kann nicht erkennen, alle Abhängigkeiten, weil javascript dynamisch interpretet Sprache, die nicht Typ-sicher sind, wie bereits erwähnt. Aber zumindest macht Sie bewusst Ihre javascript dependency graph und hilft, Sie unter Kontrolle zu halten.
InformationsquelleAutor der Antwort Thomas
Habe ich ein tool geschrieben, so etwas zu tun: http://github.com/damonsmith/js-class-loader
Es ist besonders nützlich, wenn Sie mit einem java webapp und gestalten Sie Ihre JS-code in den java-Stil. Wenn Sie das tun, kann es erkennen, alle Ihre code-Abhängigkeiten und bündeln Sie, mit Unterstützung sowohl für Laufzeit-und parse-Zeit-Abhängigkeiten.
InformationsquelleAutor der Antwort Damon Smith