Chaque changement, même un changement pour le mieux,
toujours gênant
Richard Hooker
Comme vous le savez peut-être, Vaadin est l'un des frameworks Web Java les plus populaires:
Plus récemment, une nouvelle version de ce cadre pour le développement d'une interface utilisateur Web, Vaadin 10, a été publiée. Il existe peu de publications en russe sur Vaadin 10 et Vaadin Flow, et cet article est destiné à combler cette lacune.
Les créateurs positionnent Vaadin Flow comme un nouveau framework web Java pour le développement d'applications web et de sites web modernes (ici je ne les crois pas tout à fait). Cela fait partie de la plateforme Vaadin, qui remplace un autre produit - le framework Vaadin, il vous permet de développer des applications Web (ou, pour être précis, l'interface utilisateur Web) en utilisant la norme Java Web Components.
Ici, dans l'esprit du lecteur, tout était probablement déjà mélangé, tous ces Vaadin Bla Bla, le cadre, la plate-forme, etc. Que se passe-t-il?
Nous utilisons Vaadin dans le cadre de notre
plate-forme CUBA pour les systèmes de back-office de l'interface utilisateur depuis 7 ans et pendant cette période, nous avons accumulé beaucoup d'expérience en travaillant avec lui, nous ne pouvons donc que nous inquiéter de son sort. Sous la coupe, vous trouverez mes spécifications sur Vaadin 10.
Cadre Vaadin
Vaadin est une entreprise finlandaise qui développe des outils et des bibliothèques pour développer l'interface utilisateur. Ils font le framework du même nom pour le développement web en Java.
Vaadin Framework est un cadre d'interface utilisateur avec un modèle de programmation côté serveur dans lequel toute la logique d'interface utilisateur et son état sont situés sur le serveur, et seul le code d'interface utilisateur des composants est exécuté dans le navigateur. En fait, il s'agit d'une technologie de client léger où le navigateur n'affiche que ce que le serveur dit et tous les événements sont envoyés au serveur.
L'approche côté serveur vous permet d'oublier le fait que le développement s'effectue sous le web, et de développer l'interface utilisateur comme une application Java de bureau avec un accès direct aux données et services sur le serveur. Dans le même temps, Vaadin se chargera d'afficher l'interface utilisateur dans le navigateur et l'interaction AJAX entre le navigateur et le serveur. Le moteur Vaadin rend l'interface utilisateur de l'application côté serveur dans le navigateur et implémente tous les détails de l'échange client et serveur.

Cette approche présente de nombreux avantages:
- Le code Java est plus facile à écrire et à déboguer
- Vous pouvez utiliser les bibliothèques et outils Java existants (IDE, compilateurs, tests)
- Aucun développement de service Web requis
- La sécurité est meilleure
Et les inconvénients:
- Besoin de beaucoup de mémoire sur le serveur pour la vue de l'interface utilisateur
- Solution difficile à mettre à l'échelle
- Lors du développement de widgets, vous devez développer une API Java
Sur la base de ces inconvénients et avantages, Vaadin FW s'est installé précisément dans le développement d'entreprise, où les charges sont prévisibles, et la vitesse et la facilité de développement sont beaucoup plus importantes que le coût du fer et de la mémoire.
Qu'est-il arrivé à Google Web Toolkit
Pendant tout le temps que Vaadin est familier au grand public, la partie client de Vaadin FW était inextricablement liée à un autre produit bien connu - Google Web Toolkit (GWT). Ce tandem a permis d'écrire les composants d'interface utilisateur eux-mêmes et l'API serveur pour eux dans un seul langage - Java, ce qui était assez pratique.
Ces dernières années, Google Web Toolkit ne s'est pas développé et, depuis 2015, nous attendons tous l'apparition de GWT 3.0 / J2CL, annoncée lors de GWT.
Un événement important s'est produit dans cette période stagnante (2015-2017): la spécification Web Components et un autre framework Google, Polymer, sont apparus. Apparemment, c'était le début de la fin du GWT.
Il convient de noter que GWT 3 est en cours de développement en tant que cadre interne de Google et que son développement est effectué en interne. Ainsi, la communauté ne peut en aucune façon influencer le processus, ou du moins ne pas voir que le processus est en cours.
Dans ce contexte de stagnation, l'équipe Vaadin a pris la décision difficile d'abandonner complètement le développement sur GWT et de
réécrire la partie client de son framework . Ces changements ne pouvaient pas passer inaperçus et effrayer tous ceux qui se développaient déjà sur Vaadin.
Composants Web
Les composants Web sont un ensemble de normes. Il a été proposé et activement promu par les gars de Google, mais l'initiative a déjà été prise en charge dans Mozilla. Il s'agit essentiellement de technologies permettant de créer des composants d'interface utilisateur pour le Web, afin de prendre en charge l'encapsulation du comportement et de la présentation. Et le principal avantage est la possibilité de réutilisation.
Concepts clés:
- Éléments personnalisés - API pour créer vos éléments HTML
- Shadow DOM est un outil pour encapsuler les composants HTML et isoler leur présentation visuelle des règles CSS globales. En bref, vous pouvez faire un composant, par exemple, un bon de commande, et ne pas avoir peur que ses styles se cassent sur certaines pages du site en raison des règles CSS de cette page.
- Modèles HTML - la possibilité de placer des blocs passifs contenant des éléments vides DOM dans un document HTML. Ces blocs sont analysés par le navigateur, mais ils ne sont pas rendus ou exécutent leur code. Il est suggéré de les utiliser comme modèles pour le rendu des données.
- Importations HTML - la possibilité d'importer un document HTML en tant que module avec toute sa mise en page, ses styles et JS
Par exemple, si vous regardez maintenant l'arborescence DOM YouTube, vous trouverez l'utilisation des éléments personnalisés et du DOM fantôme:

Toutes ces choses vous permettent d'écrire de nouveaux composants d'interface utilisateur à la mode pour le Web.
Il convient d'admettre que la prise en charge du navigateur est loin d'être parfaite et que les
polyfills sont toujours
nécessaires , par exemple, pour Edge.
Polymère
Polymer est une petite bibliothèque au-dessus des normes des composants Web conçue pour simplifier leur utilisation. Un exemple:
En fait, Polymer fait tout ce que GWT faisait auparavant, mais en même temps, il est compatible avec tous les composants JS et autres frameworks, par exemple, React et Angular.
Composants Vaadin
Retour à Vaadin. Vaadin crée depuis longtemps un produit appelé
Vaadin Components - composants d'interface utilisateur pour les développeurs frontaux qui peuvent être intégrés dans n'importe quelle application JS.

Ces composants sont basés sur des composants Web et Polymer!
Comme nous le voyons maintenant, c'était un aérodrome de sauvegarde pour le framework Vaadin, qui nous a permis de quitter Google Web Toolkit et de développer un nouveau framework pour lequel les composants n'existaient pas encore. Le problème du poulet et des œufs a été résolu et les composants de Vaadin sont devenus le front-end du prochain Vaadin 10.
Flux Vaadin
Vaadin 8 comprenait un mécanisme de synchronisation d'état de l'interface utilisateur et la prise en charge d'un protocole RPC bidirectionnel (appel de procédure à distance). Cela a été possible grâce à GWT, car les interfaces et classes communes du serveur et du client ont été écrites en Java.
Parallèlement à l'abandon de GWT, il était nécessaire de mettre en œuvre un nouveau mécanisme qui permettrait une intégration transparente avec le frontend JS et le backend Java. Ce mécanisme était Vaadin Flow (et ce nom est également utilisé depuis longtemps pour désigner l'ensemble du Vaadin 10).
La
documentation Flow a ce schéma:

Sa signification principale est la suivante:
- La synchronisation de l'état de l'interface utilisateur du serveur au client est prise en charge
- la partie serveur peut s'abonner aux événements des composants UI, et une requête AJAX sera exécutée
- la logique métier est exécutée sur le serveur, seules les données affichées dans l'interface utilisateur sont chargées dans le navigateur Web
- le côté serveur utilise Java
- le client peut utiliser des modèles HTML, CSS, JS et Polymer
Pour moi, cela signifie que Vaadin aura plus de technologies frontales, et maintenant Java seul n'est clairement pas suffisant (pour Vaadin 8, Java serait suffisant pour vous et HTML / CSS ne serait pas nécessaire). D'autre part, une intégration facile du code JS est désormais possible.
Plateforme Vaadin
Chaque composant de Vaadin 10 est développé séparément et dans les meilleures traditions du monde JS - de minuscules modules aussi indépendants que possible les uns des autres. Dans le même temps, la partie client des composants est conditionnée dans un JAR au format WebJARs:
www.webjars.orgC'est un peu effrayant, surtout si vous regardez la conception minimale:

Afin de contrôler ce chaos, un projet de nomenclature appelé
Vaadin Platform est apparu .
Il ne s'agit pas d'un produit indépendant, mais simplement d'une liste de versions compatibles de composants et d'outils conçus au format
Maven BOM .
Il se connecte à Maven
comme suit :
<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>
Caractéristiques de Vaadin 10
Au total, l'ensemble du cadre se compose de 3 volets:
- Composants Vaadin - frontend
- Vaadin Flow - transport
- API de composants de serveur - API Java pour les composants d'interface utilisateur
Cela vaut la peine de commencer le développement avec le
didacticiel officiel .
Aussi, je recommande un
nouveau webinaire .
Entrées
Vous pouvez vous familiariser avec le cadre à partir de la
page . Vous y trouverez des exemples de projets, y compris la pile complète basée sur Spring Boot.
Les fans ardents de Spring Boot peuvent passer directement à
start.spring.io et sélectionner Vaadin parmi les frameworks Web là-bas.
Un projet minimal peut être démarré avec une classe Java, par exemple:
En général, vous pouvez écrire sur Vaadin 10, comme sur Vaadin 8, MAIS! Vous devriez certainement regarder
la page de correspondance des composants .
API Element
Fonction Killer Vaadin 10 - contrôlez les éléments DOM directement à partir du code Java côté serveur.
Element nameField = ElementFactory.createInput(); nameField.setAttribute("id", "nameField"); nameField.setAttribute("placeholder", "John Doe"); nameField.setAttribute("autofocus", "");
Vous pouvez également gérer des attributs déjà apposés:
Bien sûr, ce n'est pas un remplacement pour les composants d'interface utilisateur, mais une bonne API pour des changements de disposition simples lors du développement de composants d'interface utilisateur n'est pas requise.
Liaison de données
Pour travailler avec des composants qui implémentent l'interface HasValue (get / set value et ValueChangeListener), il existe une classe Binder pratique:
Binder<Person> binder = new Binder<>(); TextField titleField = new TextField(); binder.forField(titleField) .bind( Person::getTitle, Person::setTitle);
Comme vous pouvez le voir dans l'exemple, la liaison de type statique basée sur des expressions lambda est prise en charge.
De plus, les classeurs peuvent installer des convertisseurs de valeur et des validateurs:
binder.forField(yearOfBirthField)
Modèles
Les modèles HTML sont en cours de composition:
<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>
Les modèles prennent en charge la liaison de données déclarative et vous pouvez écrire du JavaScript natif qui sera exécuté dans le navigateur en l'état. Cela vous permet d'implémenter une partie de la logique d'interface utilisateur la plus simple sans envoyer de requêtes au serveur.
Les événements
La gestion des événements des composants
est très simple :
TextField textField = new TextField(); textField.addChangeListener(e -> System.out.println("Event fired"));
Ici, vous ne remarquerez pas la différence avec le Vaadin 8.
Acheminement
La navigation et le routage dans l'application
sont devenus ce qu'ils devraient être :
@Route("some/path") public class SomePathComponent extends Div { public SomePathComponent() { setText("Hello @Route!"); } }
Les vues peuvent déterminer l'URL qu'elles traitent, les paramètres dont elles ont besoin pour l'adresse, et bien plus encore.
Développement de composants
Pour Vaadin 10, vous pouvez développer des composants de la manière suivante:
Une telle approche simple du développement de composants personnalisés est peut-être le plus grand pas en avant. Il n'est plus nécessaire d'écrire des wrappers pour JS sur GWT, puis d'écrire côté serveur sur Vaadin.
Thème Lumo
Au lieu de SASS, les
variables CSS sont désormais utilisées pour les thèmes visuels, c'est-à-dire plus besoin de compiler CSS lors de la construction du projet:
<custom-style> <style> html { --lumo-font-family: "Open Sans", sans-serif; } </style> </custom-style>
Et le thème Valo est remplacé par un nouveau
thème Lumo personnalisé .

Migration avec Vaadin FW 8
Les options de migration depuis Vaadin 8 sont décrites dans le document:
vaadin.com/docs/v10/flow/migration/1-migrating-v8-v10.htmlIci, j'ai de mauvaises nouvelles pour vous: si vous avez écrit un énorme projet sur Vaadin 8, vous devrez le réécrire complètement lors du passage à Vaadin 10. Il n'y a pas de chemin de migration, du mot du tout!
Vaadin 10 et Vaadin 8 sont similaires à plusieurs égards:
- Approche côté serveur
- Java pour développer la logique de l'interface utilisateur
- Même approche pour la liaison de données
Conclusion :
Vaadin 10 est un nouveau framework écrit à partir de zéro .
Comme les développeurs le promettent,
Vaadin 8 sera pris en charge jusqu'en 2022 et des approches de migration peuvent apparaître.
Conclusion
Je considère qu'il est important que le nouveau site Web de Vaadin soit écrit en Vaadin Flow, qui devient la norme de facto pour les technologies frontales, car la maturité d'un langage de programmation a été déterminée par le fait que son compilateur ait été écrit dans le même langage ou non.
J'espère que maintenant vous pouvez vous faire votre opinion sur Vaadin 10. En général, c'est un bon cadre et une énorme réserve pour l'avenir. Pour moi, c'est un excellent terrain de formation expérimental pour de nouvelles idées et approches pour la construction d'une interface utilisateur.