Pergunta

Esta questão se aplica apenas à versão Haxe <2.10

Eu conheço o haxe há algum tempo, mas nunca brinquei com ele até ontem.Por curiosidade, decidi portar confronto.js, uma porta javascript de markdown.pl, para haxe.Isso foi bastante simples e o javascript gerado parece funcionar bem (editar: Se você quiser vê-lo em ação, dê uma olhada aqui).

No entanto, notei que o código gerado despeja uma tonelada de coisas no namespace global...e o que é pior, ele faz isso atribuindo valores a identificadores não declarados sem usar o var palavra-chave, então eles são globais mesmo se você envolver tudo com um fechamento.

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 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ões

Existe um fork ou clone do haxe em algum lugar que não polua os globais?Vale a pena modificar a fonte do haxe para conseguir o que desejo ou alguém já resolveu isso?Pesquisando no Google não apareceu muito.Estou aberto a qualquer sugestão.Enquanto isso, estou morrendo de vontade de ver que tipo de código PHP essa coisa vai produzir...:D


Respostas?

Aqui estão algumas das ideias que experimentei:

pós-processamento

Aqui está meu humilde script de construção;ele faz um ótimo trabalho ao remover coisas, mas não captura tudo.Estou hesitante em remover as modificações nos protótipos do construtor integrado;Tenho certeza de que isso quebraria as coisas.Consertar tudo pode ser um pouco trabalhoso, e não quero começar se alguém já tiver feito 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

--js-namespace switch salva o dia

Obrigado a Dean Burge por apontar a mudança de namespace.Isso praticamente resolveu meu problema, com um pouco de ajuda.Aqui está meu script de construção atual.EU pensar isso captura 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;
Foi útil?

Solução

Eu uso o switch de namespace no compilador para limpar esses tipos de raiz globais.

Outras dicas

Haxe não se destina a ser usado para escrever um componente reutilizável isolado em um aplicativo web javascript.Isso é evidenciado pelo fato de que o compilador emite uma biblioteca padrão para cada compilação.O uso ideal do alvo javascript é escrever um aplicativo inteiramente em haxe e chamar coisas externas usando blocos não digitados, esperando que não quebre nada.Você deve tratar a saída haxe como um clipe de flash, indiferente ao ambiente em que é executado, assumindo que é a única coisa em execução.

Ou você pode tentar agrupar o código com um bloco with().

há um compilador haxe com namespace (experimental) aqui http://github.com/webr3/haxe

A macro do gerador JavaScript JSTM otimiza a saída haxe de várias maneiras:

  1. a saída javascript é dividida em arquivos separados por tipo
  2. esses arquivos são otimizados
  3. um script carregador carrega os tipos necessários de forma assíncrona
  4. apenas uma variável global é usada:jstm
  5. apenas o código realmente necessário para executar seu aplicativo é baixado
  6. novos tipos podem ser carregados em tempo de execução, o que possibilita aplicativos altamente escaláveis

Confira http://code.google.com/p/jstm/ para mais informações.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top