Vaadin 10+作为CUBA UI的未来

从一开始,Vaadin就成为CUBA平台用户界面的基石和重要组成部分。 由于其创新的方法,它帮助CUBA将企业用户界面开发带到了一个非常有希望的(如今是默认)的WEB领域。 Vaadin最令人兴奋的部分之一是整个开发都是同构的,并且主要使用Java完成,从而避免了开发人员与相当不稳定且快速变化的前端世界进行交互。

如您所见,Vaadin的重要部分之一是功能丰富的UI(在Vaadin 8的情况下基于GWT小部件)。

与现代Web UI套件相比,即使在今天,Vaadin小部件仍然属于最复杂和最先进的部件,尤其是在企业需求方面。 首先,我们谈论的是在典型的CUBA应用程序组件中大量使用的组件,例如表,网格,组合框。 例如,只要尝试找到带有Table的流行UI工具包,即可提供拖放列重新排序或动态列控件。

Vaadin的故事

CUBA平台使用Vaadin的历史悠久。 该平台为用户提供了从Vaadin 5到Vaadin 8的几乎无缝迁移。为了提供这种迁移,我们必须在Vaadin之上构建并保持API。 此外,我们扩展了一些组件,甚至分叉框架本身为我们的客户提供独特的功能,并注入所需的扩展点。 在服务器端,平台提供数据绑定和数据感知组件,这是通用UI的最重要功能。

为了加快开发速度并启用快速开发工具(Studio),我们引入了XML描述符-建立数据绑定UI的声明性方法:

 <layout> <grid spacing= "true" height= "200" > <columns count= "4" /> <rows> <row flex= "1" > <label value= "Field 1" align= "MIDDLE_LEFT" /> <textField height= "100%" /> <label value= "Field 2" align= "MIDDLE_LEFT" /> <textField height= "100%" /> </row> <row flex= "2" > <label value= "Field 3" align= "MIDDLE_LEFT" /> <textField height= "100%" /> </row> </rows> </grid> </layout> 

Pure Vaadin:

 GridLayout tableHeader = new GridLayout( 3 , 2 );     Label nameLabel = new Label( "Field 1" ); nameLabel.setWidth(lastnameWidth + 2 * 6 , Unit.PIXELS); tableHeader.addComponent(nameLabel, 0 , 0 , 0 , 1 ); Label countryLabel = new Label( "Field 2" ); countryLabel.setWidth(countryWidth + 2 * 6 , Unit.PIXELS); tableHeader.addComponent( new Label( "Field 3" ), 1 , 0 ); Label bornLabel = new Label( "Field 4" ); bornLabel.setWidth(bornWidth + 2 * 6 , Unit.PIXELS); tableHeader.addComponent(bornLabel, 2 , 0 , 2 , 1 ); tableHeader.addComponent(countryFilterBox, 1 , 1 );     // Put the header and table inside a vertical layout layout.addComponent(tableHeader); layout.addComponent(table);     // Adjust the table height a bit table.setPageLength(table.size()); 

我们设法建立了自己的组件列表(基于Vaadin原语):

  • 组表
  • 表格(以前是FieldGroup)
  • PickerField
  • LookupPickerField
  • 令牌表
  • MaskedField
  • 建议字段
  • 货币字段

话虽这么说,CUBA在Vaadin框架之上提供了很多功能,以使开发人员的生活更轻松,并使开发达到更高的水平。 CUBA团队进行了繁重的工作,以在更新基础的Vaadin框架时实现非常平滑,字面上看不见的迁移。

新挑战

定制和本地交互

GWT非常复杂,并且创建UI小部件是一个充满挑战且耗时的过程。 经验丰富的开发人员肯定知道在通过本机平台进行人工抽象时,您必须付出高昂的代价。 对于GWT,我们必须与Java世界中的浏览器JS API进行交互。

响应式布局

即使对于企业界面,针对不同屏幕尺寸的可调能力也已成为关键要求。 仅由于上述在本机平台上的额外抽象性,使响应式UI很难。 尽管您可以使用CssLayout或特殊的加载项来创建响应式UI,但是服务器端的标准布局和计算在这种情况下不能很好地发挥作用。

使用第三方库

Web的发展非常Swift,有大量的Web软件包(npm> 1M)在Vaadin 8应用程序中几乎没有用,因为它不使用现代的前端工具和构建系统。

GWT开发陷入困境

在某个时候,谷歌停止了GWT的积极开发。 这不仅与官方支持有关,而且与生态系统有关。

Vaadin流

为了对前端生态系统更加开放,Vaadin开始开发Vaadin框架的后继产品。 新方法的核心是Vaadin Flow ,该技术可为基于Web组件而不是GWT小部件的新UI层提供服务器端模型和基本数据绑定。

考虑下图:

如您所见,Vaadin已将基于GWT的客户端替换为基于本机Web技术的新客户端。

Vaadin成分

新的Vaadin 组件是Vaadin GWT小部件的后继产品。 它们是使用纯Web技术(HTML,JavaScript)和Polymer 2库从头开始构建的Web组件。

Web组件

最初,Web组件是在大多数现代浏览器中实现的一组标准:

  • 自定义元素
  • 影子大教堂
  • HTML模板
  • HTML导入-> ES模块

长期以来,Web组件非常有前途,许多人(包括我在内)都将其视为React和Angular等框架的本地替代品,这些框架也利用基于组件的方法。 但是随着时间的流逝,这些标准中的一些已被浏览器丢弃,而另一些则需要进行重大改进,这一点变得显而易见。 如今,从上面的列表中,只有自定义元素和Shadow DOM仍用于Web应用程序开发中。 甚至从Chrome删除了HTML导入。 如今HTML模板看起来已经过时了,例如,新的Polymer方法: lit-html仅在幕后使用它们。

我们还尝试使用Web组件,这是我们尝试在Polymer库之上构建以客户端为中心的UI的一部分。 在某个时候,我们决定将工作转向基于React的方法,因为Polymer尽管具有Web Component支持解决方案的勇敢使命,但开发人员的经验很差,生态系统很小(即使已经存在了几年),最后还是不清楚not recommended在新项目解决方案发布之时发布Polymer 3。 聚合物用户不得不等了将近一年,直到lit-html和LitElement最终发布。

从我们的经验中得出的另一个观察结果:尽管受到use the Platform座右铭的拥护者的大力推动,但是在开发现代前端应用程序时,仍然几乎不可能摆脱转译/捆绑的步骤。 尽管标准正在为所有浏览器采用困难的方法和解决API带来困难,但社区创建了许多工具和库来解决相同的问题。

例如,Shadow DOM的主要目的是封装CSS样式,以免溢出到组件的本地DOM或从组件的本地DOM溢出。 这个想法很棒,但是大多数浏览器都花了几年的时间(幸好Edge迁移到了Chromium)。 同时,React生态系统由大量样式库实现,这些样式库可以解决相同的任务,甚至可以解决更多问题 ,而不会产生Shadow DOM的重大 陷阱 。

但是,Web组件具有非常重要的独特功能:它们是平台(浏览器)的一部分。 从理论上讲,它们不受任何特定框架的约束,是通用的,可以在任何地方使用。 从这个角度来看,这似乎是UI Kit或独立组件(而不是应用程序)的合理选择,不仅由Vaadin做出,而且例如由Ionic和SAP做出。

瓦丹14

基于Vaadin Flow的Vaadin 10已于2018年中期发布 。很快就很明显,UI套件缺少许多重要组件,只包含基本组件。 此外,客户端构建管道还包括一个Bower依赖管理器–该工具已于2017年弃用,并且不与事实上的标准npm生态系统相交。

因此,我们将Vaadin 10发布视为试验性的,并决定等到新技术变得更稳定为止。 在Vaadin 14 LTS 于 2019年8月到来之前,共有3个主要版本,其中包括对npm的高度支持和更强大的UI套件。 这敦促我们仔细观察并亲身体验Vaadin 14。

UI套件

即使没有深入研究代码库,很明显,与Vaadin 8小部件相比,许多属性和行为也发生了变化。 通常,这还不错,但是对于CUBA,这意味着在某些方面,不会直接替换当前支持的功能/ API。

在完整性方面,仍然有一些缺少的核心组件已在CUBA中使用:

  • 日历
  • 双柱

某些以前免费的组件和功能成为Pro组件的一部分:例如,RichTextArea现在是Pro组件的一部分,Vaadin Grid Pro中提供了Grid的编辑模式。

PickerField

作为评估过程的一部分,我们为Vaadin 14重新实现了CUBA的PickerField组件:

说到服务器端,Vaadin Flow提供了惊人的功能,可以使用Java API与客户端(DOM元素,事件等)进行交互。 Vaadin组件随附了便捷的Java API:

 Accordion accordion = new Accordion(); ... accordion.open( 1 ); 

非Vaadin组件没有此类API,但是您仍然可以通过DOM API对任何元素使用通用方法:

例子1

 if (value == null ) { getElement().removeProperty( "value" ); } else { getElement().setProperty( "value" , getStringRepresentation(value)); } 

例子2

 getElement().appendChild( new Element[]{Element.createText(text)}); 

尽管服务器端非常漂亮和清晰,但客户端却花了我们90%的精力。 我们首先要提到的是,核心Vaadin组件当前是由Polymer 2构建的。为了支持Vaadin 14+的Polymer 3,它们似乎已自动转换。 通常,Polymer 2和Polymer 3具有相同的API(这就是为什么可以进行自动转换的原因),但是,导入和样式声明之间存在细微的差异。

另一个棘手的话题是样式和自定义:由于Shadow DOM,您根本无法将样式应用于随机元素(仅适用于设计为可通过使用自定义CSS属性进行样式设置的元素)。 Vaadin组件具有用于自定义的插槽(Shadow DOM的另一个强大但复杂的部分)。 它们非常适合简单的用例,但是在尝试实现更高级的用例时,您很快就会遇到限制。

因此,在实现PickerField时,我们将通过复制粘贴样式和Vaadin组件的其他部分结束,并在本机input元素之上构建该组件(从@vaadin导入的唯一可重用的东西是几个Mixins)。

我们不怪Vaadin,因为Vaadin尚未设计(也不应该)作为另一个UI套件的基础,它只是表明对我们来说,支持所有附加功能在客户端将是大量工作我们为开发人员提供了很长一段时间。 当前应该以Polymer 3为基础的作品(已经处于维护模式),所有已知的开发人员都遇到Polymer2的缺陷。

最新消息

就在撰写本文时,Vaadin宣布所有核心组件都将在TypeScript和LitElement上进行重写。 我们对这一决定持积极态度,因为我们在TypeScript方面的丰富经验证实,它可以避免JS中缺少静态类型所引起的大量错误,有助于理解代码库的结构,执行安全的重构等。

不过,LitElement / lit-html看起来有点令人怀疑:我们理解这一选择,因为它是Polymer的后继者,并利用了React发明的强大的声明式渲染(view = f(state))方法。 但是它仍然是:

  • 很新 。
  • 具有运行时(与Stencil和Svetle之类的已编译方法不同)。 为了同时支持基于聚合物和基于Lit的组件,Vaadin应将两个库都交付给客户端。
  • IDE支持差。 有一些VS Code插件,但是IntelliJ / WebStorm中不提供支持 ,这使得点亮的模板看起来非常混乱。
  • 不是SSR –友好。

出现了许多新问题:
LitElement + TypeScript是否将取代当前基于Polymer 3的方法来开发应用程序前端?
如果是,那么类似React的渲染将如何与服务器端Java API一起工作?

更新资料

Vaadin 15附带了客户端引导程序和TypeScript 支持 。

结论

Vaadin是一种独特的产品,可为Java提供便利的Web开发。 Vaadin Flow带来了全新的客户端方法,我们认为这是很有前途的。 但是,组件集仍在不断发展,并正在走向稳定。

我们可以肯定地说一件事:由于全新的客户端,我们将无法为从Vaadin Flow之上构建的新UI提供平滑的迁移路径。

同样,我们认为在客户端技术上开始在其之上进行所有CUBA组件的大规模迁移仍然有些模糊和不稳定。 我们决定将积极的开发推迟到新的Web组件集可用之前。 我们仍会密切关注Vaadin的发展,并准备在其变得更加稳定后对其进行重新评估。

同时,我们还试图提供一种替代的,友好的,客户端友好的方法来创建UI:请参阅我们最近关于TypeScript SDK和React Client的博客文章。

翻译自: https://www.javacodegeeks.com/2020/01/vaadin-10-as-the-future-of-cuba-ui.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/341105.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第二章 数据结构(一)

文章目录整体结构为什么用数组链表与邻接表单链表存储插入插入至头结点将x插入到下标为k的点后面删除遍历双链表初始化插入删除邻接表栈和队列栈队列单调栈单调队列KMP整体结构 链表与邻接表&#xff08;用数组模拟&#xff09;栈与队列&#xff08;用数组模拟&#xff09;kmp…

第三章搜索与图论(一)

文章目录DFS与BFS区别DFS全排列n皇后BFS树和图的遍历树和图的存储数和图的遍历深度优先遍历宽度优先遍历图的宽搜应用框架DFS与BFS区别 DFS: 执着&#xff1a;一直走到头&#xff0c;回去的时候边回去边看能不能向下走 BFS: 稳重&#xff1a;每次只扩展一层&#xff0c;不会…

第三章 搜索与图论(二)

文章目录最短路朴素Dijkstra算法堆优化版的Dijkstra算法Bellman-Ford算法SPFA算法求距离判负环Floyd最短路 并不区分有向图和无向图&#xff0c;因为无向图是一种特殊的有向图。直接用有向图的算法&#xff0c;解决无向图的问题。 常见情况可以分为两大类 在图论中&#xff0…

第三章 搜索与图论(三)

文章目录朴素版PrimKruskal算法染色法匈牙利算法朴素版Prim 给定一个 n 个点 m 条边的无向图&#xff0c;图中可能存在重边和自环&#xff0c;边权可能为负数。求最小生成树的树边权重之和&#xff0c;如果最小生成树不存在则输出 impossible。给定一张边带权的无向图 G(V,E)&a…

CDF 图的含义

CDF 图用于创建经验累积分布函数图。 使用 CDF 图可以确定等于或小于 x 轴上的给定值的数据的百分比。 例如&#xff0c;在该 CDF 图中&#xff0c;大约 34% 的数据小于总脂肪值 10 克。 参考链接 1. https://www.jmp.com/support/help/zh/14-2/ba-distribution-22.shtml

rome rss_RSS阅读器使用:ROME,Spring MVC,嵌入式Jetty

rome rss在这篇文章中&#xff0c;我将展示一些创建Spring Web应用程序的指南&#xff0c;这些应用程序使用Jetty并使用名为ROME的外部库运行RSS来运行它。 一般 我最近创建了一个示例Web应用程序&#xff0c;充当RSS阅读器。 我想检查ROME以阅读RSS。 我还想使用Spring容器和…

Ubuntu系统输入中文方式

我目前知道Ubuntu有两个还算好用的中文输入法&#xff1a; Fcitx&#xff1a;它是Linux世界开源的输入法框架&#xff0c;提供 Google PinYin、ShuangPin、SunPinYin、Wubi、ZhengMa、Hong Kong 和 TaiWan繁体等输入法。 1 安装Fcitx sudo apt install fcitx-pinyin fcit…

VMWare建立于W10的共享文件夹

一、共享文件夹建立 在虚拟机设置 -> 文件夹共享&#xff0c;选择总是启用&#xff0c;点击添加&#xff1a; 直接点击下一步&#xff1a; 选择原系统共享文件夹位置&#xff0c;并命名&#xff1a; 选择启用此共享&#xff0c;并继续&#xff1a; 二、VMtools安装 虚拟机…

VSCode如何去掉Monokai主题下的绿色下划线

VScode中类似sublime的主题为Monokai&#xff0c;但是自带主题Monokai中绿色下划线令人不舒服。 在网上寻找多种方式去除下划线。终于找到一种合适的处理方式。 1 安装主题插件 在主题插件中搜索One Monokai Theme&#xff0c;下载并安装 2 配置全局主题 通过快捷键“Ctr…

解决 ZLibrary 登录/注册不了的问题

一 文章转载链接内容 转载链接&#xff1a;解决 ZLibrary 登录/注册不了的问题 - 知乎 很多小伙伴反馈说 Z-Library 能打开&#xff0c;但是不能登录。这实际上是由于官方登录入口受限导致的。话虽如此&#xff0c;我们仍然可以通过某些方法绕过这个限制。 >虽然我们注册时…

gradle入门_Gradle入门:简介

gradle入门Gradle是一种构建工具&#xff0c;可以用基于Groovy编程语言的内部DSL替换基于XML的构建脚本。 最近它吸引了很多关注&#xff0c;这就是为什么我决定仔细研究一下。 这篇博客文章是我的Gradle教程的第一部分&#xff0c;它有两个目标&#xff1a; 帮助我们安装Gr…

排队论游乐场的游乐项目_外汇游乐场

排队论游乐场的游乐项目介绍 F X Playground是基于JavaFX的原型制作工具或实时编辑器&#xff0c;它消除了编译Java代码的步骤。 这个概念并不新鲜&#xff0c;例如在网络世界中&#xff0c;有许多HTML5 游乐场提供在线编辑器&#xff0c;使开发人员可以快速原型化或尝试各种Ja…

Node.js安装及环境配置之Windows篇

原博文链接&#xff1a;Node.js安装及环境配置之Windows篇 - 刘奇云 - 博客园 from:https://www.cnblogs.com/zhouyu2017/p/6485265.html 一、安装环境 1、本机系统&#xff1a;Windows 10 Pro&#xff08;64位&#xff09; 2、Node.js&#xff1a;v6.9.2LTS&#xff08;64位…

npm WARN logfile could not create logs-dir: Error: EPERM: operation not permitted, mkdir ‘地址

场景&#xff1a;在windows系统下&#xff0c;安装node之后&#xff0c;查看npm版本&#xff0c;报错如图所示&#xff1a; 原因&#xff1a;是node目录权限不够&#xff1b; 解决方法&#xff1a;找到node目录&#xff0c;右键属性 > 安全 > 设置users用户完全控制权限…

javafx 自定义控件_JavaFX技巧10:自定义复合控件

javafx 自定义控件用JavaFX编写自定义控件是一个简单直接的过程。 需要一个控件类来控制控件的状态&#xff08;因此命名&#xff09;。 外观需要控件的外观。 而且通常不是用于自定义外观CSS文件。 控件的一种常见方法是将其正在使用的节点隐藏在其外观类中。 例如&#xff0…

虚拟机与容器 的 区别

VM和容器都可以帮助您充分利用可用的计算机硬件和软件资源。容器是块中的新孩子&#xff0c;但VM已经并且将继续在各种规模的数据中心中非常受欢迎。 如果您正在寻找在云中运行自己的服务的最佳解决方案&#xff0c;您需要了解这些虚拟化技术&#xff0c;它们如何相互比较&…

经典 Linux 协议栈——网络子系统

目录&#xff1a; 1.Linux网络子系统的分层 2.TCP/IP分层模型 3.Linux 网络协议栈 4.Linux 网卡收包时的中断处理问题 5.Linux 网络启动的准备工作 6.Linux网络包&#xff1a;中断到网络层接收 7.总结 Linux网络子系统的分层 Linux网络子系统实现需要&#xff1a; l …

Java和JavaScript之间的区别

1.简介 我们将在本文中比较Java语言和JavaScript语言。 JavaScript由Netscape开发。 它最初是用于客户端的脚本语言&#xff0c;后来又用作客户端和服务器脚本的语言。 Java由James Gosling由Sun Microsystems开发。 这些天来&#xff0c;JavaScript在服务器中以node.js的形式使…

《汇编语言》王爽实验DOS 环境 Win10 配置

下载这两个软件。 软件链接百度网盘 请输入提取码 提取码: y1j4 1. 将debug.exe放入一个文件夹中&#xff0c;用英文名&#xff0c;不要用中文。 我这里放在E盘下的Debug文件夹。 2 然后安装DOSBox软件。 安装好后在其文件目录下找到DOSBox 0.74-3 Options.bat 打开这个文件&…

硒4 Alpha –期望什么?

硒4 Alpha-期望什么&#xff1f; 早在2018年8月&#xff0c;整个测试自动化社区就受到了一个重大新闻的打击&#xff1a;Selenium的创始成员Simon Stewart在班加罗尔Selenium会议上正式确认了Selenium 4的发布日期和一些重大更新。 世界最受欢迎的Web测试自动化框架的4.0版本计…