Haxe para javascript sem poluição no namespace global?
Esta pergunta se aplica apenas à versão Haxe <2.10
Eu conheço o haxe há um tempo, mas nunca brinquei com ele até ontem. Sendo curioso, eu decidi portarshowdown.js, uma porta javascript demarkdown.pl, para haxe. Isso foi bem direto e o javascript gerado parece funcionar bem (editar: Se você quiser vê-lo em ação, confiraaqui)
No entanto, notei que o código gerado despeja uma tonelada de coisas no espaço de nomes global ... e o que é pior, ele faz isso atribuindo valores aidentificadores não declarados sem usar ovar
palavra-chave, para que sejam globais, mesmo que você encerre tudo.
Por exemplo...
if(typeof js=='undefined') js = {}
...
Hash = function(p) { if( p === $_ ) return; {
...
EReg = function(r,opt) { if( r === $_ ) return; {
...
Consegui limpar a maior parte disso com o sed, mas também estou incomodado com coisas 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);
}
}
Este é um javascript bastante desagradável.
QuestõesExiste um garfo ou clone de haxe em algum lugar que não polui os globais? Vale a pena modificar a fonte haxe para obter o que eu quero ou alguém já resolveu isso? O Google não apareceu muito. Estou aberto a sugestões. Enquanto isso, estou louco para ver que tipo de código PHP essa coisa vai produzir ...: D
Respostas?Aqui estão algumas das idéias que eu tentei:
pós-processamento
Aqui está o meu humilde script de construção; ele faz um bom trabalho de tirar as coisas, mas não pega tudo. Hesito em remover as modificações nos protótipos de construtores internos; Tenho certeza que isso iria quebrar as coisas. Consertar tudo pode ser um pouco complicado, e não quero começar se alguém já fez o trabalho ...
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
A opção --js-namespace salva o dia
Obrigado a Dean Burge por apontar a opção de namespace. Isso praticamente resolveu meu problema, com um pouco de ajuda. Aqui está o meu script de compilação atual. Eupensar isso pega todas as variáveis globais ...
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;