これは、Javaを毎日使用するプログラマーの大多数にとって奇妙な質問だと思います。私はしません。私はJavaプロジェクトに取り組んでいたので、Java-the-languageを知っていますが、Java-the-worldは知りません。Javaで最初からWebアプリを作成したことはありません。Python、Rubyでやらなければならない場合は、どこに行けばよいか(DjangoまたはRails)はわかりますが、ClojureでWebアプリケーションを作成したい場合は、Javaの世界に住むことを余儀なくされているからではなく、言語のように、試してみたいのですが、どのライブラリとフレームワークを使用すればよいですか?
16 に答える
Compojure は、もはや Web アプリケーションを開発するための完全なフレームワークではありません。0.4 リリース以降、compojure はいくつかのプロジェクトに分割されました。
Ringは、HTTP 要求と応答プロセスを抽象化することによって基盤を提供します。Ring は着信要求を解析し、uri、server-name、request-method などの要求のすべての部分を含むマップを生成します。その後、アプリケーションはリクエストを処理し、リクエストに基づいてレスポンスを生成します。応答は、ステータス、ヘッダー、および本文のキーを含むマップとして表されます。したがって、単純なアプリケーションは次のようになります。
(def app [req]
(if (= "/home" (:uri req))
{:status 200
:body "<h3>Welcome Home</h3>"}
{:status 200
:body "<a href='/home'>Go Home!</a>"}))
Ring のもう 1 つの部分は、ミドルウェアの概念です。これは、ハンドラーと着信要求および/または発信応答の間に位置するコードです。組み込みのミドルウェアには、セッションとスタックトレースが含まれています。セッション ミドルウェアは、リクエストを行うユーザーのすべてのセッション情報を含むリクエスト マップに :session キーを追加します。:session キーが応答マップに存在する場合、それは現在のユーザーによる次の要求のために保存されます。スタック トレース ミドルウェアは、リクエストの処理中に発生した例外をキャプチャし、例外が発生した場合に応答として返されるスタック トレースを生成します。
Ring を直接操作するのは面倒なので、Compojureは Ring の上に構築され、詳細を抽象化します。アプリケーションはルーティングの観点から表現できるようになったため、次のようなものを作成できます。
(defroutes my-routes
(GET "/" [] "<h1>Hello all!</h1>")
(GET "/user/:id" [id] (str "<h1>Hello " id "</h1>")))
Compojure は引き続きリクエスト/レスポンス マップを処理しているため、必要に応じていつでもアクセスできます。
(defroutes my-routes
(GET "*" {uri :uri}
{:staus 200 :body (str "The uri of the current page is: " uri)}))
この場合、{uri :uri} 部分はリクエスト マップの :uri キーにアクセスし、uri をその値に設定します。
最後のコンポーネントは、HTML の生成を容易にするHiccupです。さまざまな html タグは、最初の要素がタグ名を表し、残りがタグの本体であるベクトルとして表されます。"<h2>A header</h2>"
になり[:h2 "A Header"]
ます。タグの属性は、オプションのマップにあります。"<a href='/login'>Log In Page</a>"
になり[:a {:href "/login"} "Log In Page"]
ます。テンプレートを使用して html を生成する小さな例を次に示します。
(defn layout [title & body]
(html
[:head [:title title]]
[:body [:h1.header title] body]))
(defn say-hello [name]
(layout "Welcome Page" [:h3 (str "Hello " name)]))
(defn hiccup-routes
(GET "/user/:name" [name] (say-hello name)))
以下は、現在 compojure の作成者によって書かれているドキュメントのラフ ドラフトへのリンクです。参考になるかもしれません: Compojure Doc
私が今まで出会った中で断然最高のClojureWebフレームワークはCompojureです:http ://github.com/weavejester/compojure/tree/master
小さいながらもパワフルで、美しくエレガントな構文を持っています。(内部ではJettyを使用しますが、必要な場合を除いて、サーブレットAPIを非表示にします。これは頻繁には行われません)。そのURLでREADMEを確認し、スナップショットをダウンロードして再生を開始します。
また、新しい Clojure Web フレームワークである "Noir" ( http://www.webnoir.org/ ) もあります (新しいドキュメントはまだありません)。Django/Rails から来た私は、シンプルでわかりやすい構文を掘り下げており、かなり無駄がありません。
Luminus Web フレームワークを考えてみましょう。所属はありませんが、尊敬する友人から良いことを聞いています。
私の現在の頼りになる Web ライブラリはyadaになりました。
始めたばかりの場合、導入サーバーはCompojure
. apache
Clojure の世界の Web サーバー (この場合、yada/aleph は nginx になります) のように見えます。Luminus
テンプレートとして使用できます。などのバリエーションがありますcompojure-api
。
私はouを試してみPedestal
ましたが、全体的にそれに満足していました. 私はそれをマスターしたとは言いませんが、心地よい構文を持ち、非常にまとまりがあり、優れたパフォーマンスを発揮しているように見えます. また、Cognitect
(Rich Hickey が勤務する Clojure/Datomic 社) の支援も受けています。
Aleph
興味深い抽象化を提示することがわかりました。組み込みのバックプレッシャは興味深いようです。私はまだそれで遊んでいませんが、間違いなく私のリストに載っています.
さまざまなWebサーバーで少し遊んだ後、ここに私の簡単な長所/短所のリストがあります:
簡単な答え : Luminusを見てすぐに始めてください。ニーズが進化するにつれて、別の何かに移るかもしれません (Yada かもしれません)。
コンポジュレ
長所 (1):
- 簡単、たくさんのテンプレート/例 (例: Luminous)
短所 (2):
- パフォーマンスが良くない (リクエストごとのスレッド)、レールよりもわずかに優れたパフォーマンスを期待する
- 単純ではない、ミドルウェアモデルには不便があります
台座
長所 (3):
- インターセプター モデル、ルートのサブセットにインターセプターを追加する快適な構文
- 高性能ルーター
- json/transit/multipart フォームを、何も要求せずにそのまま透過的にサポートします。とてもかっこいい !
短所 (4):
- websocket のサポートは (まだ) ありません。core.async チャネルを返すとよいでしょう。
- Stuart Sierra のコンポーネントに入れると、リロードが少し遅くなります (リロード インターセプターを使用することになっていると思います)。
- 非同期インターセプターのテスト機能がない
- 賛同が必要(?)
アレフ
プロ (3):
- パフォーマンス
- 背圧
- マニホールド ストリームを返すときの Websocket/SSE サポート
短所 (1):
- 低レベルで、自分でスタイルを実行します (つまり、ハンドラーに何かをさせる方法を提供するだけです。ルーターも何もありません)。特にデメリットはありませんので、ご了承ください。
矢田
プロ (3):
- アレフの上に構築された
- 内容交渉
- 闊歩の統合
- bidi はまったく問題ありません (ただし、ペデスタル ルーターの構文の方が好きです)。
短所 (1):
- ドキュメント (ただし、nginx-clojure ほど悪くはありませんが、すぐに改善されます)。
HttpKit
プロ (2):
- Clojureで書かれています!(そしてJava...)
- パフォーマンスは良さそうです (600K 同時接続の投稿を参照)
短所 (2):
- CORS サポートなし
- バグ?また、最近のコミットはあまりありません
Nginx-Clojure
注:主にドキュメントがないため、私はそれを試していません。見た目は面白いですが、非常に高性能です。
長所 (2):
- Nginx (高性能、ssl のオフロード、ワーカーの再起動...)
- このモデルはダウンタイムゼロの更新を可能にしますか? それはとても素晴らしいでしょう!
短所 (1):
- ドキュメント (改善)。また、それが唯一の方法である場合、nginx構成ファイルに埋め込まれた文字列でプログラムしたくありません。
- おそらく、最初の展開が少し複雑になります (?)
不変
注:私はそれで遊んでいません。
長所:
- 統合 (キャッシング、メッセージング、スケジューリング、wildfly デプロイ)
短所:
- HTTP クライアントなし
カタカンバ
注:ドキュメントは素晴らしいようですが、私はそれで遊んでいません。私はおそらく次にそれを試すつもりです。興味深いサンプル チャット プロジェクトがありますが、プロトコルを多用しているため、初心者の Clojure 開発者として最初は戸惑いました。
長所 (6):
- ドキュメンテーション !すべての funcool プロジェクトと同様に、このドキュメントは非常に読みやすいものです。
- 台座のようなルーティング構文
- パフォーマンスが高い必要があります(Ratpackの上で)
- 背圧
- websockets、sse、cors、セキュリティ、ssl...
- 掘り下げるためのユニークな機能 : 郵便
短所 (2):
- ct/routes 構文がどれほど快適か、Ring 仕様を捨てることについては完全にはわかりません (おそらく非同期の話のためですが、台座担当者がそれを修正したと思います)。
- swagger などをどのように統合するかはわかりません。
- 試してみたところ、すぐに機能させることができませんでした
注:生のパフォーマンスだけが重要な場合は、Clojure Web サーバーのベンチマークを利用できます。
Clojure 用の Web プログラミング フレームワークであるWebjure 。
機能: ディスパッチ サーブレットは Clojure 関数を呼び出します。動的 HTML 生成。SQL クエリ インターフェイス (JDBC 経由)。
この回答は、Webjure 情報のプレースホルダーとしてのものです。
Compojure は、私が小さなブログ アプリケーションを構築するために使用したものです。Ruby 用の最小限の軽量 Web フレームワークである Sinatra をモデルにしています。私は主にシナトラのようなルーティングを使用しました。次のようになります。
(GET "/post/:id/:slug"
(some-function-that-returns-html :id :slug))
ORM やテンプレート ライブラリはありませんが、ベクトルを HTML に変換する機能があります。
これらのフレームワークも参照できます ( dislojure/projectsから取得):
スタック オーバーフローに関するもう 1 つの関連する質問もあります:成熟した Clojure Web フレームワーク?
Coils で Clojure を試すこともできます。http://github.com/zubairq/coils - 免責事項: 私は著者です
別の興味深い Web サーバーはHttp-kitです。パフォーマンスが高く、リングに準拠しており、WebSocket もサポートしています。ほとんどが clojure で作成されており、Jetty/Tomcat のいくつかの奇妙な点が欠けています。
いじるのは簡単です。