Toda mudança, mesmo uma mudança para melhor,
sempre inconveniente
Richard Hooker
Como você deve saber, o Vaadin é uma das estruturas da web Java mais populares:
Mais recentemente, foi lançada uma nova versão dessa estrutura para o desenvolvimento da interface do usuário da Web, o Vaadin 10. Existem poucas publicações em russo sobre o Vaadin 10 e o Vaadin Flow, e esta publicação foi criada para preencher essa lacuna.
Os criadores posicionam o Vaadin Flow como uma nova estrutura da Web Java para o desenvolvimento de aplicativos e sites modernos (aqui eu não acredito muito neles). Isso faz parte da Vaadin Platform, que substitui outro produto - o Vaadin Framework, que permite desenvolver aplicativos da Web (ou, para ser mais preciso, a interface do usuário da Web) usando o padrão Java Web Components.
Aqui na mente do leitor, provavelmente tudo já estava confuso, todos esses Vaadin Bla Bla, a estrutura, a plataforma e assim por diante. O que está havendo?
Estamos usando o Vaadin como parte de nossa
plataforma CUBA para sistemas de back-office de interface do usuário por 7 anos e, durante esse tempo, acumulamos muita experiência trabalhando com ele, portanto não podemos deixar de nos preocupar com o destino dele. Abaixo do corte, você encontrará minhas especificações sobre o Vaadin 10.
Quadro Vaadin
Vaadin é uma empresa finlandesa que desenvolve ferramentas e bibliotecas para o desenvolvimento de UI. Eles criam a estrutura com o mesmo nome para desenvolvimento web em Java.
O Vaadin Framework é uma estrutura de interface do usuário com um modelo de programação do servidor no qual toda a lógica da interface do usuário e seu estado estão localizados no servidor, e apenas o código da interface do usuário dos componentes é executado no navegador. De fato, essa é uma tecnologia de thin client em que o navegador exibe apenas o que o servidor diz e todos os eventos são enviados ao servidor.
A abordagem do lado do servidor permite esquecer o fato de que o desenvolvimento é realizado na Web e desenvolver a interface do usuário como um aplicativo Java de desktop com acesso direto aos dados e serviços no servidor. Ao mesmo tempo, o Vaadin cuidará da exibição da interface do usuário no navegador e da interação AJAX entre o navegador e o servidor. O mecanismo Vaadin renderiza a interface do usuário do aplicativo do servidor no navegador e implementa todos os detalhes da troca de clientes e servidores.

Essa abordagem tem muitas vantagens:
- O código Java é mais fácil de escrever e depurar
- Você pode usar as bibliotecas e ferramentas Java existentes (IDEs, compiladores, testes)
- Não é necessário desenvolvimento de serviço da web
- A segurança é melhor
E contras:
- Precisa de muita memória no servidor para visualização da interface do usuário
- Solução difícil de dimensionar
- Ao desenvolver widgets, você precisa desenvolver uma API Java
Com base nesses pontos positivos e negativos, o Vaadin FW se estabeleceu precisamente no desenvolvimento empresarial, onde as cargas são previsíveis e a velocidade e a facilidade do desenvolvimento são muito mais importantes que o custo de ferro e memória.
O que aconteceu com o Google Web Toolkit
Sempre que o Vaadin é familiar ao público em geral, a parte do cliente do Vaadin FW estava inextricavelmente vinculada a outro produto conhecido - o Google Web Toolkit (GWT). Esse conjunto tornou possível escrever os componentes da interface do usuário e a API do servidor para eles em um idioma - Java, o que era bastante conveniente.
Nos últimos anos, o Google Web Toolkit não se desenvolveu e, desde 2015, todos aguardamos o aparecimento do GWT 3.0 / J2CL, anunciado no GWT.
Um evento importante aconteceu neste período estagnado (2015-2017): a especificação Web Components e outra estrutura do Google, Polymer, apareceram. Aparentemente, este foi o começo do fim do GWT.
Vale ressaltar que o GWT 3 está sendo desenvolvido como uma estrutura interna do Google e seu desenvolvimento é realizado internamente. Portanto, a comunidade não pode influenciar o processo de forma alguma, ou pelo menos não perceber que o processo está em andamento.
No contexto dessa estagnação, a equipe Vaadin tomou uma decisão difícil de abandonar completamente o desenvolvimento no GWT e
reescrever a parte do cliente de sua estrutura . Essas mudanças não poderiam passar despercebidas e assustaram todos os que já estão desenvolvendo o Vaadin.
Componentes da Web
Componentes da Web é um conjunto de padrões. Foi proposto e promovido ativamente pelos caras do Google, mas a iniciativa já foi apoiada no Mozilla. Essencialmente, essas são tecnologias para a criação de componentes de interface do usuário para a Web, para que eles suportem o encapsulamento de comportamento e apresentação. E a principal vantagem é a possibilidade de reutilização.
Conceitos chave:
- Elementos personalizados - API para criar seus elementos HTML
- O Shadow DOM é uma ferramenta para encapsular componentes HTML e isolar sua apresentação visual das regras globais de CSS. Em resumo, você pode criar um componente, por exemplo, um formulário de pedido e não ter medo de que seus estilos sejam quebrados em algumas das páginas do site devido às regras CSS desta página.
- Modelos HTML - a capacidade de colocar blocos passivos contendo elementos em branco do DOM em um documento HTML. Esses blocos são analisados pelo navegador, mas não são renderizados ou executam seu código. Eles são sugeridos para serem usados como modelos para renderização de dados.
- Importações HTML - a capacidade de importar um documento HTML como um módulo com todo o seu layout, estilos e JS
Por exemplo, se você agora olhar para a árvore DOM do YouTube, encontrará o uso de Elementos personalizados e DOM da sombra:

Todas essas coisas permitem que você escreva novos componentes de interface do usuário modernos para a web.
Vale admitir que o suporte ao navegador está longe de ser perfeito e ainda
são necessários polyfills , por exemplo, para o Edge.
Polímero
O Polymer é uma pequena biblioteca sobre os padrões de componentes da Web projetados para simplificar seu uso. Um exemplo:
De fato, o Polymer faz tudo o que o GWT fazia antes, mas, ao mesmo tempo, é compatível com qualquer componente JS e outras estruturas, por exemplo, React e Angular.
Componentes Vaadin
De volta a Vaadin. Há muito tempo, a Vaadin fabrica um produto chamado
Vaadin Components - componentes de interface do usuário para desenvolvedores de front-end que podem ser incorporados a qualquer aplicativo JS.

Esses componentes são baseados em Web Components e Polymer!
Como vemos agora, era um aeródromo de backup para o Vaadin Framework, o que nos permitiu sair do Google Web Toolkit e desenvolver uma nova estrutura para a qual os componentes ainda não existiam. O problema do ovo e da galinha foi resolvido e o Vaadin Components se tornou o front-end do próximo Vaadin 10.
Fluxo de Vaadin
O Vaadin 8 incluiu um mecanismo de sincronização do estado da interface do usuário e suporte para um protocolo RPC bidirecional (chamada de procedimento remoto). Isso foi possível graças ao GWT, pois as interfaces e classes comuns do servidor e do cliente foram escritas em Java.
Juntamente com o abandono do GWT, foi necessário implementar um novo mecanismo que permitisse uma integração transparente com o frontend JS e o backend Java. Esse mecanismo era o Vaadin Flow (e esse nome também é usado há muito tempo para se referir a todo Vaadin 10).
A
documentação do Flow possui este esquema:

Seu principal significado é o seguinte:
- A sincronização do estado da interface do usuário do servidor para o cliente é suportada
- a parte do servidor pode se inscrever nos eventos dos componentes da interface do usuário e uma solicitação AJAX será executada
- lógica de negócios é executada no servidor, apenas os dados exibidos na interface do usuário são carregados no navegador da web
- o lado do servidor usa Java
- o cliente pode usar modelos HTML, CSS, JS e Polymer
Para mim, isso significa que o Vaadin terá mais tecnologias front-end e agora o Java por si só não é suficiente (para o Vaadin 8, o Java seria o suficiente para você e o HTML / CSS não seria necessário). Por outro lado, a fácil integração do código JS agora é possível.
Plataforma Vaadin
Cada componente do Vaadin 10 é desenvolvido separadamente e nas melhores tradições do mundo JS - pequenos módulos que são tão independentes quanto possível um do outro. Ao mesmo tempo, a parte do cliente dos componentes é empacotada em um JAR no formato WebJARs:
www.webjars.orgIsso é um pouco assustador, especialmente se você observar o design mínimo:

Para controlar de alguma forma esse caos, um projeto de BOM (Bill of Materials) chamado
Vaadin Platform apareceu .
Este não é um produto independente, mas apenas uma lista de versões compatíveis de componentes e ferramentas projetadas no formato
Maven BOM .
Ele se conecta ao Maven da
seguinte maneira :
<dependencyManagement> <dependencies> <dependency> <groupId>com.vaadin</groupId> <artifactId>vaadin-bom</artifactId> <version>${vaadin.platform.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
Recursos do Vaadin 10
Total, toda a estrutura consiste em 3 componentes:
- Componentes Vaadin - frontend
- Vaadin Flow - transporte
- API de componentes do servidor - API Java para componentes da interface do usuário
Vale a pena iniciar o desenvolvimento com o
tutorial oficial .
Além disso, recomendo um
novo webinar .
Iniciantes
Você pode se familiarizar com a estrutura na
página . Lá você encontrará exemplos de projetos, incluindo o full-stack baseado no Spring Boot.
Fãs
ardentes do Spring Boot podem prosseguir diretamente para
start.spring.io e selecionar Vaadin entre os frameworks da web.
Um projeto mínimo pode ser iniciado com uma classe Java, por exemplo:
Em geral, você pode escrever no Vaadin 10, como no Vaadin 8, MAS! Você deve definitivamente olhar
para a página de correspondência de componentes .
API do elemento
Recurso assassino Vaadin 10 - controle elementos DOM diretamente do código Java do lado do servidor.
Element nameField = ElementFactory.createInput(); nameField.setAttribute("id", "nameField"); nameField.setAttribute("placeholder", "John Doe"); nameField.setAttribute("autofocus", "");
Você também pode gerenciar atributos que já estão afixados:
Obviamente, isso não substitui os componentes da interface do usuário, mas uma boa API para alterações simples de layout ao desenvolver componentes da interface do usuário não é necessária.
Ligação de dados
Para trabalhar com componentes que implementam a interface HasValue (obter / definir valor e ValueChangeListener), existe uma classe Binder conveniente:
Binder<Person> binder = new Binder<>(); TextField titleField = new TextField(); binder.forField(titleField) .bind( Person::getTitle, Person::setTitle);
Como você pode ver no exemplo, a ligação digitada estaticamente com base nas expressões lambda é suportada.
Além disso, os binders podem instalar conversores e validadores de valor:
binder.forField(yearOfBirthField)
Templates
Os modelos HTML estão formatados:
<link rel="import" href="../bower_components/polymer/polymer-element.html"> <link rel="import" href="../bower_components/paper-input/paper-input.html"> <dom-module id="hello-world"> <template> <div> <paper-input id="inputId" value="{{userInput}}"></paper-input> <button id="helloButton" on-click="sayHello">Say hello</button> <div id="greeting">[[greeting]]</div> </div> </template> <script> class HelloWorld extends Polymer.Element { static get is() { return 'hello-world' } } customElements.define(HelloWorld.is, HelloWorld); </script> </dom-module>
Os modelos suportam ligação de dados declarativa e você pode escrever JavaScript nativo que será executado no navegador como está. Isso permite implementar parte da lógica mais simples da interface do usuário sem enviar solicitações ao servidor.
Eventos
A manipulação de eventos de componentes
é muito simples :
TextField textField = new TextField(); textField.addChangeListener(e -> System.out.println("Event fired"));
Aqui você não notará a diferença com o Vaadin 8.
Encaminhamento
A navegação e o roteamento no aplicativo
tornaram-se o que deveriam ser :
@Route("some/path") public class SomePathComponent extends Div { public SomePathComponent() { setText("Hello @Route!"); } }
As visualizações podem determinar qual URL eles processam, quais parâmetros eles exigem do endereço e muito mais.
Desenvolvimento de Componentes
Para o Vaadin 10, você pode desenvolver componentes das seguintes maneiras:
Uma abordagem tão direta ao desenvolvimento de componentes personalizados é talvez o maior passo em frente. Não é mais necessário gravar wrappers para JS no GWT e depois gravar o lado do servidor no Vaadin.
Tema Lumo
Em vez de SASS, as
variáveis CSS agora são usadas para temas visuais, ou seja, não é mais necessário compilar CSS ao criar o projeto:
<custom-style> <style> html { --lumo-font-family: "Open Sans", sans-serif; } </style> </custom-style>
E o tema Valo é substituído por um novo
tema personalizado do Lumo .

Migrando com o Vaadin FW 8
As opções de migração do Vaadin 8 estão descritas no documento:
vaadin.com/docs/v10/flow/migration/1-migrating-v8-v10.htmlAqui tenho más notícias para você: se você escreveu um grande projeto no Vaadin 8, precisará reescrevê-lo completamente ao mudar para o Vaadin 10. Não há caminho de migração, a partir da palavra!
Vaadin 10 e Vaadin 8 são semelhantes em vários aspectos:
- Abordagem do lado do servidor
- Java para desenvolver lógica da interface do usuário
- Mesma abordagem para ligação de dados
A linha inferior:
Vaadin 10 é uma nova estrutura escrita do zero .
Como os desenvolvedores prometem, o
Vaadin 8 será suportado até 2022, e as abordagens de migração podem aparecer.
Conclusão
Considero importante que o novo site da Vaadin seja escrito em Vaadin Flow, que se torna o padrão de fato para tecnologias de front-end, pois a maturidade de uma linguagem de programação foi determinada no momento se o compilador foi escrito na mesma linguagem.
Espero que agora você possa opinar sobre o Vaadin 10. Em geral, esse é um bom quadro e uma enorme reserva para o futuro. Para mim, este é um excelente campo de treinamento experimental para novas idéias e abordagens para a criação de uma interface do usuário.