Aplicações desktop com GO e seu framework/lib front favorito
Sem dúvidas golang pode ser utilizado para criar aplicações performáticas. Algo que pode ser muito interessante é desenvolver aplicações desktop com a linguagem
Já conhecemos go pela sua perfomance e produtividade. Temos também bibliotecas incríveis que são muito utilizadas diariamente. Uma que tem chamado minha atenção é a incrível wails que nos permite escrever aplicações desktop utilizando GO no backend e tecnologias web, como (React, Vue, Angular, etc) para prover o front. Isso nos da muitas possibilidades (o showcase inclusive é incrível (wails-showcase)) e minha proposta é explorar o wails brevemente escrendo uma aplicação que faz scrap de links, então pegue sua cerveja!
Instalação wails
A instalação é simples e requer apenas alguns requisitos: wails-getting-started
Inicio projeto
Para inicializar um projeto wails é bem simples, seguido do comando: wails init
, algumas informações são solicitadas e ao final escolhemos qual tecnologia usaremos no front, usarei Vue 3:
Conceitos importantes
O binding de dados e comunicação entre o frontend -> backend no wails são obtidos através de dois grandes atores: Bindings e Eventos.
Bindings
No backend é possível bindar uma única função ou uma série de métodos de uma struct para que o frontend acesse facilmente esses métodos. O wails disponibiliza esses dados através de promises o que aumenta a facilidade de desenvolvimento / manutenção
Eventos
O wails também da ao desenvolvedor uma forma muito simples de emitir eventos, tanto no backend quanto no frontend. Dessa forma é possível alcançar muitas features legais como notificações realtime (Juntando isso com um framework/lib como o vue ou react da pra fazer muita coisa mara!)
Desenvolvendo a ferramenta
Vamos por etapas adicionando as dependências e codando features no backend e frontend
Backend
O esqueleto do backend que é gerado é muito simples e tem apenas uma função bindada no arquivo main.go
, vamos codar nosso scraper no arqivo scraper.go
, antes disso irei instalar a lib goquery, que é um parser html muito simples de se utilizar:
|
|
Feito isso podemos codar nossa funcionalidade de extrair links, abaixo deixo mais detalhes importantes sobre cada trecho
scraper.go
|
|
Logs e Runtime
|
|
Nos campos da struct Scraper
utilizamos dois elementos importantes do Wails: CustomLogger
e o Runtime
, o primeiro nos permite emitir logs personalizados e o segundo nos da capacidade de emitir eventos com facilidade, como mencionado no inicio do artigo.
O método WailsInit(runtime *wails.Runtime)
é nosso construtor que pode ser utilizado para algumas operações importantes antes de qualquer procedimento de fato nos métodos que são chamados pelo frontend.
Logo abaixo temos o método GetLinks(url string)
que acessa a url informada e extrai alguns links. Nesse método temos algumas operações do wails acontecendo que são importantes de mencionar, ex:
|
|
Quando temos um erro, emitimos o mesmo via o canal “error” e logamos o erro. Iremos escutar esse evento em breve no frontend. Emitir um evento do backend para o frontend é realmente simples!
Criado o arquivo podemos bindar o mesmo no arquivo main.go
:
|
|
Frontend
Agora para o front, podemos fazer tudo o que fariamos em um projeto front normal: Instalar dependências, estilizar aplicação e no final das contas fazer a comunicação com o backend.
Para estilizar utilizei as deps bootstrap
e bootstrap-vue
, para isso basta acessar a pasta frontend e utilizar o já conhecido: npm install x y z
.
Feito isso foi necessário uma modificação no arquivo frontend/src/main.js
:
|
|
Adicionando as linhas:
|
|
Feito isso criamos um componente para a feature frontend/src/components/Scraper.vue
:
|
|
Um componente muito simples. Que resulta no seguinte:
Trechos importantes
1 - Ao clicar no botão scrap, fazemos a chamada para o backend, para que isso seja possível, precisamos apenas desse trecho:
|
|
O método é acessado via window.backend.Struct.Method
, o retorno é obtido via promise. Ali é setado algumas variáveis para controle de loading, etc.
2 - Para receber os eventos de erro que podem acontecer no método GetLinks
lá do backend, fazemos o seuginte:
|
|
Utilizamos a função mounted
do vue para iniciar o componente escutando esses eventos e como tudo ocorre de forma async não corremos o perigo do freezing de GUI (Programadores java/c# sabem bem como é isso quando não abrimos aquela threadzinha separada da main hehe)
Feito isso podemos ir ao build!
Build
Para compilar a aplicação é simples: wails build -d
, feito isso será criado um binário em build/nome-app
Demo
Conclusão
Deixo aqui o ponta pé para você iniciar seu próximo projeto em wails! Um mundo de possibilidade te aguarda! (:
Caso queira dar uma olhada no repo exemplo: https://github.com/girorme/scraper