1.Lift再入門

Liftが正当に評価されていないような気がして、ぜひこの便利フレームワークは触ってみて欲しいので、サンプル集作り始めました。

弊社でScala+Liftを採用して5年が経ちました。主にガッチャ.jpでの採用では、多機能・高負荷・頻繁で大規模な仕様変更にもプログラマ1人でなんとか対応しています。Liftを選択して正解だったと今でも思います。

その間、ほとんど他のフレームワークに目がいかなかったほど、今のliftには満足していて「もうRails型の開発には戻れない!」という感覚になっています。
Play Framework for scala も良いのかもしれません(触ってない)が、めげずに「liftのココがすごい」というところをコツコツとエントリしていきたい。(もちろんこの5年、他の技術進化は全く追っていないので、そんなの当たり前的なこともエラそうに書くかもしれません。)

話は遡って、liftがWebフレームワークとして機能的にブレイクしたのは、3年前のLift2.2~2.3 あたり、CSS Selector Snippet / HTML5 Support を含めたDesigner Friendly Templatesの実装が入った後だと、個人的には思います。
これをきっかけに、機能やコード、ドキュメントなどが、よりやさしく、より短く簡単に、という方向に整備されていきました。

運悪く、日本のScala界隈でLiftが話題に上がっていたのは4年前のLift2.0あたりです。おそらくこのころに出てきた「Railsっぽくないフレームワーク」は、ほとんどが正当な評価を受けていないように思いますが、Liftもそのうちの1つかもしれません。

ただ、そういった背景を差っ引いても、その頃のLiftはとてもじゃないけど、使いやすいとは言えませんでした。私が考える理由は主に2点。

  • テンプレートがvalidなXHTMLでなければならない。(一つでもタグの閉じ忘れがあると、盛大なスタックトレースがお出迎え)
  • 動的箇所は <lift:someSnippet></lift:someSnippet> などというクソみたいなタグを埋め込まなければならなかった。Snippet側も文字列ではなくXMLを一生懸命生成しなければならなかった。ScalaにXMLリテラルがあるとはいえ、これは苦痛。

ちょっとこれ厳しいよね、という雰囲気の中、Lift2.2でガンガンよくわからない(※)機能追加されたあたりで、「もうLiftわからん、Liftはオワコン」的なムードになってしまいました。
※今思うに「素晴らしい」としかいいようのない機能ですが。

なので、Lift2.0/2.1あたりでLiftの評価をやめてしまった人は、再度Liftを使ってみて欲しいと思います。以下の違いを見て、何か反応する人には、共有できる情報になればいいと思います。

オールドスタイル(xhtml要素を置き換えていく)

<div>
  <lift:someSnippet>
    <h1><c:title>aaaaaa</c:title></h1>
  </lift:someSnippet>
</div>

class SomeSnippet {
  def render(xhtml:NodeSeq):NodeSeq = {
    bind( "c", xhtml,
      "title" -> Text("bbbbbb")
    )
  }
}

今のスタイル(CSSセレクタで要素を書き換えていく)

<div data-lift="someSnippet">
  <h1 id="title">aaaaa</h1>
</div>

class SomeSnippet {
  def render = {
    "#title" #> "bbbbbb"
  }
}

今のLiftは、ほとんど、というか全くHTMLに手を加える必要がありません。ここまで徹底したデザインとプログラムの分離ができるフレームワークは私は見たことがありません。

あと、ドキュメントはSimply LiftLift Cookbookを読みましょう。
Exploring Liftはオールドスタイルで混乱するのでもう読まなくていい情報、マニア向けと言えるでしょう。


このシリーズ

1.Lift再入門
2.Snippetメソッドとして許される型
3.ログインFORM - S.param使ったら負け
4.サーバーサイドバリデーションとサーバサイド関数
5.行列型の編集FORM
6.Radio、Checkboxが鬼門?
7.Ajax Form
8.javascriptからsubmitできない

動作確認サンプルコード github
Simply Lift(必読)


同じカテゴリのエントリ
1.Lift再入門 / 8.javascriptからsubmitできない / 7.Ajax Form / 6.Radio、Checkboxについて / 5.行列型の編集FORM / 4.サーバーサイドバリデーションとサーバサイド関数 / 3.ログインFORM - S.param使ったら負け / 2.Snippetメソッドとして許される型 / sbt0.12.xで依存jar抽出タスク / scala2.10+lift2.5+NetBeans7.2 / Scalaで入門関数プログラミング / reactive-webを試してみました / Lift2.2M1のテンプレート機能 / Scala Compiler Plugin / View Bound/Context Bound / ScalaZa01参加してきました / Akka Frameworkチュートリアルの次 / Akka Frameworkチュートリアルその2 / Akka Frameworkチュートリアル / LiftでJCaptcha / Url Rewrite Filter / sbt-android-plugin / Android SDK for Scala / 祝Lift2.0リリース / Liftの携帯対応まとめ / Scala2.8への移行 / Lift 2.0-scala280-SNAPSHOT/sbt0.7.1 / Scalaお絵かき環境 - Kojo / Lift+Quartzでバッチ / Scala&Liftを採用した理由 / Liftでdate_select系ヘルパーを作る / LiftでAjax / LiftのSubmitかしこい / lift-mapperのpaginateを使う / snippetをspecする / Lift Mapperを拡張する / LiftのDBをMySQLに / Liftプロジェクト環境を整える / Scala本読み比べてみました / NetBeans6.7&scala / じつはScalaはライトな言語 / Scalaバザ~ル / lift1.0所感 / specsを読む / implicit def / ScalaならNetBeansがサイコー / scala勉強会@東北がスタート / それでも俺はLiftをやるってのか / Scala&Liftセットアップ / ブログリニューアル /
コメント

コメントしてください

closed.