web-dev-qa-db-ja.com

なぜGWTなのか?このRIAフレームワークを使用することの利点とトレードオフ

私はGWTに関する「最も投票数の多い」質問をたくさん読んでいます。これらの質問のいくつかは、GWTの落とし穴や問題について話します。

記事: どのJavascriptフレームワーク(jQuery vs Dojo vs…)? および 最大のGWTの落とし穴? 、一部のポスターは、GWTが十分に軽量ではない、またはあることを示唆しているようです。使用できるより良い代替案。

ほとんどの人は、GWT 2.0で修正されていないGWTの問題があると感じていますか?それは、新しいプロジェクトにもっと単純なフレームワークを使用することを提案する傾向がありますか?

ある程度、GWTはある程度将来性があるべきではありません(リリースごとに大幅に変更されることを心配する必要がなく、Googleによってサポートされているため)?

この質問への答えは、あなたが何をしたいのか、何をしたいのかによって大きく異なることを私は理解しています。私はこれを、最終的に何百万ものユーザーが使用する新しいWebアプリケーションを開始するという観点から見ています。

36
Michael Balint

トレードオフ

私が思いつくことができるすべてのトレードオフから始めましょう:

  • あなたはJavaを使用しています-それはあなたのwebdevsのjavascriptの習熟度がそれほど役に立たないことを意味します(あなたが手を出すと役に立ちますJSNI)
  • 検索エンジンによるインデックス作成の問題-私見ですが、これはGWTまたは一般的な純粋なJSWebアプリケーションを使用することの最大の欠点です。コンテンツ、レイアウト、すべてがJSで「オンザフライ」で作成されるため、検索エンジンには非常に短いHTMLページしか表示されません。これは、なんらかの方法で(たとえば、を使用して)処理する必要があります。 クローキング )。グーグルはついに このための解決策に取り組み始めた 、しかしそれは私には魅力的ではないようです。
    更新:Googleは 最終的に対処 この問題。ただし、アプリケーションをクローアブルにするには、他のフレームワークよりも多くの労力が必要になるため、これはトレードオフとして残しておきます。少なくとも今は従うべき「標準」があり、疑わしいテクニック( cloaking など)を使用する必要はありません。
  • (特にGWTの初心者にとって、特にその人がHTML/JSのバックグラウンドを持っている場合、オブジェクト指向の経験があまりない場合)、すべて「すごい、これら」に行くのは簡単です。オブジェクトのことはとてもかっこいいので、すべての<div>を別々のオブジェクトにしましょう。そうすれば、コードはすべてき​​れいになります。」もちろん、私はそれを誇張しすぎていますが、要点はわかります-経験の浅いプログラマーが、のすべてのセルにたくさんのWidgetを含む本格的なHandlersを置くことができることは容易に想像できます。 a FlexTable...そして、なぜアプリケーションが遅く感じるのか疑問に思うのに多くの時間を無駄にします;)tl; dr:GWTの初心者にとっては簡単ですドキュメント/サンプル/常識に沿っているように見えるコードを書くことによってアプリケーションを「肥大化」させる;)提案

これで、私が考えることができるトレードオフはすべてです。誰かが何かを追加したい場合は、コメントを追加してください。

利点

今利点のために。 internationalizationcross-browser compatible のようなものは、他のGoogleのライブラリと簡単に統合できるので、簡単に理解できるので、スキップします。あまり強調されていないが、それでも非常に重要な機能に焦点を当てようとします。

  • コンパイラ-今、私がGWTについて話したほとんどの人は、GWTのこの部分がどれほど素晴らしいかを理解していません-初心者のために- 昨年のGoogleIOからのこのプレゼンテーション 。コンパイラーは、アプリケーション全体を表示します。

したがって、canは次のようなものを最適化できます:

public class ShapeExample implements EntryPoint {
  private static final double SIDE_LEN_SMALL = 2;
  private final Shape shape = new SmallSquare();
  public static abstract class Shape {
    public abstract double getArea();
  }
  public static abstract class Square extends Shape {
    public double getArea() { return getSideLength() * getSideLength(); }
    public abstract double getSideLength();
  }
  public static class SmallSquare extends Square {
    public double getSideLength() { return SIDE_LEN_SMALL; }
  }
  public void onModuleLoad() {
    Shape shape = getShape();
    Window.alert("Area is " + shape.getArea());
  }
  private Shape getShape() { return shape; }
}

..これに:

public class ShapeExample implements EntryPoint {
  public void onModuleLoad() {
    Window.alert("Area is 4.0");
  }
}

そして、これを難読化して最小化します。さらに、これはそのような方法で行われるため、結果のファイルはgzipを介してより圧縮可能になります。

  • Javaを使用しています-Javaが好きかどうかに関係なく、Javaが非常に優れたオブジェクト指向言語であることは否定できません。 、これにより、保守が容易でテスト可能なコードを記述できます(JavaScriptではそれほど可能ではないと思います)。 適切なガイドライン に従うと、自分だけでなく他の開発者にとっても理解できるコードにたどり着きます。言及する価値のあるもう1つのことは、「純粋な」Javaで機能するすべてのNiceデザインパターンなどがここでも機能することです。
  • gWTの優れた点の1つは、フレームワークのほぼすべての新しいリリースで、パフォーマンスの向上と無料の新機能が得られることです。 Java JavaScriptにコンパイルされているため、再コンパイルするだけで、新しいコンパイラで行われた最適化を利用したり、新しい機能(GWTで導入された アクセシビリティサポート など)を取得したりできます。 1.5)。
  • debugging-他のJavaと同じように、GWTアプリをデバッグできる(そしてすべきです:))ことは言及する価値があります=アプリケーション、IDEのデバッガーを使用します。そして、一般的に、私が見たJavaデバッガーは、対応するJavaScriptよりも高度です。
  • UiBinder-まだ「完璧」ではありませんが、 iBinder XMLを使用して簡単で直感的な方法でウィジェットを設計できます(これをJavaで強制する2.0より前の方法とは対照的です)。 HTMLとGWTのウィジェットを組み合わせるのはこれほど簡単で楽しいことはありません;)
  • CSSでの作業-もちろん、GWTは常にCSSを採用してきましたが、GWT 2.0(およびUiBinder)の導入により、CSSを別のレベルに引き上げました。 「通常の」WebアプリケーションからのCSSファイルを見てみましょう-数千行ではないにしても数百行、ナビゲートが難しく、一部のスタイルは冗長ですが、まったく使用されていないものもあり、このミックスに追加しますIE6/7を喜ばせる必要があり、悪夢に見舞われます。 GWTを使用すると、CSSのJSコードで実行したのと同様のタスクを実行するように指示できます。これにより、未使用のCSSスタイルがすべて削除され、必要に応じてマージされ、クラス名が最小化されて難読化されます。 その他多数 (CSSファイルの条件、定数などを含む)。スタイルをそれぞれのUiBinderのXMLファイルに保持することをお勧めします。これにより、スタイルの整理と検索が非常に簡単になります。大事なことを言い忘れましたが、CSSスタイル名のスペルを間違えるとエラーが発生します-Firebugまたは同様のツールを介して同じことをしようとするよりも面倒ではありません
  • [〜#〜] oophm [〜#〜]-アウトプロセスホストモード、これにより、GWTの最大の欠点の1つが修正されました-現在、選択したブラウザでホストモードを使用できます(その選択がFirefox、Safari、IEまたはChromeの場合、ただし、少なくとも任意のバージョンを使用できます)。 OOPHMを使用すると、VMでWindowsを実行したり、IE)からホストOS(Linux/MacOS)で実行されているホストモードに接続したりすることもできます。ハッキングは必要ありません。コンパイルごとにファイルをコピーするなど
  • あなたは/ ˈɡwɪt /をたくさん言うようになります;)(これは Google IO 2009 、IIRC)のプレゼンテーションの1つからの引用です)
  • さらに多くの.. Google IO 2009 )のビデオを見て、 GWT wiki を参照して、作成に役立つその他の情報を確認してください。 GWTを使用すると、RIAが簡単になり、エラーが発生しにくくなります:)

その間に

あなたの経験や好みに応じて、以下が利点になるかもしれません(私にとってはそうですが、時にはそれはPITAです;))またはそうではありません:

  • すぐに使用できる ウィジェットのコレクション は小さくシンプルに保たれています。さて、本格的なGUIフレームワーク(Webまたはデスクトップ)を使用している場合、GWTのウィジェットの数が比較的少ないことに驚かれるかもしれません。しかし、GWTの開発者によると、意図的にこのように保たれています。基本的なウィジェットは、独自に構築するために必要なすべてのツール/「ブロック」であり、ニーズに合わせてカスタマイズされています。別の方法は、多くのユースケースをサポートする必要のあるさまざまな汎用ウィジェットを提供することです...その結果、UIが少し遅くなります(少なくともIMHO - SmartGWT またはのようなプロジェクトを自分でチェックしてください) Ext GWT )。つまり、GWTウィジェットは非常にうまく記述されています-たとえば、 SuggestBox には、デフォルトの動作を独自の動作でオーバーライドできる場所がたくさんあります-別の方法を指定できます提案を表示するには( SuggestBox.SuggestionDisplay )、ユーザーが提案を選択したときにカスタムアクションを実行するか( SuggestBox.SuggestionCallback )、または単にカスタムを提供します- SuggestOracleSuggestBoxSuggestion s ..

結論は-GWTを試してみてください。きっと気に入るはずで、純粋なJavaScriptで二度と書きたくないでしょう;)

52
Igor Klimer

バージョン1.3がリリースされて以来、GWTを使用して小規模(〜2K Javaクラス)から中規模(〜6K)のエンタープライズシステムを定期的に構築しています。解決すべきさまざまな問題があることを理解しています。毎秒数千回のクリックがあるパブリックサイトで、GWT1.xの最大の問題とGWT2.0がそれにどのようにアプローチするかについて説明しようと思います。

ブラウザのメモリリーク GWTによるIE6のリークは非常に大きく、IE7のリークは定期的なページの更新で補うことができます。IE8はこの分野である程度の安定性を約束しますが、企業ではまだ広く受け入れられていません。もちろん、ネイティブJS呼び出しのない有効なGWTコードでも、特定のケースでメモリリークが発生します。特にUIが複雑で、Panel.clear()呼び出しを多数実行している場合。現時点では、リークの本当の原因を特定するための便利なツールはありません。ブラウザ自体をハッキングする方法を知らない限り。

レンダリングパフォーマンス特に一般的に使用されるカスタムウィジェットを作成する場合は、UIコードを慎重に記述する必要があります。 JavaScript、CSS、DOMに関する深い知識が必要です。このトピックに関するインターネットにはたくさんの資料があります。 GWTウィジェットレベルから直接DOM操作に移行する方法とタイミングを知る必要があります。

ダウンロード可能なコンテンツのサイズ 2.0より前では、アプリケーションに「ハード」ナビゲーションを組み込むことなく、モジュールを異なるダウンロード可能な部分に分割することは不可能でした。ただし、JavaScriptコンテキストがクリアされ、ウィンドウの再読み込みが必要になります。

I開発者のマインドシフト経験豊富なUI開発者は知らないJavaおよびOOP。経験豊富なJava開発者はCSSを知らない、 JS、HTMLであり、UIの構築は好きではありません。UIバインダーは正しい方向に進んでいます。

1.3-> 1.5-> 1.7の移行を行いましたが、それは常に再コンパイルといくつかのCSS修正でした。 GWT 2.0は、多くの非推奨のコードと初期アプローチ(プロジェクト構造、GWTShell)を削除し、迅速に移行するのが難しい場合があります。しかし、すべての機能は有望に見え、Googleがレガシーコードをある時点で削除したことは良いことです。 2.0の安定性については、実際のプロジェクトではまだ使用していないため、よくわかりません。

お役に立てれば。

10
Dmitry Buzdin

多数のSelenium受け入れテストを備えたGWTアプリがあります。私は(あなたのように)GWTを1.7から2.0にアップグレードするのは確かに安全だと思いました。そしてそれは-ほとんどでした。アプリは「人間」のユーザーでも同じように機能しましたが、Seleniumのテストはすべて失敗しました。 Seleniumの新しいバージョンが準備中です(アルファリリースで、多くのUnsupportedOperationsがあります)が、GWT 2を使い続けたい場合は、ある程度のテスト容易性を放棄する必要があるようです。したがって、「将来性のある」仮定には注意してください。

GWTを使用するという私たちの決定は、YUIとZKを比較した後、数か月前に行われました。 GWTを選んでよかったです。 GWTWebサイトでのサポートのレベルとドキュメントの一般的な品質は非常に高いようです。

GWTはモジュール分割を行い、パフォーマンスプロファイリングを提供します。これは、十分に軽量ではないという議論に対抗するのに役立ちます。

4
John