加藤です。しばらくぶりの更新です。
ここ最近はRailsとGWTの組み合わせを色々と検証しています。
GWTといえばJava言語でJavaScriptアプリケーションを書くためのツールという認識が一般的だと思いますが、実際に触ってみると、これは軽くて速いJavaScriptコードを生成するための道具なんだなということが判ります。また全世界で展開するGoogleが開発しているしているだけあって、国際化の仕組みが標準で組み込まれているのも日本人にとってうれしいところです。
Railsとの連携についての詳しい内容はいずれここで紹介したいと思いますが、Flexなどと比べるとGWTはあまりにもスルーされてる感があるので、差し当たりこれまでにハマった経験をもとにいくつかポイントを晒したいと思います。
その1: データ交換はJSONでおこなう
まぁ、そりゃそうだろといわれればそうなんですが、データ交換はJSONでおこなうのが一番ラクです。最近正式にリリースされたGWT1.5ではJavaScriptとの連携が強化されたのですが、その中のひとつである JavaScript Overlay Types をつかうとJSONコードをパースによるオーバヘッド無しでGWT内のJavaオブジェクトに変換出来ます。
Rails側のモデルをto_jsonで返して、GWT側ではJavaScript Overlay Typesで受け取ってモデルの基底クラスにNULLチェックや型変換を書いておくのが、今のところベストな方法です。
その2: GWT on Railsは使えない
というのは言い過ぎのような気もしますが、GWTとRailsで調べるとすぐに出てくる GWT on Rails はあまりおすすめ出来ません。最近メンテナンスされていないので、Rails 2.1やGWT 1.5 にまだ対応していないというのが理由のひとつです。また、GWT on RailではRailsとGWTのコードをジェネレータで同時に生成するのですが、これだとどちらも自由度が下がってしまいます。例えば、RSpec使いたいとかMaven使いたいとかいう時には大変不便です。
他にGWTとRailsの連携を助けるツールとして、 GWT-REST がありますが、これも長らく更新されていませんし、GWT-RESTで出来ることは前述のJavaScript Overlay Typesで出来ることと変わらないので特に使うメリットはありません。
その3: GWTとRJSの連携はやりすぎ
GWTが生成するのは普通のHTMLとJavaScriptなので、やろうと思えばRJSとも簡単に連携できます。例えば、GWTからのHTTPリクエストを受け取ったRailsアクションがサーバー側でRJSをつかってHTML上のDOM要素を書き換えてしまってもまったく問題無いわけです。また、RJSで書き換えたコンポーネントからアンカーをつかってURLを変更しGWT側でそれを検知することで、RJSからGWT側に操作を伝えることも出来ます。
僕も最初は、これなら必要なコンポーネントを遅延ロードさせることが出来るし、簡単なフォームならRJSの方がラクだからこの組み合わせは完璧だねと思ったのですが、クライアント側の処理コードが分散すると1ヶ月もしないうちに書いた人間すら判らない状態になってしまうので、最終的に全部GWT側にまとめました。
ただアイデア自体は悪くないと思います。いずれフレームワークが出てくるかもしれないので、それまで待ちましょう(もしくは作りましょう)。
その4: 認証はRailsでページ遷移させておこなう
色々と調べている中で、GWT関連の書籍やブログに「GWTアプリケーションは単独のHTMLページ内で動作し、ログインもその中でおこなわれます」みたいなことが書かれているのを見たのですが、セキュリティ上かなり難しいと思いますし、そうするメリットもあまりないように思います。OpenIDやその他の認証プロバイダを使う場合は現実的にかなり困難です。
ここは割り切ってRails側でrestful-authenticationあたりをつかってさくっと作りましょう。ホストページ(GWTアプリケーションが動作するコンテナとなるHTMLページ)に初期データを埋め込んでおけば、HTTPリクエストが減らせてGWTアプリケーションの起動も早くできます。
その5: GWTの拡張ライブラリは必須
これはRailsとは直接関係の無いGWT側のポイントですが、GWTの標準ライブラリにはかなりプリミティブなものしか無いので、拡張ライブラリは必須です。メジャーなものとして、 GWT incubator と GWTx の2つは最初から導入しておきましょう。
GWT incubatorはGoogleが提供するベータ版ライブラリのような位置づけでかなりボリュームがありますが、良く使うのはロギングや拡張されたGUIウィジェットなどです。また、これはまだ検証できていませんが少し面白いものとして、GWTのコンパイル時にCSSを最適化する CSSResource なんてものもあります。
GWTxはGWTのJREエミュレーションから漏れたJava標準ライブラリを補完するライブラリで、モデルの変更をオブザーブするためのProperty Change Listenerを良く使います。最近リリースされたGWT1.5対応版では、java.beans.Introspectorやjava.beans.BeanInfoなども追加されたようなので、標準でリフレクションが使えないGWTではますます重宝されそうです。
また、Ext JSについてあまり詳しくないのでまだ使用したことはありませんが、Ext JSとの連携ライブラリとして、"Ext GWT":http://extjs.com/products/gxt/ や GWT-Ext などがあります。見た目が固定化されてしまいそうな点がちょっと気になりますが、GUIコンポーネントが豊富に揃っているので社内用のアプリケーション開発などには良いのではないでしょうか。
その他、GWT版JQueryの GwtQuery も要注目です。"Google I/Oのプレゼンテーション":http://sites.google.com/site/io/gwt-extreme で開発者のRay Cromwellさんが、「縮小化・圧縮されたJQueryは15kb。コンパイル後のGwtQueryはどんだけだと思う?なんとたったの712bytesだぜ(意訳)」とアピールされておりました。プラグインも書けるみたいです。
まとめ
ということで、色々と紹介しましたが少しはRailsとGWTの組み合わせに興味はもっていただけたでしょうか?
あまり生産性は良くないなど色々と課題はありますが、GWTはJavaScriptハッカーじゃなくても高性能なJavaScriptアプリケーションが書ける貴重なツールです。登場から2年、正式リリースから1年以上経つにもかかわらず、ましてやGoogle印にもかかわらず、これまであまり注目されていなかった感がありますが、ブラウザの開発競争が激しくなる中で今後注目は高まっていくと思います。Railsやってる人もぜひ一度試してみて下さい。