私は、GWT を使用して実装することを選択したプロジェクトの最初/途中にいます。GWT (および GWT-EXT) を使用する際に、克服できなかった重大な落とし穴に遭遇した人はいますか? パフォーマンスの観点からはどうですか?
私たちがすでに見たり聞いたりしたことには、次のようなものがあります。
- Google がコンテンツをインデックスに登録できない
- CSS とスタイリングは一般的に少し不安定なようです
これらのアイテムに関する追加のフィードバックも探しています。ありがとう!
まず、私は GWT の大ファンですが、多くの落とし穴がありますが、克服できたすべてではないにしても、ほとんどの場合:
問題:長いコンパイル時間。プロジェクトが大きくなると、コンパイルにかかる時間が長くなります。20 分のコンパイルのレポートを聞いたことがありますが、私のものは平均で約 1 分です。
解決策:コードを個別のモジュールに分割し、変更された場合にのみビルドするように ant に指示します。また、開発中は、1 つのブラウザー用にビルドするだけで、コンパイル時間を大幅に短縮できます。これを行うには、これを .gwt.xml ファイルに入れます。
<set-property name="user.agent" value="gecko1_8" />
gecko1_8 は Firefox 2+、ie6 は IE などです。
問題:ホスト モードは非常に遅く (少なくとも OS X 上では)、JSP や Rails ページなどを編集してブラウザで更新を押したときに得られる「ライブ」の変更とは一致しません。
解決策:ホスト モードにより多くのメモリを与えることができます (私は一般的に 512M を取得しました) が、それでも遅いです。GWT を十分に使用できるようになったら、これを使用するのをやめることがわかりました。大量の変更を加えてから、1 つのブラウザー (通常は 20 秒分のコンパイル) 用にコンパイルしてから、ブラウザーで更新を押します。
更新: GWT 2.0+ では、新しい「開発モード」を使用するため、これはもはや問題ではありません。これは基本的に、選択したブラウザでコードを直接実行できることを意味するため、速度が低下することはなく、バグを報告したり検査したりできます。
http://code.google.com/p/google-web-toolkit/wiki/UsingOOPHM
問題: GWT コードは Java であり、HTML ページのレイアウトとは異なる考え方を持っているため、HTML デザインを GWT に変換するのが難しくなります。
解決策:これにも慣れますが、残念ながら、HTML デザインを GWT デザインに変換することは、HTML デザインを JSP ページに変換することよりも常に遅くなります。
問題: GWT は理解するのに少し時間がかかりますが、まだ主流ではありません。つまり、チームに参加したり、コードを維持したりするほとんどの開発者は、ゼロから学習する必要があります。
解決策: GWT が普及するかどうかはまだわかりませんが、企業が採用担当者を管理している場合は、GWT を知っているか、それを学びたいと思っている人をいつでも選ぶことができます。
問題: GWT は、jquery や単純な JavaScript などと比較して大ハンマーです。それを実現するには、JS ファイルを含めるだけでなく、より多くのセットアップが必要です。
解決策: jquery などのライブラリーを、それらに適した小規模で単純なタスクに使用します。AJAX で本当に複雑なものを構築する場合や、RPC メカニズムを介してデータをやり取りする必要がある場合は、GWT を使用します。
問題: GWT ページにデータを入力するために、ページが最初にロードされたときにサーバー呼び出しを行う必要がある場合があります。必要なデータを取得している間、そこに座って読み込み中のシンボルを見るのは、ユーザーにとって煩わしい場合があります。
解決策: JSP ページの場合、ページは HTML になる前にサーバーによって既にレンダリングされているため、実際にすべての GWT 呼び出しを行い、それらをページにプリロードして瞬時にロードすることができます。詳細はこちらをご覧ください:
GWT 呼び出しを事前にシリアル化することで、ページの読み込みを高速化します
箱から出して、カスタムまたはその他の方法で、ウィジェットの CSS スタイルを設定する際に問題が発生したことは一度もありません。
パフォーマンスに関しては、一度コンパイルされた GWT コードは高速であり、AJAX 呼び出しはページ全体を更新するよりもほとんど常に小さいことがわかっていますが、これは GWT に固有のものではありません。 Java バックエンドは非常にコンパクトです。
私たちはほぼ 2 年間 gwt を使用しています。私たちは多くの教訓を学びました。これが私たちの考えです:
サードパーティのウィジェット ライブラリ、特に gwt-ext を使用しないでください。デバッグ、開発、実行時のパフォーマンスが低下します。これがどのように行われるかについて質問がある場合は、直接私に連絡してください。
gwt を使用して、アプリの動的部分のみを入力します。したがって、多数のフィールドを使用する複雑なユーザー操作がある場合。ただし、付属のパネルは使用しないでください。ストック デザイナーが提供する既存のページを使用します。アプリのコントロールを含む領域を切り出します。これらのコントロールを onModuleLoad() 内のページにアタッチします。このようにして、デザイナーの標準ページを使用し、gwt の外部ですべてのスタイリングを行うこともできます。
すべての部分を動的に構築する 1 つの標準ページとしてアプリ全体を構築しないでください。項目 2 で提案したことを行うと、いずれにせよ、これは起こりません。すべてを動的にビルドすると、パフォーマンスが低下し、中規模から大規模のアプリでは大量のメモリが消費されます。また、私が提案していることを実行すると、戻るボタンがうまく機能するので、検索エンジンのインデックス作成などもうまくいきます.
他のコメンターもいくつかの良い提案をしました。私が使用する経験則は、標準の Web ページを作成するのと同じようにページを作成することです。次に、動的にする必要がある部分を切り出します。それらをIDを持つ要素に置き換えてRootPanel.get( id ).add( widget )
から、それらの領域を埋めるために使用します。
私たちが遭遇した落とし穴:
GWT EXTのようなものを使用することで多くのマイレージを得ることができますが、JavaScriptライブラリの上でこの種の薄いベニヤを使用するときはいつでも、デバッグする能力を失います。GWT EXTテーブルクラスで何が起こっているのかを(IntelliJデバッガー内で)検査できないため、何度も机に頭をぶつけてきました...あなたが見ることができるのはそれがJavaScriptObjectであるということだけです。これにより、何が問題になっているのかを把握するのが非常に困難になります...
チームにCSSを知っている人がいない。私の経験から、その人が専門家でなくてもかまいませんでした...彼はある程度の実用的な知識を持っていて、必要に応じてグーグルに適切な用語を知っていれば十分です。
ブラウザ間でのデバッグ。アウトプロセスホステッドモード[ 1 ][ 2 ][ 3 ]に注目してください。できれば、GWT 1.6で提供されます...今のところ、ホステッドモードで問題を解決してから、[コンパイル/参照]ボタンを使用する必要があります。 、他のブラウザで遊ぶことができます。私にとって、Windowsで作業しているということは、FireFoxで自分の作業を表示し、FireBugを使用して調整や改善に役立てることができることを意味します。
IE6。さまざまなIE6が物事をどのようにレンダリングするかは驚くべきことです。次のようなCSSルールを使用できるように、ブラウザに応じて最も外側の「ビューポート」にスタイルを適用するというアプローチを採用しました。
.my-style { /* stuff that works most everywhere */ }
.msie6 .my-style { /* "override" so that styles work on IE 6 */ }
最後に、役立つエディターを使用してください。私はIntelliJを使用しています-GWTスマートがたくさんあります。たとえば、JREエミュレーションで処理されないクラスを使用しようとすると、通知されます。ウィジェットのスタイルを指定し、そのスタイルをまだ定義していない場合、コードは少し赤い波線になります...または、CSSを見ると、競合する属性を指定したときに通知されます。単一のルール。(まだ試していませんが、バージョン8では、「ローカル」および「非同期」のRPCインターフェイスと実装の同期を維持するなど、GWTのサポートがさらに優れていることを理解しています。)
「克服できない」というわけではありませんが、基本的なことには少し苦痛です。
日付処理:
java.util.Date
GWT は、クライアント側で日付を処理するときに予期しない動作につながる可能性がある deprecatedを使用します。java.util.Calendar
GWT ではサポートされていません。詳細はこちら。
関連する問題の例:
すでに述べた点にいくつかの点を追加します。
TextField fname、faddress; ... fname.setText(person.getName()); faddress.setText(person.getAddress()); ...
私見ですが、GWT には、この「スレッド」で言及されているすべての問題をすぐにサポートできるフレームワークがありません。
現在、GWT EXT と混同しないように EXT GWT (GXT) を使用するプロジェクトに取り組んでいます。違いはありますが、EXT GWT は ExtJS を書いた会社が実際に JavaScript ライブラリを作成したものです。GWT EXT は ExtJS ライブラリの GWT ラッパーです。GXT はネイティブ GWT です。
とにかく、GXT はまだやや未熟であり、GWT EXT が持っていると私が感じる確固たるコミュニティが欠けています。ただし、GXT はネイティブ GWT であり、ExtJS を作成した会社によって実際に開発されているため、将来は GXT にあります。ExtJS ライブラリのライセンスが変更されたため、GWT EXT は多少機能不全になり、GWT EXT の開発が遅れています。
全体として、GWT/GXT は Web アプリケーションを開発するための優れたソリューションだと思います。実際、私は開発用のホスト モードが非常に気に入っています。これにより、作業が迅速かつ簡単になります。また、コードをデバッグできるという利点もあります。JUnit を使用した単体テストも非常に堅実です。私は、エンタープライズ アプリケーションをテストするのに十分なほど成熟していると感じた、優れた JavaScript ユニット テスト フレームワークをまだ見たことがありません。
GWT EXT の詳細については、http: //gwt-ext.com/を参照してください。
EXT GWT (GXT) の詳細については、http://extjs.com/products/gxt/ を参照して ください。
簡単に克服できなかった大きな落とし穴はありません。ホスト モードを多用します。GWT-ext を使用しているため、すぐに使用できる外観を微調整したい場合を除き、自分で CSS に触れる必要はほとんどありません。
私が推奨するのは、GWT の「ネイティブ」ウィジェットを、機能が近いライブラリ ウィジェットよりも使用することです。
検索エンジンのインデックス作成に関して: はい、通常、サイトにはナビゲート可能な URL がありません (通常の Web サイトの要素にウィジェットを追加するだけでない限り)。ただし、履歴の前後の機能を実行できます。
私は ykagano からのコメントに賛成です。最大の欠点は、MVC で V を失うことです。真の ui クラスを残りのクライアント側コードから分離することはできますが、グラフィック/Web デザイナーによって生成された HTML ページを簡単に使用することはできません。これは、HTML を Java に変換する開発者が必要であることを意味します。
wysiwyg ui エディターを入手すると、多くの時間を節約できます。私は GWTDesigner を使用しています。
GWT の最大の利点は、クロスブラウザーの問題を忘れることができることです。100%ではありませんが、ほとんどの痛みがなくなります。ホストされたモードのデバッグの利点と組み合わせることで (優れているが Java デバッガーと同じではない Firebug とは対照的に)、開発者は複雑な ajax アプリを生成する際に大きな利点を得ることができます。
特にgzipフィルターを使用する場合は、実行時に高速です。
少し本題から外れますが、問題が解決しない場合に備えて、irc の #gwt チャネルが非常に役立ちます。
GWT は非常に単純明快で直感的です。
特に UIBinder のリリースにより、GWT ウィジェットを XML でレイアウトし、Java で分離コード化できるようになりました。
したがって、他の Ajax や Flash 設計ツール、または Silverlight などを使用したことがある場合、GWT は非常に簡単に習得できます。
落とし穴ではないにしても、主要なハードルは GWT RPC です。GWT を使用したいまさにその理由は、GWT 非同期 RPC のためです。それ以外の場合は、css に頼ってページをフォーマットしてみませんか?
GWT RPC は、サーバーがページを更新しなくてもサーバー上のデータを更新できるようにする要素です。これは、株式パフォーマンスの監視 (または、現在の米国の国および公的債務、または秒単位で世界中で中絶された胎児の数) などのページの絶対要件です。
GWT RPC を理解するには多少の努力が必要ですが、数時間もすればすべてが明らかになるはずです。
その上で、GWT RPC を学ぶためにいくらかの努力をした後、最終的に、RPC のサービス コンポーネントとして JSP を使用できないことに気付きます。 GWT RPC サービサーとして。ただし、質問は回答ではなく問題点のみでしたので、ブログの宣伝はやめさせていただきます。
そう。GWT を使用する上での最悪の障害/落とし穴は、GWT 非同期 RPC を適切にデプロイする方法と、JSP サービサーを使用できるようにする方法を見つけることだと私は確信しています。
少し前のプロジェクトで GWT と GWT-ext を一緒に使用しました。Web 開発が進んでいくにつれて、エクスペリエンスは非常にスムーズであることがわかりましたが、私のアドバイスは次のとおりです。
GWT ネイティブ ウィジェットと EXT ウィジェットを混在させないでください。通常、名前は同じであるため (GWT.Button または GWText.Button?)、非常に紛らわしいです。
私に起こったことの 1 つは、コードが思ったよりも複雑になったことです。それは、a) 動的に更新可能 b) カスケード可能な Panel が必要だったことです。
GWT ネイティブ パネルは動的で、Ext パネルはカスケード可能です。解決?GWTExt パネルをラップする GWT.VerticalPanel... カオス。:)
でもねえ、それはうまくいきます。;)
しかし、大規模な Javascript プロジェクトでは、これが最良の選択です
GWT コードベースを Web デザイナーから入手した HTML Web テンプレート (GWT で管理したい特定の div ID を持つ静的 HTML ページ) と組み合わせるのに非常に苦労しました。少なくとも、GWT を使用していた頃は、GWT でコーディングされていない Web サイトの部分と GWT を統合することはできませんでした。最終的には機能しましたが、大きなハックでした。
GWT 2.4 は前述の問題の多くを修正し、優れたウィジェット ライブラリがベータ版 (Ext GWT 3.0.4 別名 GXT) から出てきたばかりです。これは、JS ライブラリのラッパーではなく、完全に GWT で記述されています。
残りの痛み:
GWT 2.4 に関しては、GWTをデバッグするときはFirefox を使用してください。Chrome を使用するよりもはるかに高速です。また、Firefox のみを使用する場合は、この行をproject.gwt.xmlファイルに追加することを検討してください。
<set-property name="user.agent" value="gecko1_8" />
また、Eclipse を使用している場合は、引数の下に次を追加します -> VM 引数:
-Xmx512m -XX:MaxPermSize=1024m -XX:PermSize=1024m
サーバーとクライアントを分割し、引数の下で次を使用できます -> プログラム引数: -codeServerPort 9997 -startupUrl http://yourserver/project -noserver
また、変更のたびにサーバーが更新されないようにするには、JRebel http://zeroturnaround.com/blog/how-to-rock-out-with-jrebel-and-google-web-toolkit-gwt/を使用してください。 ライブ デモはこちら http://www.youtube.com/watch?feature=player_embedded&v=4JGGFCzspaY
大きな落とし穴の1つは、特定のCSSスタイルを使用できるようにするために、最終的にHTML要素になるIDを明示的に割り当てる必要がある場合があることです。たとえば、GWT TabPanelは、tabPanelのtabBarにIDが割り当てられており、そのelementIdに:hoverを指定した場合にのみ、tabBarItemsに:hoverを実行します。
私は他の場所でGWTの他のいくつかの欠点について書きましたが、それらはすでにrustyshelfsの回答でカバーされています:)。
GWT は機能検出の代わりにブラウザ スニッフィングを行うため、アプリケーションは一部のブラウザ (特に新しいブラウザ) では動作しません。
問題の参考文献は次のとおりです。
特徴検出に関する参考文献を次に示します。
JavaScript フレームワークの比較から抽出- ウィキペディア
GWT チームは、昨年の GWT 2.7 のリリースで多くの大幅な改善を行いました。GWT の主な弱点の 1 つは、GWT 2.6 以前ではコンパイルに時間がかかることでした。これはなくなりました GWT には、超高速で変更のみをコンパイルするインクリメンタル コンパイルがありません。
GWT 2.7 には ( Source ):
私は最近、GWT について多くの作業を行ってきました。
私は GWT-EXT についてあまり知りませんが、サードパーティのライブラリを含める必要はないと私も信じています。
あなたの決断に幸運を祈ります:)
RPC サービス オブジェクトの再利用。
アプリがハングしているように見える症状を伴う競合状態を引き起こします。
GWT は技術の傑作です。クライアントとサーバーのプログラミングを統合して、1 つの一貫したアプリケーションにします。これは、ソフトウェアが「階層化」される前に作成された方法であり、作成されるべき方法です。これにより、さまざまなスキル セット、チーム メンバー間の誤解、および一般的に Web デザイン フェーズ全体 (芸術とプログラミングの両方) が排除されます。また、Android 開発などのモバイルに最も近いものです。実際、GWT は HTML だけでなく、さまざまなネイティブ UI を生成するように設計されています。ただし、このようなデカップリングを確実に行うには膨大な規律が必要ですが、内部レイヤーのプレゼンテーションにとらわれないようにする必要があります。
避けるべき最初の間違いは、EXT-GWT 別名 GXT や SmartGWT などのサードパーティの拡張機能を使用することです。独自のスタイリングに投資する代わりに、かなりデスクトップっぽいウィジェットを使い始めたいという誘惑にかられますが、SmartGWT でどれだけ多くの問題があったかは、とうとううんざりするまでわかりませんでした。つまり、GWT のコア機能セットを特定の (かなり古い) レベルで凍結し、その上に構築します。また、パフォーマンスの低さ、バグの多さ、互換性機能 (特にモバイル デバイス) は言うまでもなく、デスクトップの外観と操作性は最近ではばかげているように見えることも覚えておいてください。カスタムペイントされたコントロールではなく、ネイティブの <select> 要素としてレンダリングされるドロップダウンなど、ネイティブのブラウザー コントロールにできるだけ近づけたいと考えています。
モバイルのトレンドのおかげで、UX 全体がよりシンプルでフラットになってきているため、見た目の良いアプリケーションのスタイルを整えるために多くのことをする必要はありません。「3D」の外観が必要な場合は、グラデーションもあります. CSS3 はすべてを簡単にし、GWT は未加工の CSS とは異なり、洗練されたオブジェクト指向の方法でそれをラップします。ですから、GWT Showcase の見苦しいベアボーン コントロールを見てがっかりしないでください。GWT チームは、開発者の仕事であるため、意図的にスタイリングを提供しませんでした。
残りは、美しく簡潔な API を使用した、強く型付けされた Java でのほとんど従来のブラウザー プログラミングです。しかしもちろん、コードはブラウザー内で実行されることを決して忘れないでください。したがって、すべての呼び出しは非同期です。たとえば、ループ内で GWT-RPC メソッドを呼び出すことはできませんが (いくつかのリストを作成するため)、これに到達した場合は再帰的にチェーンする必要があります。状況。
GWT-RPC を使用しないなど、自称「アンチパターン」がいくつかあります。これまでのところ、それは私にとって良いことです:10年間。シンプルさが重要です。コードのエレガンスと保守性のためにわずかなパフォーマンスを犠牲にすることは一瞬たりともありません。さらに、これはボトルネックが発生する場所ではありません-データベース内です。もちろん、クライアントに送信するデータ量に注意してください。
また、既存のガジェットが見つからない、またはスタイルを設定できない場合は、リッチ HTML5 要素セットを読んで、いつでもサードパーティのガジェットをラップできます。私は人気のある jQuery FullCalendar でそれを行いました。ロケット科学ではありません。Google Maps や Google Charts などの他のすべてのものには、半公式の GWT ラッパーがあります。
GWTは完璧です。インターネットが十分に愛されていない唯一の理由は、今でも業界に影響を与えている初期のインターネット アダプターが、コンピューター サイエンスやオブジェクト指向言語の出身ではないためです。彼らは、芸術的 (Photoshop/WordPress) またはネットワーク (Perl/Python) のバックグラウンドを持っています。