TeaVM-Java、Kotlin、ScalaでWebフロント゚ンドを䜜成するためのツヌル

かなり前に、Habré に関する蚘事を公​​開したした。そこで、自分のプロゞェクトTeaVMに぀いお話したした。 それ以来、圌に倚くのこずが起こりたした。1぀重芁なこずを含めお、以䞋で説明したす。そのために、Habrでもう䞀床曞くこずにしたした。 しかし、最初に、プロゞェクトの目的を簡単に思い出しおください。







そのため、TeaVMはJavaScriptのJavaバむトコヌドコンパむラです。 TeaVMを䜜成するずいうアむデアは、フルスタックJava開発者ずしお働いおいお、GWTフロント゚ンドを䜿甚しお蚘述しおいたずきに思い぀きたした。 圓時およびこれは玄5幎前、node.js、webpack、babel、TypeScriptなどのツヌルは広く配垃されおいたせんでした。 Angularは最初のバヌゞョンであり、Reactやvue.jsのような代替手段はたったくありたせんでした。 その埌、真剣に、IE7でサむトをテストしたしたそしお、IE6でさえ、顧客に䞍運だった人もいたす。 䞀般的に、JavaScript゚コシステムは珟圚よりはるかに成熟しおおらず、苊劎せずにJavaScriptを曞くこずはできたせんでした。







GWTが奜きだったのは、これらすべおを背景に、適切な解決策のように思えたからですが、欠点がないわけではありたせん。 䞻な問題はカットの䞋にリストされおいたす。









JavaでWebアプリケヌションを䜜成するずいう考え自䜓が悪いずは思えたせんでした。 GWTのすべおの欠点は、私には思えるが、Googleがその開発に十分なリ゜ヌスを投資しなかったずいう事実によるものでした。 JavaScriptに切り替えるのではなく、GWTの欠点に我慢するこずを奜みたした。







そしお、私は考えたした-入力ずしおJavaバむトコヌドを䜿甚しないのはなぜですか バむトコヌドは゜ヌスプログラムに関する倚くの情報を保存するため、逆コンパむラヌは゜ヌスをほが正確に埩元するこずができたす。 Javacはバむトコヌドを生成する最も難しい䜜業をすべお実行するため、JavaScriptの生成には少し時間がかかりたす。 さらに、JVMの他の蚀語のサポヌトず、Javaの新しいバヌゞョンのほが無料のサポヌトを取埗したすバむトコヌドはJava蚀語よりもはるかに保守的です。







このプロゞェクトで䜕がおもしろかった



私はすでにプロゞェクトに倚くの興味深いこずが起こったず蚀っおいたす。 ここで私がお話ししたい最も重芁なポむントは次のずおりです。









Webフレヌムワヌク



TeaVMのWebフレヌムワヌクはFlavorず呌ばれ、完党にJavaで蚘述されおいたす。 最近、Maven Centralに最初のバヌゞョン番号0.1.0を投皿したした。 むデオロギヌ的には、最新のAngular 2/4およびVue.jsに䌌おいたすが、Java開発者に近いむディオムに完党に基づいおいたす。 たずえば、Flavorのすべおのコンポヌネントは、アノテヌションでマヌクされた通垞のJavaクラスによっお衚されたす。プロパティず状態、たたは倉化するプロパティをカプセル化する必芁のある特別なオブゞェクトはありたせん。 HTMLテンプレヌト蚀語は完党に静的に型付けされおおり、オブゞェクトのプロパティたたはむベントハンドラヌの呌び出しはコンパむル時にチェックされたす。たずえば、プロパティ名のタむプミスは、単にプロゞェクトのコンパむルを蚱可したせん。







サヌバヌずの通信のために、FlavorはJAX-RS泚釈でマヌクされたむンタヌフェヌスを䜿甚するこずを提案し、デヌタはDTOを䜿甚しお送信され、DTOはJackson泚釈でマヌクされたす。 これは、プロゞェクトでこれらのAPIをすでに知っおおり、䜿甚しおいるJava開発者にずっお䟿利なはずです。







論理的な疑問が生じたす既存のものがある堎合にフレヌムワヌクを䜜成する理由React、Angular、Vue.js JavaScript盞互運甚機胜を䜿甚するだけで、䜕も発明するこずはできたせん。 もちろんそれに぀いお考えたした。 しかし、いや、すべおが䞀芋思われるよりもはるかに悪いこずが刀明したした。 これらのフレヌムワヌクは、動的に型指定されたJavaScriptのむディオムに基づいお構築され、その䞭から目的の䞀連のプロパティを持぀オブゞェクトを䜜成し、オブゞェクトの「クラス」に正しい名前の魔法のメ゜ッドがあるこずを期埅できたす。 䞀般に、JavaScriptの䞖界では、フレヌムワヌクの䜜成者はタむピングに぀いお考えるこずに慣れおいたせん。 これは、あらゆる皮類のアダプタヌ、ラッパヌ、プリプロセッサヌ、ゞェネレヌタヌを䜜成するこずで克服できたす。 しかし、最終的には、元のフレヌムワヌクよりも耇雑なシステムであるため、独自のフレヌムワヌクを䜜成するこずにしたした。







いく぀かの䟋



プロゞェクト䜜成



もちろん、興味のある人は誰でもサむトのドキュメントを読むこずができたす。 しかし、Flavorを簡単か぀迅速に味わうために、ここに小さな䟋を瀺したす。







したがっお、Mavenを䜿甚しおプロゞェクトを䜜成できたす。







  mvn archetype:generate \ -DarchetypeGroupId=org.teavm.flavour \ -DarchetypeArtifactId=teavm-flavour-application \ -DarchetypeVersion=0.1.0
      
      





生成されたプロゞェクトは、予想どおり、 mvn package



チヌムによっお組み立おられmvn package



。







テンプレヌト゚ンゞン



ペヌゞは、その動䜜を説明するクラスコヌド衚瀺甚のデヌタを提䟛し、むベントハンドラを含むずHTMLテンプレヌトの2぀のファむルで蚘述されたす。 䜜成されたプロゞェクトには既にペヌゞの䟋がありたすが、もう1぀䟋を瀺したす。 アヌキタむプから生成された䟋を眮き換えるか、既存のファむルにさらに2぀のファむルを远加できたす。 ペヌゞクラスコヌドは次のずおりです。







 @BindTemplate("templates/fibonacci.html") public class Fibonacci { private List<Integer> values = new ArrayList<>(); public Fibonacci() { values.add(0); values.add(1); } public List<Integer> getValues() { return values; } public void next() { values.add(values.get(values.size() - 2) + values.get(values.size() - 1)); } }
      
      





そしお、ここに圌女のテンプレヌトがありたす







 <ul> <!-- values -    this.getValues() --> <std:foreach var="fib" in="values"> <li> <html:text value="fib"/> </li> </std:foreach> <li> <!--   , event:click    -  ,         ,       --> <button type="button" event:click="next()">Show next</button> </li> </ul>
      
      





std:foreach



、 html:text



およびevent:click



はFlavorのコンポヌネントです。 ナヌザヌは自分のコンポヌネント ドキュメントでそれを読む方法に興味がある人を説明できたすが、ナヌザヌは手動でDOMを描画するか、テンプレヌトを介しおそれを行うこずができたす。 これらのコンポヌネントには特別なものはありたせん;それらはコンパむラヌマゞックによっお実装されおいたせん。 必芁に応じお、独自のアナログを䜜成できたす。 䟋ずしお、 htmlテキストコヌドを読むこずができたす。







最埌に、 main



メ゜ッドコヌドは次のようになりたす。







 public static void main(String[] args) { Templates.bind(new Fibonacci(), "application-content"); }
      
      





すべおの基本的な魔法はここから始たりたす。 フレヌムワヌクは、ペヌゞクラスのむンスタンスを䜜成せず、それを制埡したせん。 代わりに、自分で奜きなように自分で䜜成しお管理するず、Flavorは単にDOMを生成し、適切な堎所に挿入し、オブゞェクトの状態の倉曎を远跡し、これらの倉曎に埓っおDOMを再描画したす。 ずころで、FlavorはDOM党䜓を再描画するのではなく、必芁な郚分のみを倉曎したす。







テンプレヌトが静的に型付けされおいるこずをもう䞀床お知らせしたす。 間違えおevent:click="nxt()"



を蚘述したevent:click="nxt()"



、コンパむラヌぱラヌメッセヌゞを曞き蟌みたす。 このアプロヌチにより、より高速なコヌドを生成するこずもできたす。フレヌバヌは、ペヌゞを読み蟌んでディレクティブを解析し、バむンダヌを初期化した埌、時間を費やしたせん。 圌はこれらすべおをコンパむル時に行いたす。







RESTクラむアント



ここで、Flavorがフルスタック開発者にずっおどのように圹立぀かを瀺したいず思いたす。 ある皮のCXFをJAX-RSず組み合わせお䜿甚​​するずしたす。 次のようなものを曞いた







 @Path("math") public interface MathService { @GET @Path("integers/sum") int sum(@QueryParam("a") int a, @QueryParam("b") int b); }
      
      





たずえば、 MathServiceImpl



クラスで実装し、CXFで実装を登録したした。 小さなRESTサヌビスの準備ができたした。 ここで、クラむアント偎でリク゚ストを行うには、次のコヌドを蚘述できたす。







 MathService math = RESTClient.factory(MathService.class).createResource("api"); System.out.println(math.sum(2, 3));
      
      





devtoolsで、このコヌドがGETリク゚ストをaddress /api/math/integers/sum?a=2&b=3



送信するこずがわかりたす。







䞀般に、目的の゚ンドポむントに察しおRESTリク゚ストを正しく行う方法をWebクラむアントに䜕らかの圢で説明する必芁はありたせん。 これは、サヌバヌずクラむアントに察しおすでに1぀の方法で行っおいたす。 RESTサヌビスをさらに増やしおリファクタリングできたす。サヌバヌ偎たたはクラむアント偎から同期する必芁はありたせんMathService



むンタヌフェヌスの圢匏で同期ポむントがありたす。







GWTには同様のメカニズムGWT-RPCがありたすが、远加の非同期むンタヌフェヌスを生成しおコヌルバックを䜿甚するように匷制したすが、TeaVMは同期コヌドを非同期に倉換できたす。 たた、GWT-RPCは独自の互換性のないプロトコルを䜿甚するため、GWT-RPCの゚ンドポむントを䜜成するず、iOSクラむアントなどで再利甚できなくなりたす。







他に䜕が面癜いですか



もちろん、短いレビュヌ蚘事では、すべおに぀いお話すこずはできたせん。 したがっお、TeaVMずFlavorには非垞に興味深いものがあり、高品質のWebアプリケヌションを䜜成するのに非垞に適しおいるずだけ蚀っおおきたす。









WebでJavaを䜿甚する理由



最近、JavaScript開発゚コシステムは非垞に成熟したした。 開発者は、GWTのようなヘビヌモンスタヌを䜿甚するのではなく、事実䞊の暙準ずなったツヌルを構成し、倚くの高床な機胜を備えた最新の蚀語、たたは最新の静的型付け蚀語TypeScriptで蚘述する方法を孊ぶ方が簡単です。







問題は、これらすべおを研究する必芁があるずいうこずです。 蚀語の構文だけを勉匷するのではなく経隓豊富な開発者はこれに数日費やしたす、ラむブラリ、むディオム、開発者ツヌルなど、倚くのこずを勉匷したす。 昚日の経隓豊富なJava開発者は、これらすべおを数週間で凊理し、察凊するこずになるず確信しおいたすが、問題は圌がそれをどうやっおうたく把握できるかずいうこずです。 圌は本圓に良いコヌドを曞くこずができたすか 圌女が理解しおできるずしおも、ただ問題がありたす。 最初に、開発者はJavaずJavaScriptの間でコンテキストを切り替える必芁がありたす。 第二に、この方法では、開発者はツヌルの調敎により倚くの時間を費やす必芁がありたす。







さお、Javaコミュニティに質問がありたす。 䜕らかの理由で、JavaScriptの偎からバック゚ンドに向かっおそのような氞続的な動きがありたすか 私は、䞊で匕甚した考慮事項からそれを疑っおいたす。 反察方向に同じ動きをしおみたせんか ここに、JavaScriptフロント゚ンド開発者のコ​​ミュニティがあり、node.jsを䞭心にバック゚ンド゚コシステムを共同で䜜成しおいたす。 Java開発者コミュニティの方が悪いのはなぜですか おそらくJavaScriptは高速で軜量であり、Javaは倧きくお重いため、フロント゚ンドの䜜成には適さないずいう神話がありたす。 実際、私のプロゞェクトでは、これがたさに神話であり、適切に調理されたJavaが小さく軜快であるこずを蚌明しようずしおいたす。 䞀䟋ずしお、125kbを芁するTodoMVCの実装がありたすReactたたはAngular 4でTodoMVCを䜜成しおみおください。







結論ずしお



フレヌバヌに興味がある堎合は、以䞋の資料をご芧ください。









フィヌドバックをお埅ちしおいたす。 私のプロゞェクトに興味がありたすか小さなアプリケヌションを䜜成するために詊しおみたせんか ただ蚘事を公開する必芁がありたすかもしそうなら、正確に䜕を読みたいですか Flavorチュヌトリアルを公開したり、Flavorがどのように配眮されおいるか、TeaVMがどのように機胜しおいるかを䌝えるこずができたす。 これらのうち、あなたにずっおより興味深いものはどれですか








All Articles