Java赢了很多小战役,但如何赢得这场艰苦卓绝的大战争?

{"type":"doc","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Java的半年发布周期、令人兴奋的新特性为它赢得了很多小战役。然而,一场更大的战争正在逼近:浏览器战争。这是一场Java输不起的战争。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"历史小回顾"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在90年代末和2000年代,Java在浏览器中占有举足轻重的地位。Applet是直接运行在Web页面上的Java UI——想象一下用于绘制图形和播放声音的画布,只是使用的是Java API。Java Web Start让你可以从浏览器启动完整的Java UI。它们都可以与运行在Java应用服务器上的服务通信,获得完整的Java体验。实际上,是最初对客户端Java的喜爱促使人们尝试将Java放到了服务器端,然后才变得更加流行。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"时间快进20年"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"然而,2020年,情况变糟了。所有主流浏览器都禁用了对Java(实际上还包括大多数非JavaScript技术)的支持。基于Web的前端通常是用JavaScript或者一些包装器(如TypeScript)开发的。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"不过,你仍然可以使用Java技术来开发网站,比如很多“官方”技术(如JSP和JSF)。可惜的是,这些技术完全运行在服务器端。你可以使用Java库和业务逻辑生成页面,但一旦被发送到浏览器,它们就是静态毫无生气的。用户交互需要使用以下两个丑陋的方式:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在客户端和服务器之间往返(速度慢,用户体验不好);"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"JavaScript嵌入在Java生成的页面中。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"有些团队完全放弃了Java,使用JavaScript构建前端。在做出这个决定之后,有些人甚至研究了在服务器端运行JavaScript的解决方案。听起来是不是很熟悉?这就是Java曾经用来占领计算世界的方式。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"赢得了很多小战役"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"幸运的是,Java并没有停滞不前。Java Enhancement Process(JEP)保护Java不受官僚主义的侵袭,多年来对Java进行了大量改进,其中大多数都走在了JavaScript前面。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"多亏了新的发布周期,现在每6个月就会发布一些特性改进。新的垃圾回收器、更容易使用的字符串和改进的线程都可以用于生产环境。但是,当你想知道这些创新中哪些是用于构建基于浏览器的应用程序时,很快就会意识到,Java客户端的创新几乎已经停止了,至少官方渠道是这样的。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"古话说,我们不想赢得小战役,却输掉了大战争。Java如何再次突围?如何再次赢回客户端开发者?Java如何防止其他技术利用前端优势来占领后端,就像Java曾经对其他技术所做的那样?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"如何赢得这场战争"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"要赢得这场战争,Java需要一个强大的客户端解决方案,让开发人员可以使用Java创建现代Web应用程序。这个解决方案需要能够利用现代Web技术、支持组件化、能够快速迭代开发、提供快速下载能力、具备高性能、可以很好地与其他JVM语言协作。那么,Java到底需要什么?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"Java需要TeaVM"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"TeaVM是一种可以将Java类编译成JavaScript的转译器,可以让Java代码与Web API和DOM发生交互。它还提供了一个用于开发Web应用程序的框架,叫作Flavour。TeaVM和Flavour的一些强大的功能特性:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"通过类型安全的Java包装器使用大多数的Web API;"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"一个丰富的组件框架,通过可重用的组件来构建应用程序;"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"大量的预构建组件;"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"带有影子DOM和路由的单页面应用程序支持;"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"简单、透明地调用Web服务。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如果你是一个正在构建基于浏览器用户界面的Java开发人员,TeaVM就是为你准备的。TeaVM应用程序主要可以分为两种风格:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在画布上绘制整个UI的图形应用程序,只有很少的HTML或CSS。这些应用程序可能需要TeaVM。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"使用HTML和CSS的单页面Web应用程序。这些应用程序可以使用Flavour框架来处理路由、调用REST服务和JSON解析。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"但也不一定非黑即白,也可以考虑混合的解决方案,比如:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"一个主要基于画布的应用程序,它也可以偶尔使用Flavour来显示其他HTML页面。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"主要基于HTML的应用程序,在某些页面上包含一个画布。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"无论你选择哪种方式,都会发现,使用与后端相同的语言来开发客户端是一种真正解放的体验。你可以在整个应用程序中共享数据结构,使用IDE同时重构客户端和服务器端的接口和模型类,为整个产品使用相同的工具(构建工具、依赖管理工具、静态\/动态分析工具)。生产力和开发人员的满意度得到了极大的提升。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"如何前进"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"你现在就可以在你的项目中使用TeaVM。它稳定,提供了文档,并且在TeaVM网站和"},{"type":"link","attrs":{"href":"https:\/\/frequal.com\/tea-sampler\/","title":"","type":null},"content":[{"type":"text","text":"其他地方"}]},{"type":"text","text":"都提供了"},{"type":"link","attrs":{"href":"https:\/\/github.com\/konsoletyper\/teavm-flavour\/tree\/master\/example","title":"","type":null},"content":[{"type":"text","text":"示例代码"}]},{"type":"text","text":"。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"最重要的是,TeaVM需要你的支持和推广。不要只是讨论和提倡遗留的Java Web技术,让我们一起来让Java继续保持常青25年——请推广和使用TeaVM!"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"如何参与?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"构建你的"},{"type":"link","attrs":{"href":"http:\/\/teavm.org\/docs\/intro\/getting-started.html","title":"","type":null},"content":[{"type":"text","text":"第一个TeaVM项目"}]},{"type":"text","text":",只需要两个命令。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"阅读开发人员讨论TeaVM和Flavour的"},{"type":"link","attrs":{"href":"https:\/\/groups.google.com\/u\/2\/g\/teavm","title":"","type":null},"content":[{"type":"text","text":"论坛帖子"}]},{"type":"text","text":"。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"深入"},{"type":"link","attrs":{"href":"https:\/\/github.com\/konsoletyper\/teavm","title":"","type":null},"content":[{"type":"text","text":"源代码"}]},{"type":"text","text":"。TeaVM和Flavour代码结构组织得很好,对你来说非常有用。在创建你自己的JavaScript映射和Flavour组件时,项目代码库中有大量示例可以参考。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"感谢你阅读本文,让我们一起来赢得这场战争!"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"原文链接:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https:\/\/frequal.com\/java\/JavaWinningBattlesNowForTheWar.html","title":"","type":null},"content":[{"type":"text","text":"https:\/\/frequal.com\/java\/JavaWinningBattlesNowForTheWar.html"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章