Wie verteilt man das Modul auf mehrere AMD-Dateien?

8

Ich kann nicht herausfinden, ob es sogar möglich ist, ein "Exportmodul" über mehrere Dateien verteilt zu haben.

Wenn ich Datei contact.ts habe:

%Vor%

und ein anderes ContactView.ts

%Vor%

Dann erkennt TSC die Contact-Klasse nicht. Wie Sie sehen können, sind der Kontakt und das ContactView so deklariert, dass sie sich im selben Modul befinden und entsprechend der Spezifikation sollte es funktionieren.

Ich baue eine Composite-App, die die require.js- und AMD-Muster verwendet, also muss ich die "export module" -Deklaration verwenden.

Sollte ich irgendeine Art von "Ahead-Deklaration" oder irgendeinen kniffligen "Import" machen?

Danke für die Beratung.

BEARBEITEN: Momentan lade ich jedes Modul einzeln per Import, aber wenn Sie bemerken, erzeugt es eine enorme Verschwendung von Code und viele "Import" Abhängigkeiten. Meine Frage war, ob es eine Möglichkeit gibt, den gleichen Namespace (d. H. Kontakte) zu verwenden, um den TS bekannt zu geben, den ich nicht importieren möchte. Ich habe den normalen // Befehl untersucht, aber es funktioniert nicht. Ich habe sogar die * .d.ts Deklarationsdateien bisher ohne Erfolg ausprobiert.

    
IgorM 08.10.2012, 22:18
quelle

2 Antworten

6

Mit dieser Spezifikation können Sie interne Module über mehrere Dateien hinweg definieren (interne Module beziehen sich im Wesentlichen auf das JavaScript-Modulmuster). Externe Module, wie AMD oder CommonJS Module, arbeiten mit der Idee, dass jede Datei das eigentliche "Modul des Codes" ist, und der Namensraum / Namen darin irrelevant ist, da das Modul in das Modul geladen wird eigenes neues Objekt sowieso.

Sie könnten den folgenden Code schreiben, um das Modul Contact.ts in das Modul ContactView.ts zu laden:

%Vor%

Und das sollte gut genug funktionieren, aber wenn Sie Zugriff auf die Inhalte beider Module in einem anderen Bereich haben möchten (um beispielsweise ein neues Kontaktmodell selbst zu erstellen), müssten Sie beide im Wesentlichen importieren:

%Vor%

Was meiner Meinung nach gut genug ist, weil Sie Ihre Abhängigkeiten klar angeben. Der Nachteil ist, dass sie kein gemeinsames Elternobjekt haben, so dass sie beide in einem "Kontakt" -Modul-Muster zu haben sind, ist wahrscheinlich nicht von großem Nutzen.

Eine andere Option ist "Kontakt" zusammen mit "ContactView" zu exportieren, wie folgt (vorausgesetzt, dass dieser Code ziemlich albern ist, weil Sie das genau über die Model-Eigenschaft von ContactView tun, aber niemals weniger ...) :

%Vor%

Sie können also nach dem Laden von ContactView darauf zugreifen.

EDIT: Übrigens, Sie sind nicht darauf beschränkt, Module nur über "export module Name {...}" zu exportieren, Sie können alles exportieren, da die Datei selbst das Modul ist. Sie könnten also eine Datei haben, die nur die Funktion "export foo () {...}" enthält, ohne dass ein Modul-Pattern-Code sie umschließt.

EDIT2: Es sieht so aus, als hätte AMD Funktionen zum Laden mehrerer Abhängigkeiten und zum Konstruieren von "Modulen" aus diesen, aber ich habe keine Ahnung, wie das in TS funktionieren würde, hier ist ein Link, der darüber hinausgeht: Ссылка (Konstruktor-Module).

    
nxn 09.10.2012 01:21
quelle
4

Ich hatte eine Weile mit der gleichen Frage zu kämpfen und wollte nur teilen, was ich tue, für den Fall, dass jemand diese Frage durchstreift.

Zuerst habe ich eine Referenzdatei definiert, die alle Dateien in meinem Modul deklariert:

%Vor%

Beachten Sie, dass in der Datei angegebene Pfade relativ zur Position der Referenzdatei selbst ( _contacts.ts ) sind, im Gegensatz zu einer .js Referenzdatei. Meine Verzeichnisstruktur sieht so aus:

%Vor%

Zurück zur Referenzdatei selbst. Die erste Zeile enthält eine separate Referenzdatei, die alle externen Bibliotheken auflistet, die vom Modul verwendet werden, wie beispielsweise Unterstrich, Moment oder jede andere vorhandene Bibliothek, für die Sie eine .d.ts -Definitionsdatei haben. Die restlichen Zeilen sind die Dateien, aus denen das Modul besteht.

Innerhalb jeder Datei, die Teil des Moduls ist, referenziere ich die obige Datei:

%Vor%

Sie können auch eine einzelne Referenzdatei erstellen, um alle Ihre Module aufzulisten:

%Vor%

Und zeigen Sie einfach darauf von Ihren Quelldateien.

Dies löst jedoch nicht das Problem, dass der ausgegebene Code in separaten Dateien liegt. Für dieses Problem verwende ich ein JavaScript-Minification-Tool, das in der Lage ist, mehrere Dateien in einer einzigen Quelldatei zu bündeln. Abhängig von Ihren Kompilierungseinstellungen und Anwendungsfällen müssen Sie möglicherweise einen Wrapper um den generierten Code anwenden, damit dieser als AMD-Modul funktioniert (dieser Teil ist noch nicht so vertraut).

    
Morten Mertner 12.12.2012 23:12
quelle

Tags und Links