読者です 読者をやめる 読者になる 読者になる

Let's write β

趣味で書いたこととか、RustとLispが好き

ClojureでWebApp開発に必要なN個のこと

PerlでWebAppの開発に必要なN個のこと - Islands in the byte streamClojure版です。

あるプログラミング言語で実際にWebAppを開発できるようになるまで、何が必要だろうか。言語仕様の習得は終えているとしよう。おそらく、最低限以下のような知識が必要だと思われる。とりあえずClojureについて知っていることを書いた。←ここまで引用

パッケージマネージャ

パッケージマネージャというか、プロジェクトマネージャであるLeiningenをつかいましょう。
このツールはもうデファクトスタンダードです。

アプリケーションサーバ

WebサーバーへのインターフェースとしてはRing
というのがデファクトスタンダードとなっている。バックエンドとしてはJettyやTomcatなどが利用できる。またHerokuやAWSへのデプロイも可能だ。Ringを使う利点は多用なMiddlewareが利用できる点だ。 多くのWebフレームワークやWebライブラリがRingに対応したMiddlewareを提供している。

Webフレームワーク

軽量フレームワーク

Ringと併用して利用される代表的な軽量フレームワークとしてCompojureがある。
CompojureはClojureSinatraのような感じのライブラリで簡単なアプリケーションであれば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を知っている人には通じる物だとおもう。
ClojurevectorををHTMLに変換するので、VectorをあつかうClojureの機能がそのまま利用できるのでClojureへの知識があるメンバーで開発する時に採用すると便利かもしれない。

  • Clostache

これは最近人気の(?)Logic-less templateであるところのMustacheClojureで実装した物だ。Logic-Lessという事でコード上で先に画面に出力するデータについては準備をほどこした上でテンプレートに流しこむといった感じだ。Logic-less templateについての議論はネットでもっと詳しい人がいるとおもうのでここでは割愛。個人的にはデザイナーとの分業も楽になるかと感じる。

このテンプレートはPythonのDjangoフレームワークで利用されているHTMLテンプレートに影響を受けて模倣したテンプレートエンジンだ。作者は先程紹介したフレームワークLuminusの作者であり、盛んに開発されている。テンプレートの拡張なども可能にしているので、適宜必要な機能を拡張する事ができる。またDjangoのテンプレートをすでに経験している人にはとっつきやすいかもしれない。

テンプレートエンジンについていえば、Compojureを利用していれば最終的に画面に出力する文字列を生成できれば問題はないので、必要な場面に応じて適切なライブラリを混在させていくというのが良いと思います。

HTTPクライアント

代表的な物は以下の2つ

clj-httpは同期的なHTMLリクエストをサポートする物である。http.async.clientは非同期的な通信をサポートする物です。

テスト

テストフレームワークは標準のclojure.testの他に以下のようなライブラリがあります。

その他

主にRingとCompojureの上に構築されているライブラリやフレームワークを紹介してきました。
しかし、WebSocketなどの非同期通信機能を提供するAlephというライブラリも盛んに開発されており、こちらはCompojure上で動作するアプリケーションと共存する事ができるようなので、上述のフレームワークやツールたちと併用し非同期通信が必要な場面ではAlephに処理を渡すという使い方ができるでしょう。

P.S

色々と書いてみましたが、まだまだClojureの世界にはJavaから引きついだ資産もあいまって様々なライブラリやアイデアが活発に開発されています。今回の記事にも様々な穴があるとおもいますので、何かありましたら是非コメントにて教えていただけると幸いです。

僕が働いているAzit.incでは一緒に働けるエンジニアを募集しています!
採用情報 — 株式会社アジット|Azit Inc.