reactive-web: Lift をシンプルに

概要

reactive-web は、高度な対話性を持つ動的な Web アプリケーションを作成するための新しいフレームワークです。reactive-web は Scala で記述され、Lift を土台に構築されていて、Functional Reactive Programming (FRP) ライブラリ reactive-core を利用しています (このライブラリは reactive-web と同じリポジトリにあります)。

GWT の場合と同様、ユーザーインタフェースを JavaScript で記述するのではなくアプリケーションのほかの部分と同じ言語でコーディングすることができます (ただし、Java ではなく Scala を使用します)。一方、GWT とは異なり、記述したコードを JavaScript に変換するための余計なビルドステップは必要ありません。ブラウザで実行されるコードとサーバーで実行されるコードを容易に組み合わせることができます。さらに、Flex/JavaFX/などのバインディングのように (ただし、より強力な形で)、コンポーネント間の動的な関係を宣言することができます。

reactive-web で作成する Web アプリケーションでは、ブラウザの要素に対して、あたかもそれが JVM 内の通常のオブジェクトであるかのように、操作を行うことができます。コードの中で DOM 要素からのイベントを処理することができ、対応するオブジェクトを変更することで、DOM オブジェクトを更新することができます。また、動的に評価される式を割り当てることができ、ブラウザは自動的に更新されます (Lift の埋め込み方式よりも簡単かつ強力です)。こうした関係はブラウザ内部だけで実現することができますが、必要ならサーバーを関与させることもできます。

reactive-web は、インクリメンタルな更新を強力にサポートしています。具体的には、一連のアイテムをさまざまな方法で変換してレンダリングすることができ、これらのアイテムが変更された場合、必要な変更だけが DOM に対して適用されます。

reactive-web でのテストはとても簡単です。Selenium スタイルのテストを記述できる一方で、ブラウザや Jetty を起動する必要はなく、テストでは、「ユーザーインタフェース」およびサーバーサイドオブジェクト (スニペットクラスの内容など) の両方にアクセスして操作することができます。

reactive-web は通常の Lift アプリケーションの内部で使用することができ、その 1 部分だけで使用することも、全体で使用することもできます。また、reactive-web を使って、まったく新しい種類の Web アプリケーションを作成することもできます。GUI アプリケーションに比べると、Web アプリケーションは動的な操作性の面で見劣りするというのは、もはや過去の話になりました。(reactive-web を使ってリッチデスクトップ GUI アプリケーションを構築することも可能です。必要なのは埋め込み Jetty を実行することだけです。)

reactive-web の関数型設計は、Lift のテンプレートバインディングのしくみと非常に相性がよいため、ビューの設計をコードから完全に分離しておくことができます。

サーバー上で計算された更新は、元のページの読み込みの一環として、また ajax レスポンスの一環として (ajax 呼び出しに対する応答内での更新の場合)、あるいは Lift の優れた comet サポート経由でブラウザに到着します。これらはいずれも自動的に行われるので、どのしくみが使われるのかを気にする必要はありません。reactive-web が適切なしくみを選択します。

reactive-core と reactive-web の詳細については、上のメニューバーからトピックを拾って読んでください。スタートガイドもあります。

reactive についての議論は scala-user メーリングリストまはた Lift メーリングリストで行われているほか、github の私宛てにメッセージを送ることもできます。建設的な批判を歓迎します。

コードは http://github.com/nafg/reactive にあります。まだまだしなければならないことはたくさんありますが、それは設計やユーザビリティの面というよりも、より完全なものにするため (要素やプロパティの追加など) という意味です。

取り込む予定の機能の一部として以下のものがあります。