web-dev-qa-db-ja.com

ClojureでWebアプリケーションを作成するにはどうすればよいですか?

これは、毎日Javaを使用している大多数のプログラマーにとって奇妙な質問だと思います。しません。私はJavaプロジェクトに取り組みましたが、Java-the-worldには取り組みませんでした。JavaでゼロからWebアプリを作成したことはありません。 Python、Ruby、どこに行くべきか(DjangoまたはRails)は知っていますが、ClojureでWebアプリケーションを作成したいのであれば、Javaの世界に住むことを強いられているからではありませんが、私はこの言語が好きで、試してみたいので、どのライブラリとフレームワークを使うべきでしょうか?

214
pupeno

私がこれまでに出会った中で最高のClojure WebフレームワークはCompojureです: http://github.com/weavejester/compojure/tree/master

小さくても強力ですが、美しくエレガントな構文を持っています。 (フードの下でJettyを使用しますが、必要でない限りサーブレットAPIを非表示にします。そのURLでREADMEを見て、スナップショットをダウンロードして再生を開始します。

103
Meredydd

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キーが存在する場合、現在のユーザーが行った次の要求のために保存されます。スタックトレースミドルウェアは、要求の処理中に発生する例外をキャプチャし、例外が発生した場合に応答として返されるスタックトレースを生成します。

リングを直接操作するのは面倒なので、詳細を抽象化するリングの上に Compojure を構築します。アプリケーションをルーティングの観点から表現できるようになったので、次のようなことができます。

(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をその値に設定します。

最後のコンポーネントは Hiccup です。これにより、htmlの生成が容易になります。さまざまな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

179
Ross Goddard

「ノワール」( http://www.webnoir.org/ )もあります。これは新しいClojure Webフレームワークです(新しいドキュメントはまだありません)。 Django/Railsから来た私は、シンプルでわかりやすい構文を掘り下げましたが、かなり無駄がありません。

48
elithrar

Luminus web framework を検討してください。私は所属していませんが、尊敬する友人から良いことを聞きました。

24
Michael Easter

現在のWebライブラリは yada です。

始めたばかりの場合、導入サーバーは Compojure です。 Clojureの世界のWebサーバーのApache(この場合、yada/alephはnginxになります)と考えています。 Luminus をテンプレートとして使用できます。 compojure-api

私はou Pedestal を試しましたが、グローバルに満足していました。私はそれを習得したと主張していませんが、心地よい構文を持ち、非常にまとまりがあり、素晴らしいパフォーマンスを持っているように見えます。また、Cognitect(Rich Hickeyが働いているClojure/Datomic社)によって支援されています。

Aleph を見つけて興味深い抽象化を提示し、組み込みのバックプレッシャーは興味深いように見えます。私はまだ使っていませんが、間違いなく私のリストに載っています。

さまざまなWebサーバーで少し遊んだ後、ここに簡単なPro/Consリストを示します。

簡単な答え: Luminus を見て、すぐに始めましょう。必要に応じて何か他のものに移りましょう(矢田)。

コンポジュレ

  • 長所(1):

    • 簡単で、たくさんのテンプレート/例(例:Luminous)
  • 短所(2):

    • パフォーマンスが良くありません(リクエストごとのスレッド)。Railsよりも若干良いパフォーマンスが期待されます。
    • 単純ではない、ミドルウェアモデルには不便がある

ペデスタル

  • 長所(3):

    • インターセプターモデル、インターセプターをルートのサブセットに追加する快適な構文
    • 高性能ルーター
    • json/transit/multipartフォームを、何も要求せずに、そのままで透過的にサポートします。とてもかっこいい !
  • 短所(4):

    • webSocketサポートなし(まだ)、core.asyncチャネルを返すのはいいことです
    • stuart Sierraのコンポーネントに配置すると、リロードが少し遅くなります(リロードインターセプターを使用することになっていると思います)
    • 非同期インターセプターのテスト機能はありません
    • バイインが必要(?)

アレフ

プロ(3):

  • 出演者
  • 背圧
  • マニホールドストリームを返すときのWebsocket/SSEサポート

短所(1):

  • 低レベル、自分でスタイルを設定します(つまり、ハンドラーに何かをさせる方法を提供するだけです。ルーターも何もありません)。本当に短所ではありません、ただそれに注意してください。

矢田

プロ(3):

  • アレフ上に構築
  • コンテンツネゴシエーション
  • swagger統合
  • bidiはまったく問題ありません(ただし、ペデスタルルーターの構文の方が好きです)

短所(1):

  • ドキュメント(nginx-clojureほど悪くはありませんが、すぐに改善されます)。

HttpKit

プロ(2):

  • Clojureで書かれた! (およびJava ...)
  • パフォーマンスは良好に見えます(600K同時接続の記事を参照)

短所(2):

  • CORSサポートなし
  • バグ?また、最近のコミットはそれほど多くありません

Nginx-Clojure

注:主にドキュメントが不足しているため、私はそれで遊んでいません。それは面白いように見えますが、非常に高性能です。

長所(2):

  • Nginx(パフォーマンス、SSLのオフロード、ワーカーの再起動...)
  • このモデルでは、ゼロダウンタイムの更新を許可できますか?それはとても素晴らしいでしょう!

短所(1):

  • ドキュメント(改善)。また、それがそれを行う唯一の方法である場合、nginx configファイルに埋め込まれた文字列でプログラムしたくない。
  • おそらく最初の展開を少し複雑にします(?)

不変

注:私はそれで遊んでいません。

長所:

  • 統合(キャッシング、メッセージング、スケジューリング、ワイルドフライデプロイ)

短所:

  • hTTPクライアントなし

カタカンバ

注:ドキュメントは素晴らしいように見えますが、私はそれで遊んでいません。私はおそらく次に試してみるつもりです。おもしろそうなチャットプロジェクトの例がありますが、プロトコルを多用していると、最初は初心者のClojure開発者として私を先送りにしました。

長所(6):

  • ドキュメンテーション !すべてのfuncoolプロジェクトと同様に、ドキュメントはvery読みやすいです。
  • 台座のようなルーティング構文
  • パフォーマンスが必要です(Ratpackの上)
  • 背圧
  • websockets、sse、cors、security、ssl ...
  • digのユニークな機能:郵便

短所(2):

  • Ct/routes構文の快適さ、およびRing仕様の廃止については完全には定かではありません(非同期ストーリーの場合と思われますが、台座の人はそれを修正したと思います)
  • Swaggerなどをどのように統合するかわからない.
  • 試したとき、すぐに動作させることができませんでした

Clojure Webサーバーのベンチマーク は、生のパフォーマンスが重要な場合に使用できます。

20
nha

最近 Pedestal は一見の価値があるフレームワークです。 Ring の上に構築されるサーバー側フレームワークですが、特定のリクエストを一時停止および再開できるため、初期スレッドからの着信リクエストも解放されます(そうでなければ、遅いリクエストが実際にそのサーバースレッドをブロックします) 。たぶんJavaBeanのようなものです。

他のクールなフレームワークは hoplon.io とDavid Nolenの Om (Reactに基づく)

14
claj

Webjure 、ClojureのWebプログラミングフレームワーク。

機能:ディスパッチサーブレットはClojure関数を呼び出します。ダイナミックHTML生成。 SQLクエリインターフェイス(JDBC経由)。

この回答は、Webjure情報のプレースホルダーを意味します。

11
pupeno

Compojureは、小さなブログアプリケーションを構築するために使用したものです。これは、Ruby用の最小限の軽量WebフレームワークであるSinatraをモデルにしています。私は主にルーティングを使用しましたが、これはシナトラのようなものです。次のようになります。

(GET "/post/:id/:slug"
  (some-function-that-returns-html :id :slug))

ORMやテンプレートライブラリはありませんが、ベクターをHTMLに変換する関数があります。

8
Joe W.

また、これらのフレームワークを見ることができます( disclojure/projects から取得):

スタックオーバーフローに関するもう1つの関連する質問もあります。 Mature Clojure Webフレームワーク?

5
mnicky

免責事項:私は著者です。

Luminuswebと栗のテンプレートを組み合わせたラインニンゲンテンプレートを作成しました。したがって、clojureコードをビルドできるものと、フロントエンドおよびバックエンド用のclojurescriptコードを取得できます。
さらに、ユーザー管理に加えて、いくつかのシンプルなCRUD生成と、いくつかの小さなニースを用意しています: https://github.com/sveri/closp

3
sveri

Compojure and Ringのメンテナーである @ weavejester からも Duct に2セントを投入します。

コアでは、 コンポーネント とリングルーターを1つの屋根の下にもたらします。ダクトを使用する理由:

  • 優れた哲学的基盤:アプリを一連の小さなコンポーネントとして構築することを奨励し、適切なデフォルトを提供しながら意見をほとんど保持しないというバランスが取れています。
  • 安定した道:私は自分で言いますが、長年にわたって、Clojureコミュニティは次々と信頼性の低いWebフレームワークを提示してきたと感じました。カップルは「物事を成し遂げる」ために実験的であると感じました(Omとクライアント側のPedestalでの私の経験)(彼らは将来的に優れているとは証明しません)。一方で、@ weavejesterがCompojureとRingに対して行ったのと同じ安定性と測定された進捗をDuctにもたらしたように感じます。CompojureとRingは、コミュニティで見事に生まれました。
  • それはsuper軽量で、私のコンポーネントの邪魔になりません。

主な機能:

  • ミニWebサーバー(またはHTTPルートの小さな断面)と考えることができる小さなコンポーネント「エンドポイント」によってルートを編成します。
  • Reloaded Workflow のすぐに使えるサポート。
  • RingおよびCompojureとの完全な統合。
  • 開発および本番構成(他の場所で顕著に見当たらないもの)。
  • 例付きの優れたドキュメント。

注:言うまでもありませんが、ほとんどのClojureyのように、Web開発の新参者のために、DuctはClojure言語をしっかりと把握する必要があります。また、最初にコンポーネントについて読むことをお勧めします。

別の個人的な注意として、私は1年以上にわたっていくつかの生産アプリケーションでDuctを使用してきましたが、非常に満足しています。

3
KendallB

コイルでClojureを試すこともできます http://github.com/zubairq/coils -免責事項:私は著者です

2
Zubair

もう1つの興味深いWebサーバーは、 Http-kit です。優れたパフォーマンスがあり、リングに準拠しており、WebSocketもサポートしています。ほとんどがclojureで作成されており、Jetty/Tomcatには奇妙なものがいくつかあります。

それをいじるのは簡単です。

2
claj

Reframeとom.nextはおそらくあなたが探しているものです。

2
ftravers

Arachne は新しいWebフレームワークです。サイトの説明を引用:

Arachneは、Clojure用の完全で高度にモジュール化されたWeb開発フレームワークです。使いやすさ、シンプルさ、堅牢でスケーラブルなデザインを強調しています。

kickstarterキャンペーン Railsに似た「開始」エクスペリエンスを提供すると主張しています。 Cognitectによって開発されました。

ここ は、Luminus(yogthos)の著者との良い議論です。

1
Micah Elliott

私は Liberator を本番環境でしばらく使用しています。必要なものだけが必要な場合は、すばらしいフレームワークです。 RESTful Webサービスなどを構築している場合。それは本質的にリングとコンポジュアのラッパーであり、着信リクエストを検証するときに決定グラフを提供します。また、他のよりかさばるWebフレームワークに比べて非常に高速です。どこかで早く始めてゆっくりと構築したい場合は、Liberatorが最適です。

1
dfbernal