Pregunta

Esta pregunta sólo se aplica a la versión Haxe <2,10

He conocido sobre haxe por un tiempo, pero nunca jugado con él hasta ayer. Ser curioso, decidí puerto showdown.js , un puerto de JavaScript markdown.pl , a haxe. Esto fue bastante sencillo, y el código JavaScript que genera parece correr bien ( editar Si desea verlo en acción, comprobar que funciona aquí ).

Sin embargo, me di cuenta de que el código generado vuelca un montón de cosas en el espacio de nombres global ... y lo que es peor, lo hace mediante la asignación de valores a no declarados identificadores sin utilizar la palabra clave var, por lo Están incluso global si usted envuelve todo con un cierre.

Por ejemplo ...

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

Me las arreglé para limpiar la mayor parte de eso con sed, pero también estoy preocupado por cosas como esta:

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

Esto es algo de JavaScript bastante desagradable.


Preguntas

¿Hay un tenedor o un clon de alguna parte que no lo hace haxe globales contaminar? ¿Vale la pena para modificar la fuente haxe para conseguir lo que quiero, o alguien ya ha resuelto este? Googlear no ha aparecido mucho. Estoy abierto a cualquier sugerencia. Mientras tanto, me muero por ver qué tipo de código PHP de esta cosa va a producir ...: D


Respuestas?

Estas son algunas de las ideas que he probado:

postprocesado

Esta es mi humilde escritura de la estructura; hace un trabajo bastante bueno de despojar materia hacia fuera, pero no captura todo. Estoy indeciso para eliminar las modificaciones a la incorporada en el constructor de prototipos; Estoy seguro de que pudiera romper cosas. La fijación de todo podría ser un poco de una tarea, y yo no quiero empezar en él si alguien ya ha hecho el trabajo ...

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

- interruptor JS-espacio de nombres salva el día

Gracias a Dean Burge para señalar el conmutador de espacio de nombres. Esto resolvió más o menos mi problema, con un poco de ayuda de menor importancia. Aquí está mi escritura de la estructura actual. I que Esto llama todas las 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;
¿Fue útil?

Solución

Yo uso el interruptor href="http://haxe.org/doc/compiler" rel="noreferrer"> para limpiar esos tipos de raíces globales arriba.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top