Haxe pour javascript sans pollution de l'espace de noms global?

Cette question s'applique uniquement à la version Haxe <2.10

Je connais à propos de haxe pendant un certain temps, mais je n'ai jamais vraiment joué avec ça jusqu'à hier. Étant curieux, j'ai décidé de montrer showdown.js , un port javascript de markdown.pl , à haxe. C'était assez simple, et le javascript qu'il génère semble fonctionner correctement ( éditer: si vous voulez le voir en action, vérifiez ici ).

Cependant, j'ai remarqué que le code généré supprime une quantité de choses dans l'espace de noms global … et ce qui est pire, il le fait en attribuant des valeurs aux identifiants non déclarés sans utiliser le mot-clé var , donc ils sont globaux même si vous enveloppez l'ensemble Chose avec une fermeture.

Par exemple…

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

J'ai réussi à nettoyer la plupart de cela avec sed, mais je suis également dérangé par des choses comme ceci:

 { 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); } } 

Il s'agit d'un javascript assez désagréable.


Des questions

Existe-t-il une fourche ou un clone de haxe quelque part qui ne pollue pas les globals? Est-il utile de modifier la source haxe pour obtenir ce que je veux ou quelqu'un a déjà résolu cela? Googling n'a pas beaucoup progressé. Je suis ouvert à toutes les suggestions. Pendant ce temps, je meurs d'envie de voir quel genre de code PHP cette chose va produire …: D


Réponses?

Voici quelques idées que j'ai essayées:

Post-traitement

Voici mon humble script de construction; Il fait un très bon travail de dépouillement, mais ça ne prend pas tout. Je hésite à supprimer les modifications apportées aux prototypes de constructeurs intégrés; Je suis sûr que cela briserait les choses. La résolution de tout peut être une tâche, et je ne veux pas commencer si quelqu'un a déjà travaillé …

 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 sauve le jour

Merci à Dean Burge de souligner le changement d'espace de noms. Cela a beaucoup résolu mon problème, avec peu d'aide. Voici mon script de construction actuel. Je pense que cela capture toutes les variables globales …

 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; 

J'utilise le commutateur d'espace de noms sur le compilateur pour nettoyer ces types de racine globaux.

Haxe n'est pas destiné à être utilisé pour écrire un composant réutilisable isolé dans une application Web javascript. Ceci est mis en évidence par le fait que le compilateur émet une bibliothèque standard pour toutes les compilations. L'utilisation optimale de la cible javascript est d'écrire une application entièrement dans haxe et d'appeler des éléments externes en utilisant des blocs non typés en espérant qu'il ne cesse de rien. Vous devriez traiter la sortie haxe comme un clip instantané, inconscient de l'environnement dans lequel il s'exécute, suppose que c'est la seule chose en cours d'exécution.

Ou vous pouvez essayer d'enrouler le code avec un avec () bloc.

Il y a un compilateur haxe nommé (expérimental) ici http://github.com/webr3/haxe

La macro générateur JSTM JavaScript optimise la sortie haxe de plusieurs façons:

  1. La sortie javascript est divisée en fichiers séparés par type
  2. Ces fichiers sont optimisés
  3. Un script de chargement charge les types requis de façon asynchrone
  4. Une seule variable globale est utilisée: jstm
  5. Seul le code requis pour exécuter votre application est téléchargé
  6. De nouveaux types peuvent être chargés au moment de l'exécution, ce qui permet des applications hautement évolutives

Consultez http://code.google.com/p/jstm/ pour plus d'informations.