PerlでWebAppの開発に必要なN個のこと - Islands in the byte streamのClojure版です。
あるプログラミング言語で実際にWebAppを開発できるようになるまで、何が必要だろうか。言語仕様の習得は終えているとしよう。おそらく、最低限以下のような知識が必要だと思われる。とりあえずClojureについて知っていることを書いた。←ここまで引用
パッケージマネージャ
パッケージマネージャというか、プロジェクトマネージャであるLeiningenをつかいましょう。
このツールはもうデファクトスタンダードです。
アプリケーションサーバー
WebサーバーへのインターフェースとしてはRing
というのがデファクトスタンダードとなっている。バックエンドとしてはJettyやTomcatなどが利用できる。またHerokuやAWSへのデプロイも可能だ。Ringを使う利点は多用なMiddlewareが利用できる点だ。 多くのWebフレームワークやWebライブラリがRingに対応したMiddlewareを提供している。
Webフレームワーク
軽量フレームワーク
Ringと併用して利用される代表的な軽量フレームワークとしてCompojureがある。
CompojureはClojure版Sinatraのような感じのライブラリで簡単なアプリケーションであればRing+Compojureという組みあわせで充分に対応可能である。
フレームワーク
Compojureの上にさらにさまざまな機能やMiddlewareを提供するライブラリやフレームワークが作成されている。
代表的な物として
などがあるだろう(これは多分に私の主観をふくみます)
- Conjure
はRailsのようなフルスタックのWebFrameworkを目指したものでScaffoldingの機能なども提供されている。
- lib-noir
は元々はNoirというWebフレームワークだった物が、作者が重要な部分を抽出しライブラリとして汎用性をもたせる方向に転換して開発されているライブラリだ。
- Luminus
はConjureのようなフルスタックの機能を提供する物ではなく、どちらかというと一般的なWebフレームワークに必要な機能を提供してくれるライブラリなどを含んだテンプレートをLeiningenに提供するようなライブラリだ。ringをベースにしているのはもちろん、テンプレートエンジン、パスワード暗号化、データベースへのインターフェースなどのライブラリなどもデフォルトでロードされる。
個人的にはこのライブラリがClojureらしい丁度良いWebフレームワークではないかと感じている。
データベース
データベースへのインターフェースとしては
というライブラリが代表的だ。CloureQLはORMのような層は提供せずSQL文を発行するためのDSLを提供する事を目的としている。KormaはよりORM的なインターフェースを提供する事を目的としており、エンティティを定義しRailsのようなリレーションを定義したりする事も可能としている。
Viewのレンダリング
Viewのレンダリングは様々なタイプのライブラリが提供されている。
...その他にも様々なライブラリが熱心に開発されている。
- Enlive
はCSSセレクターベースのHTMLテンプレートという物で、HTMLのテキストとデータの挿入を完全に分離する事ができる。HTMLのテキストを読みこみ、Clojureコード上でCSS のセレクタを利用しタグを特定し、そこに変換などの作用を加えた結果をHTMLとして再び吐きだす事ができる。
複数人開発などでデザイナーと完全に分業する事を目的としている時は便利かもしれない。
- Hiccup
はClojureのデータ構造からHTMLを作成する事ができるDSLを提供する物で、CommonLispのCL-WHOのような物といえばCommonLispを知っている人には通じる物だとおもう。
ClojureのvectorををHTMLに変換するので、VectorをあつかうClojureの機能がそのまま利用できるのでClojureへの知識があるメンバーで開発する時に採用すると便利かもしれない。
- Clostache
これは最近人気の(?)Logic-less templateであるところのMustacheをClojureで実装した物だ。Logic-Lessという事でコード上で先に画面に出力するデータについては準備をほどこした上でテンプレートに流しこむといった感じだ。Logic-less templateについての議論はネットでもっと詳しい人がいるとおもうのでここでは割愛。個人的にはデザイナーとの分業も楽になるかと感じる。
このテンプレートはPythonのDjangoフレームワークで利用されているHTMLテンプレートに影響を受けて模倣したテンプレートエンジンだ。作者は先程紹介したフレームワークLuminusの作者であり、盛んに開発されている。テンプレートの拡張なども可能にしているので、適宜必要な機能を拡張する事ができる。またDjangoのテンプレートをすでに経験している人にはとっつきやすいかもしれない。
テンプレートエンジンについていえば、Compojureを利用していれば最終的に画面に出力する文字列を生成できれば問題はないので、必要な場面に応じて適切なライブラリを混在させていくというのが良いと思います。
HTTPクライアント
代表的な物は以下の2つ
clj-httpは同期的なHTMLリクエストをサポートする物である。http.async.clientは非同期的な通信をサポートする物です。