Haxe für Javascript ohne globale Namespace-Verschmutzung?

Diese Frage gilt nur für Haxe Version <2.10

Ich habe eine Weile von Haxe gewusst, aber erst gestern wirklich damit gespielt. Da ich neugierig war, entschied ich mich für port showdown.js, ein Javascript-Port von markdown.pl, um zu haxen. Das war ziemlich unkompliziert und das erzeugte Javascript scheint gut zu laufen bearbeiten Wenn Sie es in Aktion sehen möchten, probieren Sie es ausHie).

Ich habe jedoch festgestellt, dass der generierte Code eine Menge Daten im globalen Namespace ablegt ... und was noch schlimmer ist, dies geschieht durch Zuweisen von Werten zu undeclared Bezeichner ohne dasvar Schlüsselwort, so dass sie global sind, auch wenn Sie das Ganze mit einem Abschluss abschließen.

Beispielsweise..

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

Ich habe es geschafft, das meiste mit sed aufzuräumen, aber es stört mich auch so:

{
 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 etwas ziemlich unappetitliches Javascript.

Frage

Ist da irgendwo eine Gabel oder ein Klon von Haxe, der die Welt nicht verschmutzt? Lohnt es sich, die Haxe-Quelle zu ändern, um das zu bekommen, was ich will, oder hat dies bereits jemand gelöst? Googeln ist nicht viel aufgetaucht. Ich bin offen für Vorschläge. In der Zwischenzeit bin ich gespannt, welchen PHP-Code das Ding produzieren wird ...: D

Antworten?

Hier sind einige der Ideen, die ich ausprobiert habe:

Nachbearbeitun

Ist hier mein bescheidenes Erstellungsskript; Es macht einen ziemlich guten Job, wenn es Dinge ausräumt, aber es fängt nicht alles auf. Ich zögere, die Änderungen an den integrierten Konstruktorprototypen zu entfernen. Ich bin sicher, das würde die Dinge kaputt machen. Alles zu reparieren könnte eine kleine Aufgabe sein, und ich möchte nicht damit beginnen, wenn jemand die Arbeit bereits erledigt hat ...

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 spart den Tag

Danke an Dean Burge für den Hinweis auf den Namespace-Schalter. Dies löste mein Problem mit ein wenig Hilfe. Hier ist mein aktuelles Build-Skript. ICHdenke das fängt alle globalen Variablen ab ...

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;

Antworten auf die Frage(8)

Ihre Antwort auf die Frage