Aleksei Grachev: Go Frontend

Kyiv Go Meetup Maio 2018:

Aleksei Grachev: Go Frontend

Apresentador: – Olá a todos! Obrigado por estarem aqui! Hoje temos dois palestrantes oficiais – Lyosha e Vanya. Haverá mais dois, se tivermos tempo. O primeiro palestrante é Aleksey Grachev, que nos falará sobre GopherJS.

Aleksey Grachev (daqui em diante – AG): – Sou desenvolvedor Go e escrevo serviços web em Go. Às vezes, preciso lidar com o frontend, e em algumas ocasiões preciso entrar lá manualmente. Quero compartilhar minhas experiências e pesquisas sobre Go no frontend.

A ideia é a seguinte: primeiro falaremos sobre por que queremos rodar Go no frontend, depois discutiremos como isso pode ser feito. Existem dois caminhos – Web Assembly e GopherJS. Vamos ver em que estado esses soluções estão e o que pode ser feito.

O que há de errado com o frontend?

Todos concordam que está tudo bem com o frontend?

Aleksei Grachev: Go Frontend

Poucos testes? Compilação lenta? Ecossistema? Tudo certo.

Quanto ao frontend, gosto de uma citação que um dos desenvolvedores frontend disse em seu livro:

Aleksei Grachev: Go Frontend

JavaScript não tem sistema de tipos. Agora vou mencionar os problemas que encontrei ao longo do meu trabalho e explicar como eles são resolvidos.

Na verdade, é difícil chamar o sistema de tipos de sistema de tipos em JavaScript – há strings que designam o tipo de objeto, mas na verdade isso não tem relação alguma com tipos. Este problema foi resolvido no TypeScript (uma camada sobre JavaScript) e no Flow (verificador estático de tipos em JavaScript). Na verdade, o frontend já chegou à solução do problema do fraco sistema de tipos em JavaScript.

Aleksei Grachev: Go Frontend

Não há uma biblioteca padrão no navegador como tal – existem alguns objetos embutidos e funções "mágicas" nos navegadores. Mas em JavaScript, a biblioteca padrão não existe. Este problema já foi resolvido pelo jQuery (todos usavam jQuery com todos os protótipos, helpers, funções necessárias para funcionar). Atualmente, todos usam Lodash:

Aleksei Grachev: Go Frontend

Callback hell. Creio que todos já viram código em JavaScript há cerca de 5 anos, e ele parecia uma "macarronada" de callbacks incrivelmente entrelaçados. Agora, esse problema foi resolvido (com o lançamento do ES-15 ou ES-16), promessas (promises) foram adicionadas ao JavaScript e todos puderam respirar um pouco mais fácil por um tempo.

Aleksei Grachev: Go Frontend

Até que chegou o Promice hell… Não sei como a indústria do frontend consegue, mas eles constantemente se empurram para caminhos estranhos. Acabaram fazendo hell até com "promises". Depois, resolveram esse problema adicionando um novo primitivo – async/await:

Aleksei Grachev: Go Frontend

O problema com a assíncrono está resolvido. Async/await é um primitivo bastante popular em várias linguagens. Em Python e em outras, existe essa abordagem – ela é bastante boa. O problema está resolvido.

Qual problema não foi resolvido? A crescente complexidade geométrica dos frameworks, a complexidade do ecossistema e da própria programação.

Aleksei Grachev: Go Frontend

  • A sintaxe do JavaScript é um pouco estranha. Todos nós conhecemos os problemas com a soma de arrays e objetos e outras peculiaridades.
  • JavaScript é multiparadigma. Agora, isso é um sistema particularmente relevante, pois o ecossistema é muito grande:
    • todos escrevem em estilos diferentes – alguns escrevem de forma estrutural, outros funcionalmente, diferentes desenvolvedores escrevem de maneiras diferentes;
    • de diferentes pacotes (packages) vêm diferentes paradigmas, quando você utiliza pacotes diversos;
    • há muita 'diversão' com programação funcional em JavaScript – apareceu a biblioteca Ramda e agora ninguém consegue ler programas escritos nessa biblioteca.

  • Tudo isso traz um grande impacto no ecossistema, que cresceu de forma incrível. Os pacotes são incompatíveis entre si: alguns usam promessas, outros async/await, e alguns callbacks. E ainda escrevem em paradigmas diferentes!
  • Isso leva a dificuldades na manutenção do projeto. É complicado encontrar bugs se você não consegue ler o código.

O que é Web Assembly?

Os competentes pessoal da Mozilla Foundation e de outras empresas criaram algo chamado Web Assembly. O que é isso?

Aleksei Grachev: Go Frontend

  • É uma máquina virtual embutida no navegador que suporta um formato binário.
  • Programas binários vão para lá e são executados praticamente de forma nativa, ou seja, o navegador não precisa interpretar todo o 'macarrão' do código JavaScript a cada vez.
  • Todos os navegadores declararam suporte.
  • Como é bytecode, você pode escrever um compilador para qualquer linguagem.
  • Os quatro principais navegadores já vêm com suporte ao Web Assembly.
  • Em breve, esperamos suporte nativo em Go. Essa nova arquitetura já foi adicionada: GOARCH=wasm GOOS=js (em breve). Por enquanto, pelo que entendo, ela não está funcional, mas há uma declaração de que isso definitivamente estará no Go.

O que fazer agora? GopherJS

Enquanto não temos suporte ao Web Assembly, existe um transpiler chamado GopherJS.

Aleksei Grachev: Go Frontend

  • O código em Go é transpileado para 'JavaScript limpo'.
  • Ele é executado em todos os navegadores – não há novos recursos que são suportados apenas por navegadores modernos (é Vanilla JS, que roda em qualquer coisa).
  • Há suporte para quase tudo que existe no Go, incluindo goroutines e canais… – tudo o que amamos e conhecemos.
  • Praticamente toda a biblioteca padrão é suportada, exceto aqueles pacotes que não fazem sentido ser suportados no navegador: syscall, interações de rede (existe um cliente net/http, mas não um servidor, e o cliente é emulado através do XMLHttpRequest). Em geral, toda a biblioteca padrão está disponível – aqui está ela no navegador, aqui está a stdlib Go que amamos.
  • Todo o ecossistema de pacotes em Go, todas as soluções de terceiros (templatização e outras) podem ser compiladas usando GopherJS e executadas no navegador.

Obter GopherJS é muito fácil – é um pacote Go comum. Fazemos go get e temos o comando GopherJS para compilar o aplicativo:

Aleksei Grachev: Go Frontend

Aqui está um pequeno hello world…

Aleksei Grachev: Go Frontend

…Um programa Go comum, o pacote fmt da biblioteca padrão, e o Binding Js para acessar a API do navegador. O Println no final será convertido em console log e o navegador escreverá 'Hello gophers'! É assim tão simples: fazemos GopherJS build – executamos no navegador – tudo funciona!

O que temos até agora? Bindings

Aleksei Grachev: Go Frontend

Existem bindings para todos os frameworks js populares:

  • JQuery;
  • Angular.js;
  • D3.js para criação de gráficos e manipulação de grandes dados;
  • React.js;
  • VueJS;
  • até suporte para Electron (ou seja, já podemos escrever aplicativos desktop em 'Electron');
  • e o mais divertido – é o WebGL (podemos criar aplicativos holográficos, incluindo jogos com gráficos 3D, música e todas as funcionalidades);
  • e muitos outros bindings para todos os frameworks e bibliotecas javascript populares.

Framework

  1. Já existe um framework web desenvolvido especificamente para GopherJS – Vecty. É um equivalente completo do React.js, mas desenvolvido em Go, com a especificidade do GopherJS.
  2. Existem motores de jogo (surpreendentemente!). Eu encontrei os dois mais populares:
    • Engo;
    • Ebiten.

Vou demonstrar alguns exemplos de como isso fica e o que já podemos escrever em Go:

Aleksei Grachev: Go Frontend

Ou essa opção (não achei um jogador 3D, mas pode ser que exista):

Aleksei Grachev: Go Frontend

O que eu proponho?

Atualmente, a indústria de frontend está em um estado em que todas as linguagens que anteriormente se lamentavam sobre Javascript estão agora entrando. Agora todos estarão se compilando para 'Web Assembly'. O que precisamos para ocupar um lugar digno lá como 'gophers'?

Aleksei Grachev: Go Frontend

No Go, é tradicionalmente visto como uma linguagem de programação de sistema, e praticamente não existem bibliotecas para trabalhar com UI. Há algo, mas está meio abandonado e meio funcional.

E agora – é uma boa oportunidade para fazer bibliotecas de UI em Go, que serão executadas no GopherJS! Finalmente, é possível escrever seu próprio framework! Chegou o momento em que você pode criar um framework que será um dos primeiros e obterá adoção precoce, e você será uma estrela (se for um bom framework).

É possível adaptar uma infinidade de pacotes que já existem no ecossistema Go para a especificidade do navegador (por exemplo, um motor de template). Eles já funcionam, e você pode criar wrappers convenientes para renderizar conteúdo diretamente no navegador. Além disso, você pode criar, por exemplo, um serviço que consiga renderizar a mesma coisa no servidor e no frontend, usando o mesmo código – tudo como os desenvolvedores de frontend gostam (só que agora em Go).

Você pode criar um jogo! Apenas por diversão…

Isso é tudo.

Aleksei Grachev: Go Frontend

Perguntas

Pergunta (a seguir – P): – Eu escrevo em Go ou em Js?

AG: – Você escreve em Go, com goroutines, canais, estruturas, embedding – tudo... Você se inscreve em um evento, passa uma função para lá.

P: – Então, eu estou escrevendo em "JavaScript puro"?

AG: – Não, você está escrevendo como se fosse em Go e se conectando à API do navegador (a API, por sua vez, não mudou). Você pode escrever seus próprios wrappers para que mensagens cheguem ao canal – não é difícil.

P: – E quanto ao mobile?

AG: – Eu definitivamente vi: há bindings para o patch do Cordova, que o Js executa. No React Native – não sei; pode haver, pode não haver (não me interessei muito). O motor de jogo N-go suporta aplicativos móveis – tanto iOS quanto Android.

P: – Pergunta sobre Web Assembly. O espaço está ocupando cada vez mais, apesar da compressão, "zipagem"... Não estaremos destruindo ainda mais o mundo do frontend desse jeito?

AG: – Web Assembly é um formato binário, e binário por padrão não pode ser maior no release final do que texto... Você está puxando runtime, mas isso é o mesmo que puxar a biblioteca padrão do Javascript quando ela não está lá, então usamos algum Lodash. Não sei quanto o Lodash ocupa.

P: – Claramente menos do que o runtime…

AG: – Em Javascript "puro"?

P: – Sim. Estamos comprimindo antes de enviar...

AG: – Mas isso é um texto… Em geral, um megabyte parece muito, mas é tudo (você tem todo o runtime). Depois, você escreve sua lógica de negócios, que aumentará seu binary em 1%. Até agora, não vejo isso como um problema para o frontend. Além disso, o Web Assembly funcionará mais rápido que o Javascript por uma razão óbvia – ele não precisa ser analisado.

P: – Por enquanto, é um ponto controverso… Ainda não existe uma implementação padrão do "Vasm" (Web Assembly) para que possamos julgar de forma inequívoca. Conceitualmente – sim: todos nós entendemos que o binary deve ser mais rápido, mas a implementação atual do V8 é muito eficiente.

AG: – Sim.

P: – A compilação lá realmente funciona muito bem e não é fato que haverá uma grande vantagem.

AG: – O Web Assembly também é feito por grandes caras.

P: – Por enquanto, parece que ainda é difícil julgar sobre o Web Assembly. Já há anos estamos discutindo, mas as realizações reais que podemos tocar são poucas.

AG: – Tal vez. Vamos ver.

P: – Não temos problemas no backend… Talvez, deixar esses problemas no frontend? Por que me meter lá?

AG: – Temos que manter uma equipe de frontenders.

Por que no hosting comum a administração do PrestaShop é lenta, e no seu não é?

Um pouco de publicidade 🙂

Obrigado por permanecer conosco. Você gosta dos nossos artigos? Quer ver mais materiais interessantes? Apoie-nos fazendo um pedido ou recomendando para conhecidos. VPS em nuvem para desenvolvedores a partir de $4.99, uma alternativa única aos servidores entry-level, que criamos para você: Toda a verdade sobre VPS (KVM) E5-2697 v3 (6 Núcleos) 10GB DDR4 480GB SSD 1Gbps a partir de $19 ou como dividir um servidor corretamente? (disponíveis opções com RAID1 e RAID10, até 24 núcleos e até 40GB DDR4).

Dell R730xd por 2 vezes mais barato no datacenter Equinix Tier IV em Amsterdã? Somente conosco 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100TB a partir de $199 na Holanda! Dell R420 — 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB — a partir de $99! Leia sobre Como construir uma infraestrutura de classe corporativa utilizando servidores Dell R730xd E5-2650 v4 com custo de 9000 euros por centavos?

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster