J2CL –迟到总比不到好
上周,Google團(tuán)隊(duì)終于發(fā)布了J2CL框架的源代碼,自2015年以來(lái)就對(duì)此進(jìn)行了討論。將Java轉(zhuǎn)換為JavaScript的想法根本不是什么新鮮事,而且每個(gè)人在使用Google Web Toolkit之前都遇到了麻煩該產(chǎn)品在社區(qū)中倍受關(guān)注-經(jīng)過(guò)討論并成為會(huì)議演講的主題,但沒(méi)人能看到它 。
自首次發(fā)布以來(lái)已經(jīng)有3年多了,而且該產(chǎn)品似乎甚至在其誕生之前就失去了市場(chǎng)。 今天,我們有了Scala.js,Kotlin.js和JSweet,此外,該開(kāi)發(fā)已經(jīng)由TypeScript占用,并且Java不再有地方了。 這么長(zhǎng)時(shí)間以來(lái),即使是最熱愛(ài)Java的人也對(duì)“ Java for Front end”失去了信心,并學(xué)到了一些JavaScript框架。
但是,由于它終于發(fā)布了,所以讓我們看一下結(jié)果以及將其用于什么目的。
理念
在全球范圍內(nèi),在瀏覽器中模擬JVM是一項(xiàng)相當(dāng)復(fù)雜的任務(wù)。 Google Web Toolkit開(kāi)發(fā)人員長(zhǎng)期以來(lái)一直在嘗試解決此問(wèn)題并取得了一定的成功:他們建立了一個(gè)編譯器,開(kāi)發(fā)了標(biāo)準(zhǔn)的Java庫(kù)仿真機(jī)制,為應(yīng)用程序開(kāi)發(fā)提供了工具。
這種方法具有許多優(yōu)點(diǎn):靜態(tài)類(lèi)型檢查,瀏覽器中服務(wù)器代碼的可重用性,以Java IDE表示的現(xiàn)成工具。 現(xiàn)在,TypeScript,Web Pack和其他前端開(kāi)發(fā)工具中代表了GWT的許多內(nèi)置方法。
優(yōu)秀的舊版Google Web Toolkit因其笨重且抽象的UI構(gòu)建方式而遭到反對(duì)。 J2CL的想法更簡(jiǎn)單–它使我們能夠以最小的開(kāi)銷(xiāo)將Java轉(zhuǎn)換為JavaScript,以便您可以輕松地從JavaScript調(diào)用Java,反之亦然。
即使在2015年末有一個(gè)非常不錯(cuò)的從Java到JS的轉(zhuǎn)譯器,都可以在沒(méi)有哈希的情況下運(yùn)行,但幾乎不可能假設(shè)Web開(kāi)發(fā)會(huì)如何發(fā)展。
J2CL前傳
2015年初,Google GWT團(tuán)隊(duì)做出了艱難而緊急的決定-開(kāi)發(fā)支持Java進(jìn)行前端開(kāi)發(fā)的新產(chǎn)品。
主要是由于Web開(kāi)發(fā)趨勢(shì)的變化及其新的內(nèi)部客戶(hù),他們將Java for Web視為不是孤立的生態(tài)系統(tǒng),而是將其視為大型堆棧的重要組成部分。 它需要一種完全創(chuàng)新的觀點(diǎn),并創(chuàng)建應(yīng)該從頭緊密集成到其余生態(tài)系統(tǒng)中的工具。
使用GWT幾乎不可能實(shí)現(xiàn)這樣的目標(biāo)。 盡管GWT具有與JavaScipt雙向交互的方式,但該框架無(wú)法擺脫UI,RPC庫(kù)和其他應(yīng)用API的巨大負(fù)擔(dān)。
那是什么野獸
正如開(kāi)發(fā)人員所聲稱(chēng)的那樣 ,J2CL將Java代碼無(wú)縫集成到JavaScript應(yīng)用程序中。 它代表了一個(gè)簡(jiǎn)單輕巧的Java-to-JavaScript 編譯器 ,該編譯器專(zhuān)注于借助Closure Compiler進(jìn)行代碼優(yōu)化。
- 在一個(gè)項(xiàng)目中輕松混合Java和JavaScript,以充分利用每種語(yǔ)言的優(yōu)勢(shì)。
實(shí)際上,J2CL將源Java代碼轉(zhuǎn)換為沒(méi)有Java類(lèi)字節(jié)碼JavaScript代碼。 這意味著,與Google Web Toolkit一樣,項(xiàng)目編譯需要所有使用的庫(kù)源。 此外,它提出了最新版本支持的Java語(yǔ)言功能的問(wèn)題。 在此階段,開(kāi)發(fā)人員承諾將支持Java 11的所有語(yǔ)法功能。
J2CL不支持GWT窗口小部件,GWT RPC和其他GWT庫(kù),僅支持基本的Java和JavaScript集成工具JSInterop 。
也就是說(shuō),這是一個(gè)非常有限的GWT版本,帶有全新的編譯器。 并且由于新產(chǎn)品不再與GWT兼容,因此稱(chēng)為J2CL而不是GWT。 總體而言,即將發(fā)布的GWT 3版本將代表基于J2CL的框架,其中所有適用的庫(kù)都將與翻譯器系統(tǒng)級(jí)別分開(kāi)。
現(xiàn)有的Java兼容性限制在GitHub上進(jìn)行了描述。 它們基本上與GWT中的相同-沒(méi)有反射支持,沒(méi)有網(wǎng)絡(luò)Java API。 但是也有一些不同之處–不會(huì)模擬數(shù)組和列表的語(yǔ)義,例如,不執(zhí)行數(shù)組中索引的檢查。 開(kāi)發(fā)人員重點(diǎn)放在JVM行為仿真上,而不是在語(yǔ)言的語(yǔ)法上,以最大程度地減少開(kāi)銷(xiāo)成本并避免生成大量JavaScript以確保完全兼容性。
盡管J2CL已準(zhǔn)備好投入生產(chǎn),但其OSS版本離它還很遙遠(yuǎn)。 例如, Windows上的項(xiàng)目啟動(dòng)存在一些問(wèn)題,開(kāi)發(fā)人員無(wú)法保證穩(wěn)定的API。
選擇Bazel作為內(nèi)部Google產(chǎn)品的構(gòu)建系統(tǒng)是很公平的,但是它對(duì)社區(qū)沒(méi)有任何好處,除了學(xué)習(xí)該構(gòu)建系統(tǒng)之外,沒(méi)有其他方法可以使用J2CL。 同時(shí),我們只能等待社區(qū)為Maven / Gradle制作插件。
開(kāi)始工作
首先,J2CL需要Mac OS或Linux。
其次,您必須安裝Bazel –而不是Google制造的異國(guó)情調(diào)的構(gòu)建系統(tǒng)。
現(xiàn)在,您可以從官方存儲(chǔ)庫(kù)中構(gòu)建一些東西,例如HelloWorld。
> bazel build src/main/java/com/google/j2cl/samples/helloworld:helloworld
當(dāng)您查看輸出時(shí),您會(huì)驚喜地發(fā)現(xiàn):
> cat bazel-bin/src/main/java/com/google/j2cl/samples/helloworld/helloworld.js
document.write('Hello from Java! and JS!');
當(dāng)然,它什么都沒(méi)有證明,但是很高興在所有GWT模塊之后都能看到如此的簡(jiǎn)約。 沒(méi)有其他應(yīng)用程序示例,因此我們將等它們顯示出來(lái)。
如果我們有xxx.js是什么意思
目前,很難說(shuō)出它的用途。 乍一看,J2CL包含一個(gè)大膽的想法–以與TypeScript相同的方式將Java重用于前端。 另一方面,該項(xiàng)目似乎錯(cuò)過(guò)了機(jī)會(huì)。
諸如Kotlin.js和Scala.js之類(lèi)的新JS transpiler項(xiàng)目被實(shí)現(xiàn)為編譯器的插件,并且不需要源代碼解析。 從這個(gè)角度來(lái)看,J2CL落后了一步,因?yàn)樗枰M(jìn)行源分析。
還有一個(gè)問(wèn)題是Java本身。 當(dāng)您可以在簡(jiǎn)潔的Kotlin上同時(shí)編寫(xiě)服務(wù)器端和客戶(hù)端時(shí),為什么還要使用冗長(zhǎng)的Java?
但是,與另一個(gè)類(lèi)似的項(xiàng)目JSweet相比 ,我更信任J2CL。 JSweet工具更友好,更實(shí)用,但是JSweet社區(qū)很小,幾乎完全由一個(gè)人編寫(xiě)。
所以你說(shuō)它是開(kāi)源的?
該項(xiàng)目獲得了Apache 2.0免費(fèi)許可絕對(duì)是一個(gè)好消息。
不幸的是, 開(kāi)放源代碼與開(kāi)放開(kāi)發(fā)過(guò)程不同 。 社區(qū)最大的失望是由于當(dāng)前的情況而出現(xiàn)的,J2CL項(xiàng)目是3年前宣布的,但是沒(méi)有人顯示其源代碼,您無(wú)法影響其最終API或加快開(kāi)發(fā)過(guò)程,因?yàn)闊o(wú)處可發(fā)送修補(bǔ)程序。
讓我們希望情況會(huì)發(fā)生最好的變化,并且產(chǎn)品會(huì)投入使用。
翻譯自: https://www.javacodegeeks.com/2018/12/j2cl-better-late-never.html
總結(jié)
以上是生活随笔為你收集整理的J2CL –迟到总比不到好的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 腾讯漫画首页电脑版(腾讯漫画首页电脑版在
- 下一篇: 吞吐量-Corda的故事