Question

Cette question applique uniquement à la version Haxe <2.10

Je connais au sujet haxe pendant un certain temps, mais jamais vraiment joué avec jusqu'à hier. Etre curieux, j'ai décidé de le port showdown.js , un port javascript de markdown.pl , à haXe. C'était assez simple, et le javascript qu'il génère semble fonctionner très bien ( modifier Si vous voulez le voir en action, vérifier ).

Cependant, je remarque que le code généré dépotoirs une tonne de choses dans l'espace de noms global ... et ce qui est pire, elle le fait en attribuant des valeurs à non déclarés identifiants sans utiliser le mot-clé var, donc ils sont même mondial si vous enveloppez le tout 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 ce avec sed, mais je suis aussi gêné par des trucs comme ça:

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

Ceci est javascript assez peu recommandables.


Questions

Y at-il une fourchette ou d'un clone de quelque part haxe qui ne polluent globals? Est-il utile de modifier la source haxe pour obtenir ce que je veux, ou a quelqu'un déjà résolu ce? Googler n'a pas tourné une grande partie. Je suis ouvert à toute suggestion. Pendant ce temps, je meurs d'envie de voir ce genre de code PHP va produire cette chose ...: D


Réponses?

Voici quelques-unes des idées que j'ai essayé:

post-traitement

Voici mon script humble de construction; il fait un très bon travail de décapage des choses, mais il ne saisit pas tout. Je hésite à supprimer les modifications des prototypes du constructeur intégré; Je suis sûr que romprait les choses. Fixation tout est peut-être un peu d'une tâche, et je ne veux pas commencer là-dessus si quelqu'un a déjà fait le travail ...

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

- commutateur js-namespace enregistre le jour

Merci à Dean Burge pour remarquer le commutateur d'espace de noms. Ce à peu près résolu mon problème, avec un petit peu d'aide. Voici mon script de compilation en cours. I pense ce prises 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;
Était-ce utile?

La solution

J'utilise l'espace de noms commutateur sur le compilateur pour nettoyer les types de racines globales vers le haut.

Autres conseils

Haxe est pas destiné à être utilisé pour écrire un composant réutilisable isolé dans une application web javascript. Ceci est démontré par le fait que le compilateur émet bibliothèque standard pour chaque compilation foutue. La plupart une utilisation optimale de la cible javascript est d'écrire une application entièrement en haxe et appeler des choses externes à l'aide de blocs non typées en espérant qu'il ne rien casser. Vous devez traiter la sortie haxe comme un clip flash, sans se soucier de l'environnement, il fonctionne en, suppose qu'il est le seul fonctionnement chose.

Ou vous pouvez essayer envelopper le code avec un bloc ().

il y a un compilateur haxe espaces de noms (de expérimentale) ici http://github.com/webr3/haxe

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

  1. la sortie javascript est divisé en fichiers séparés par type
  2. ces fichiers sont optimisés
  3. un script se charge du chargeur de manière asynchrone les types requis
  4. une seule variable globale est utilisée: jstm
  5. uniquement le code qui est réellement nécessaire pour faire fonctionner votre application est téléchargée
  6. nouveaux types peuvent être chargés à l'exécution qui rend possible des applications hautement évolutives

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top