2014-03-13 7 views
10

Ich versuche, Durandal mit node.js Server zu integrieren, indem ich Typescript zur Definition von Modulen sowohl auf Server- als auch auf Clientseite verwende.Ist es möglich, AMD- und CommonJS-Module innerhalb desselben Typoskript-Projekts zu mischen?

Das Problem, das ich festgestellt habe, ist, dass Durandal ist stark abhängig von RequireJS und AMD Stil der Definition von Modulen, die ich möchte nicht auf der Serverseite einzuführen, und da RequireJS verwendet habe ich keine Chance zu laufen CommonJS-ish-Module auf dem Client (Standard für node.js).

Der letzte Nagel im Sarg ist, dass ich keine Möglichkeit fand zu definieren, welche Dateien als AMD-Module und welche als CommonJS von TSC kompiliert werden sollten - es scheint eine einfache Lösung zu sein.

Ich glaube nicht, Trennung von Client-Teil und Server-Teil ist eine Option, da viel Code für beide Teile gemeinsam sein wird.

Also, meine Frage ist dreifach:

  • ist es eine Möglichkeit, AMD und Commonjs Module in dem gleichen Typoskript Projekt zu mischen (vorzugsweise unter Verwendung von NodejsTools)

  • wenn nicht, ist es eine Möglichkeit, zu zwingen Durandal mit Commonjs-Dateien zu arbeiten views/Viewmodel zu laden und so weiter

  • wenn nichts davon möglich ist, ist es möglich (und wiese) AMD-Module auf n zu verwenden, ode.js Server

Alle Ideen sind sehr

geschätzt

Antwort

6

ist es eine Möglichkeit, AMD zu mischen und CommonJS-Module im selben Typescript-Projekt (vorzugsweise mit NodejsTools)

Ja. Verwenden Sie grunt-ts. Siehe https://github.com/basarat/demo-fullstack/tree/master/src speziell auf die gruntfile gemeinsame Dateien: https://github.com/basarat/demo-fullstack/blob/master/src/Gruntfile.js#L4-L6 Commonjs: https://github.com/basarat/demo-fullstack/blob/master/src/Gruntfile.js#L26 amd: https://github.com/basarat/demo-fullstack/blob/master/src/Gruntfile.js#L37

+1

ah, das sieht aus wie eine Lösung, die ich suche. danke – Slawek

+1

Hinweis: Ich habe gerade diese Demo aktualisiert, um noch toller zu sein – basarat

0

Es sollte möglich sein, erfordern zu mischen Basis AMD Dateien und gemeinsame js. Ihre HTML-Seite würde dann Skripte enthalten, die folgend ähneln:

<script src="/tscode_common/common_js_file.js"></script> 
<script data-main="/tscode_amd/tscode_amd_config.js" type="text/javascript" src="lib/require.js"></script> 

Aber ein spezifisches Typoskript Projekt kann nur AMD oder gemeinsame js - wie die Compiler-Optionen pro Projekt sind.
Eine Lösung für dieses Problem zu nisten Typoskript Teilprojekte (.prj) in Unterverzeichnisse Ihrer wichtigsten Web-Anwendung so etwas wie die folgenden sein:

+-/(base directory for web application) 
+- /main_app.prj (main web app project file) 
+- index.html 
+- /tscode_common/ (put all common js files here) 
+- /tscode_common/common_js.prj (project file with commonjs options) 
+- /tscode_common/common_js_file.ts (common ts files) 
+- /tscode_amd/ (put all amd files here) 
+- /tscode_amd/amd_js.prj (project file with amd options) 
+- /tscode_amd/tscode_amd_config.ts (require config file) 
+- /tscode_amd/amd_js_file.ts (amd ts files) 
-2

Erstellen Sie einfach 2 Kopien * .njsproj Datei. Eine Kopie für den Server und eine für den clientseitigen Code. Halten Sie im Client-Projekt nur public und view (schließen Sie alles aus, was mit dem Server zusammenhängt). Behalten Sie nur, was sich auf den Server im serverseitigen Projekt bezieht. Stellen Sie sicher, dass das Projekt des Clients über AMD verfügt und der Server über CommonJs verfügt. Genießen!

3

Dies ist eher ein langer Kommentar als Antwort

Ich habe auf dem gleichen Problem suchen, und ich habe Grunzen-ts versuchen, schlucke-ts, WebStorm Datei-Beobachter, cmd Zeilenskripts, Alles aber Visual Studio, da ich Angst habe, mich auf die IDE für den Build-Prozess zu verlassen (Webstorm-Beobachter sind eine Ausnahme, genauso wie ein Grunzer oder irgendein anderer Beobachter, einfach zu replizieren, und es ist einfach praktisch, Konfigurationen auszuprobieren); Ich benutze derzeit interne Module, aber kompilieren nur die "exportierenden" Module mit Dateifiltern (Erweiterung basiert, ist der Reiniger) und TSC laden die Kette, wenn sie referenziert werden;

Ich habe verschiedene Ausgabeziele auf das, was ich versuche, wie in Knoten zu erreichen, Browser, eckig, Prüfung, Mokka, Jasmin, etc ...

wie in:

/MyModule 
myModule.ts 
myModule.d.ts 
myModule.mdl.ts (exports amd) 
myModule.export.ts (exports commonjs) 
myModule.test.ts (exports mocha test, no KARMA!) 
etc... 

nicht auf Ts ‚Export-Modul‘ unter Berufung Fähigkeit

es funktioniert, aber ... aber ich bin nicht 100% zufrieden, zu viele Dateien .... es riecht ... zu viele Ziele Gruntfile ist schwierig, lese (zu groß), ich muss mich daran erinnern oder dokumentieren, wie es funktioniert ks, bis ich die Zeit hatte, es vollständig zu automatisieren (wenn vernünftigerweise möglich)

Ich denke, die Optionen unten machen mehr Sinn auf DRY und KISS sense aber ich bin auch nicht 100% verkauft auf dem Boilerplate benötigt.

Typoskript Module sollten templatable sein, so, wenn sie das Modul könnte die ‚Form‘ kompilieren Ich möchte, ohne auf zusätzliche Build verlassen

Schritte

einige Optionen müssen nicht mehrere Ziele kompilieren, oder Vervielfältigung Datei

UMD (Universal Module Definition)

Browserify

amdefine

RequireJs in Node

Requirejs LOADING MODULES FROM COMMONJS PACKAGES

Verwandte Themen