Desenvolvimento

6 mar, 2017

Compilando projetos ClojureScript sem a JVM

Publicidade

Desde que veio à tona que ClojureScript pode compilar a si mesmo, eu tenho sonhado um dia ser capaz de compilar um projeto ClojureScript sem instalar Java. Embora projetos como Planck e Lumo possam executar formulários ClojureScript arbitrários no REPL ou executar scripts ClojureScript, nenhum deles realmente apoiou completamente a compilação de um projeto ClojureScript inteiro. Até agora.

Espere aí… o quê?!

É isso mesmo. Desde a versão 1.2.0, o Lumo pode compilar projetos ClojureScript, assim como o compilador comum baseado em JVM ClojureScript. E sabe de uma coisa? Graças ao google-closure-compiler-js, o JavaScript gerado pode ser otimizado e se beneficiar da eliminação de código morto também! Esse é um grande passo à frente no ser capaz de compilar código-fonte ClojureScript antes do tempo em pacotes JavaScript otimizados usando nada além de Lumo e Node.js.

Fazer esse trabalho significava portar o código baseado em JVM no compilador ClojureScript para trabalhar em Lumo e na plataforma Node.js. Embora a maior parte tenha sido geralmente direta, a alteração da API de compilação JVM síncrona para a API assíncrona ClojureScript auto-hospedada representou a maior quantidade de trabalho até agora.

Compilar projetos ClojureScript com o Lumo não requer dependências externas (como a Biblioteca Google Closure), além das exigidas pelos próprios projetos, pois todas as dependências necessárias do compilador estão agrupadas dentro do único executável Lumo.

Vá em frente e instale a versão mais recente do Lumo para experimentar esse recurso. Certifique-se de obter a versão 1.2.01.

Exemplo

Considere, por exemplo, esta pequena seção do guia Quick Start do ClojureScript. Simplesmente alterando cljs.build.api para lumo.build.api, podemos começar a compilar o projeto de amostra do Guia Quick Start sem a JVM, hoje. Além disso, vamos usar otimizações avançadas imediatamente para que possamos ver a versão JavaScript do Google Closure Compiler em ação. Este é o aspecto do nosso arquivo build.cljs:

(require '[lumo.build.api :as b])

(b/build "src"
  {:main 'hello-world.core
   :output-to "main.js"
   :optimizations :advanced
   :target :nodejs})

Vamos agora executar o script de compilação com o Lumo. Não se esqueça de adicionar a pasta src ao classpath para que Lumo saiba onde encontrar o projeto. Isso pode ser feito com a opção de linha de comando -c / – classpath (dica: execute lumo -h para todas as opções disponíveis).

$ lumo --classpath src build.cljs

Depois de esperar alguns minutos, devemos ser capazes de executar o nosso projeto recém-compilado com node main.js. Isso não é muito legal?!

Ressalvas

Esse novo recurso não traz poucas modificações. Os mais óbvios, e também o mais difíceis de resolver a curto prazo, estão descritos abaixo.

Bloqueio da versão ClojureScript

Lumo tem embarcada sua própria versão do compilador ClojureScript. Isso significa que, por enquanto, não é possível compilar projetos ClojureScript em versões do ClojureScript diferentes daquelas que estão no Lumo. Embora essa ressalva possa ser contornada no futuro, ela é o que nos permite não exigir quaisquer dependências externas ao compilar projetos ClojureScript com Lumo.

Google Closure Compiler JS

O Google Closure Compiler JS é uma porta JavaScript da versão Java, gerada usando o GWT. Isso faz com que leve mais tempo para otimizar o código quando comparado à versão Java. Além disso, ele navega com menos recursos do que o seu homólogo Java, tanto porque nem todos os recursos incluídos na versão Java são portáteis para JavaScript, como porque é um projeto bastante novo, apenas anunciado no final de agosto de 2016.

Conclusão

Este lançamento do Lumo representa muita coisa. Que eu saiba, não existe outro esforço para compilar e otimizar projetos ClojureScript com o Google Closure Compiler sem exigir uma instalação JVM. Mas nós só estamos no início, na superfície, e há uma quantidade igualmente grande de trabalho que ainda está por fazer, a fim de alcançar a paridade de recursos com o atual compilador ClojureScript na JVM.

Essa característica do Lumo deve ser considerada pré-alfa e vamos continuar a melhorá-la com os próximos lançamentos. Eu decidi lançá-la, no entanto, com o objetivo de reunir feedback inicial e espero atrair alguns novos colaboradores para Lumo. Por favor,  nos informe problemas e, se você quiser ajudar, entre em contato (por exemplo, no Twitter)!

Como observação final, nenhuma JVMs foi gerada durante o processo de escrever este artigo.

 

1 Lumo 1.2.0 ainda não está na Homebrew devido a problemas técnicos. Você pode instalar a partir do master com brew install – HEAD lumo.

 

Obrigado a Mike Fikes e David Nolen por lerem um rascunho deste artigo.

 

***

António Nuno Monteiro faz parte do time de colunistas internacionais do iMasters. A tradução do artigo é feita pela Redação iMasters, com autorização do autor, e você pode acompanhar o artigo em inglês no link: https://anmonteiro.com/2017/02/compiling-clojurescript-projects-without-the-jvm/