Play framework 2.0でCoffeeScriptを使う
最新のplay2.0の状況
今年中のβリリースを目標に開発されているPlay framework 2.0ですが、最近も毎日のように新機能が追加されています。 playのgithub ※1上で更新履歴をみると、どのような機能が追加されているか詳細にわかるので、ぜひ確認してみてください。 先日のコミットではlessとCoffeeScriptが追加されたようです。 less ※2とはCSSを拡張するためのメタ言語です。 lessを使用すると、大規模になってくると複雑になりがちなCSSの構文において、 変数を使ったりネスト構造にできたりと、より簡潔に記述することができるようになります。 CoffeeScript ※3はruby/pythonライクな構文でjavascriptを記述できる中間言語です。 playの場合、Coffeescriptで記述したファイルを配置しておくと自動でjsファイルにコンパイルしてくれるので、手動でコンパイルする手間が省けます。
ソースのHEADを取得してセットアップ
CoffeeScriptのサポートは10月3日にコミットされたようなので、githubからソースを取得して自分でビルドする必要があります。 まずはgithubからplay2.0のソースを取得しましょう。
$ git clone https://github.com/playframework/Play20.git
これで現状のソースを取得できます。 githubにはビルド方法も記述してありますので、そのとおりにビルドしてみましょう。
$ cd Play20/framework $ ./build > build-repository
これで準備ができました。サンプルアプリケーションを作成してためしてみましょう。
サンプルアプリケーション作成
Play20/samplesの下に、coffeeという名前のディレクトリを作成しましょう。
$ cd Play20/samples $ mkdir coffee $ cd coffee $ ../../play new
これでプロジェクトが作成されます。
そのうちデフォルトで対応すると思いますが、現時点では少し修正しなければいけません。 まずconf/routesファイルを修正します。
GET /public/*file controllers.Assets.at(path="/public", file)
上記記述箇所を下記のように修正してください。
GET /assets/*file controllers.Assets.at(path="/public", file)
現在静的ファイルはpublicの下に配置されていますが、これは使用しないので削除してしまってください。
次にappディレクトリの下にassets/scriptsディレクトリとassets/stylesheetsディレクトリを作成します。 assets/scriptsディレクトリにtest.coffeeファイルを下記内容で作成してください。
root = exports ? this root.hello = (name) -> alert name
CoffeeScriptでhello関数を定義します。単純に、アラートで渡された文字列を表示するだけです。 次にCSSをlessで作成します。assets/stylesheetsディレクトリに_fn.lessファイルを作成します。
a { color: red; }
もう一つファイルを作成します。assets/stylesheetsディレクトリにstyles.lessファイル作成します。
@import "_fn.less"; @nice-blue: #5B83AD; h1 { color: @nice-blue; }
最後にapp/views/index.scala.htmlを編集します。
@(name:String) <html> <head> <title>Home</title> <link rel="shortcut icon" type="image/png" href="http://www.playframework.org/public/images/favicon.png"> <link rel="stylesheet" type="text/css" media="screen" href="@routes.Assets.at("stylesheets/styles.css")"> <script src="@routes.Assets.at("scripts/test.js")" type="text/javascript" charset="utf-8"></script> </head> <body> <h1>@name</h1> <input type='button' value='push' onclick='hello("@name")'/> </body> </html>
assetsディレクトリ内容を読み込んでいます。 ボタンを押すとtest.coffeeがコンパイルされた結果のjsファイルに定義されているhello関数を呼び出しています。
では実行してみましょう。
$ cd samples/coffee $ ../../play > run
localhost:9000にアクセスし、ボタンを押すと、test.coffeeで定義した関数によってアラートが表示されます。 ブラウザ上のソースと確認してみると、scriptタグは下記のようにjsファイルへのリンクへ変換されています。
<script src="/assets/scripts/test.js" type="text/javascript" charset="utf-8"></script>
test.jsの内容は下記のようになっています。
(function() { var root; root = typeof exports !== "undefined" && exports !== null ? exports : this; root.hello = function(name) { return alert(name); }; }).call(this);
test.coffeeが自動でコンパイルされ、jsファイルに変換されているのがわかります。
まとめ
play2.0ではScalaテンプレート+CoffeeScript + lessで、快適なコーディングができそうですね。 github上のソースは、日々更新されているので、たまに確認してみるとおもしろいと思います。