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}}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章