Play framework 2.0でCoffeeScriptを使う

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

最新の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上のソースは、日々更新されているので、たまに確認してみるとおもしろいと思います。

参考サイトなど