Frage

Diese Frage gilt nur für Haxe Version <2.10

Ich habe eine Weile über haxe bekannt, aber nie wirklich mit ihm bis gestern gespielt. Neugierig sein, entschied ich mich zu portieren showdown.js , ein Javascript-Port von markdown.pl , haxe. Das war ziemlich einfach, und die Javascript scheint es erzeugt fein zu laufen ( Bearbeiten Wenn Sie es in Aktion sehen wollen, check it out hier ).

Allerdings bemerkte ich, dass der generierte Code eine Tonne Material im globalen Namespace-Dumps ... und was noch schlimmer ist, sie tut es mit Werten nicht deklarierte Bezeichner , ohne die var Schlüsselwort zuweisen, so Sie sind global, auch wenn Sie das ganze mit einem Verschluss wickeln.

Zum Beispiel ...

if(typeof js=='undefined') js = {}
...
Hash = function(p) { if( p === $_ ) return; {
...
EReg = function(r,opt) { if( r === $_ ) return; {
...

ich es geschafft, die meisten, die sich mit sed zu reinigen, aber ich bin auch durch Sachen wie diese Mühe gemacht:

{
 String.prototype.__class__ = String;
 String.__name__ = ["String"];
 Array.prototype.__class__ = Array;
 Array.__name__ = ["Array"];
 Int = { __name__ : ["Int"]}
 Dynamic = { __name__ : ["Dynamic"]}
 Float = Number;
 Float.__name__ = ["Float"];
 Bool = { __ename__ : ["Bool"]}
 Class = { __name__ : ["Class"]}
 Enum = { }
 Void = { __ename__ : ["Void"]}
}
{
 Math.__name__ = ["Math"];
 Math.NaN = Number["NaN"];
 Math.NEGATIVE_INFINITY = Number["NEGATIVE_INFINITY"];
 Math.POSITIVE_INFINITY = Number["POSITIVE_INFINITY"];
 Math.isFinite = function(i) {
  return isFinite(i);
 }
 Math.isNaN = function(i) {
  return isNaN(i);
 }
}

Dies ist ein paar ziemlich unappetitliche Javascript.


Fragen

Gibt es eine Gabel oder ein Klon haxe irgendwo, die nicht verschmutzen Globals tut? Lohnt es sich die haxe Quelle zu ändern, um zu bekommen, was ich will, oder das jemand bereits gelöst hat? Googeln hat nicht viel aufgedreht. Ich bin für alle Vorschläge offen. Inzwischen bin ich sterben, um zu sehen, welche Art von PHP-Code dieses Dinge zu produzieren gehen ...: D


Antworten?

Hier sind einige der Ideen, die ich versucht habe:

Nachverarbeitung

Hier ist meine bescheidene Build-Skript; es hat einen ziemlich guten Job Sachen Strippen, aber es alles nicht fangen. Ich bin zögerlich die Änderungen im internen Konstruktor Prototypen zu entfernen; Ich bin sicher, dass sich die Dinge brechen. Fixing alles könnte ein bisschen eine Aufgabe sein, und ich will nicht auf ihn starten, wenn jemand bereits die Arbeit getan ...

haxe -cp ~/Projects/wmd-new -main Markdown -js markdown.js

echo "this.Markdown=(function(){ var \$closure, Float;" > markdown.clean.js;

sed "s/^if(typeof js=='undefined') js = {}$/if(typeof js=='undefined') var js = {};/g ;
     s/^\([ \x09]*\)\([\$_a-zA-Z0-9]* = \({\|function\)\)/\1var \2/g ;
      /^[ \x09]*\(else \)\?null;$/d ;
     " markdown.js >> markdown.clean.js

echo "return Markdown}());" >> markdown.clean.js;

java -jar closure/compiler.jar --js markdown.clean.js \
--compilation_level SIMPLE_OPTIMIZATIONS \
> markdown.cc.js

- js-Namespace-Schalter rettet den Tag

Dank Dean Burge für den Hinweis des Namespace-Schalters aus. Dies löste so ziemlich mein Problem, mit einem kleineren Hilfe Bit. Hier ist mein aktueller Build-Skript. I denken diese Fänge alle globalen Variablen ...

NS=N\$

haxe -cp ~/Projects/wmd-new -main Markdown --js-namespace $NS -js markdown.js 

# export our function and declare some vars
echo "this.markdown=(function(){var \$_,\$Main,\$closure,\$estr,js,"$NS"" > markdown.clean.js;

# strip silly lines containing "null;" or "else null;"
sed "/^[ \x09]*\(else \)\?null;$/d ;" markdown.js >> markdown.clean.js

# finish the closure
echo "return "$NS".Markdown.makeHtml}());" >> markdown.clean.js;
War es hilfreich?

Lösung

Ich verwende den Namespace-Schalter auf der Compiler diese globalen Stammtypen aufzuräumen.

Andere Tipps

Haxe ist nicht zum Schreiben einer isoliert wiederverwendbare Komponente in einer Javascript-Web-Anwendung verwendet werden soll. Dies wird durch die Tatsache belegt, dass der Compiler für jede goddamn Kompilation Standardbibliothek emittiert. Die meisten optimale Nutzung von Javascript Ziel ist es, eine Anwendung vollständig in haxe und rief externe Sachen mit untypisierten Blöcken zu schreiben gehofft, dass es nicht etwas brechen. Sie sollten haxe Ausgang wie ein Flash-Clip, ohne auf die Umwelt behandeln es in läuft, nimmt es ist das einzige, was läuft.

Oder Sie können den Code mit einem mit () Block versuchen gewickelt wird.

gibt es einen Namensraum (experimentell) haxe Compiler hier http://github.com/webr3/haxe

Der JSTM JavaScript Generator Makro optimiert haxe Ausgabe in einer Reihe von Möglichkeiten:

  1. die Javascript-Ausgang ist aufgeteilt in separate Dateien pro Typ
  2. diese Dateien optimiert
  3. ein Loader Skript lädt die erforderlichen Typen asynchron
  4. nur eine globale Variable verwendet: jstm
  5. nur Code, der tatsächlich benötigt wird Ihre Anwendung ausgeführt werden soll heruntergeladene
  6. neue Typen können zur Laufzeit geladen werden, die möglichst hoch skalierbare Anwendungen machen

Besuche http://code.google.com/p/jstm/ weitere Informationen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top