Haxe JavaScript y sin contaminación espacio de nombres global?
-
26-09-2019 - |
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;
Solución
Yo uso el interruptor href="http://haxe.org/doc/compiler" rel="noreferrer"> para limpiar esos tipos de raíces globales arriba.
Otros consejos
Haxe no está destinado a ser utilizado para la escritura de un componente reutilizable aislado en una aplicación web javascript. Esto se evidencia por el hecho de que el compilador emite biblioteca estándar para cada compilación maldito. La mayor uso óptimo de la meta Javascript es escribir una aplicación completamente en haxe y llamar a las cosas externas utilizando bloques sin tipo con la esperanza de que no se rompa nada. Debe tratar de salida haxe como un clip de destello, ajeno al entorno en el que se ejecuta, asume que es la única cosa que está funcionando.
O usted podría tratar de envolver el código con un bloque con ().
hay un espacio de nombres (experimental) compilador haxe aquí http://github.com/webr3/haxe
La macro generador JSTM JavaScript optimiza la salida haxe en un número de maneras:
- la salida Javascript se divide en archivos separados por tipo
- estos archivos están optimizados
- Un cargador de cargas de guión los tipos requeridos de forma asíncrona
- sólo una variable global se utiliza: jstm
- único código que realmente se requiere para ejecutar la aplicación se descarga
- nuevos tipos se puede cargar en tiempo de ejecución que hace posibles aplicaciones altamente escalables
http://code.google.com/p/jstm/ más información.