ClojureでWebアプリケーションをどのように作成しますか?[閉まっている]


216

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


1
Java Native APIとClojure Nativeのどちらを使用したいのでしょうか。
アンデターナー

Ande:私はこの点でJavaの世界についてほとんど知らないので、本当にわかりません(しかし、私は言語であるJavaをすでにしばらく使っています)。
pupeno 2008年

この質問がClojure Webフレームワークのリストで終わり、それぞれに1つの回答があり、誰でもお気に入りに投票できるといいと思います。Meredyddは間違いなくCompojureの答えだと思います。Webjure用に1つ追加します。比較してみるとよいでしょう。
pupeno 2008年

プペノ!「clojureを使用したWebアプリケーション」を検索して、ここに到着しました。このページはGoogleでの最初の結果でした。
セバスティアンGrignoli

2
関連する質問も
ご覧ください。stackoverflow.com/

回答:


104

はるかに私はまだ遭遇した中で最高のClojureのWebフレームワークはCompojureです:http://github.com/weavejester/compojure/tree/master

小さくてもパワフルで、美しくエレガントな構文を持っています。(内部ではJettyを使用しますが、必要でない限り、サーブレットAPIを非表示にします。そのURLにあるREADMEを確認してから、スナップショットをダウンロードして再生を開始してください。


16
リチャードのコメントはこの回答のためのものでしたか?分かりません。
John Cromartie

26
@リチャードあなたの議論はかなりばかげています。はい、Javaライブラリを使用することを決定した場合、多くの場合、機能することをあきらめます。しかし、これらのライブラリのポイントは、二度とやり直す必要がないようにすることです。たとえば、RingはサーブレットのClojuryラッパーであるため、サーブレットを直接使用する必要はありません。Clojureで完全に優れたJavaツールを使いやすくするのではなく、Web開発ホイールを最初から作り直すことを提案しますか?そのロジックはどこにありますか。さらに、これらのライブラリを使用するオプションがあるのは悪いことですか?...
Rayne

15
@Richardあなたの主張全体は、機能しない非Clojureコードが本質的に非常に悪いため、ライブラリーの下に隠されているコードの存在さえも汚染であることを意味します。私はこの推論を理解していません。多くのJavaライブラリは、便利で強力なコードです。Clojureからエレガントかつ機能的に使用できるようにする独自のラッパーライブラリを単純に提供できるのに、なぜそれらを一から書き直すのでしょうか。
レイン、2011

10
@Richard、純粋なClojure httpサーバーを自由に作成してください。
gtrak '07

5
Lisp / Clojureの用語では、関数には副作用がありません。(gigamonkeys.com/book/…を参照)。ただし、Land of Lisp(landoflisp.com/trade_func.png)で指摘されているように、純粋に機能的なプログラムは、データベースレコードの書き込み、ファイルのダウンロード、ポストへの投稿などの実際の動作に副作用が必要であるため、通常はあまり役に立ちませんRESTサーバー、画像の生成など...
lfalin 2014年

179

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

最後のコンポーネントは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の作成者が現在作成している、参考になる可能性があるいくつかのドキュメントのラフドラフトへのリンクです。CompojureDoc


48

また、新しいClojure Webフレームワークである"Noir"(http://www.webnoir.org/)もあります(そのため、ドキュメントはまだありません)。Django / Railsから来た私は、シンプルでわかりやすい構文を掘り下げています。


Webnoirは本当に便利です!始めるのは非常に簡単です-実際にphpを開発しているように少し開発できます-サーバーを起動し(今回はレイニンゲンを使用)、ファイルを編集し、ブラウザーをリロードして、取得した内容を確認します。
claj

@elithrarが回答したので、Noirは次のドキュメントを利用できるようになりました:webnoir.org/docs
Alistair Collins



20

私の現在の頼りになるウェブライブラリは今やだです。

始めたばかりの場合、紹介サーバーはCompojureです。私はそれをapacheClojureの世界のWebサーバーのように見ています(この場合、yada / alephはnginxになります)。Luminusテンプレートとして使用できます。のようなバリエーションがありますcompojure-api

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

Alephは興味深い抽象化を提示することがわかり、組み込みのバックプレッシャーは興味深いようです。私はまだそれをいじっていませんが、それは間違いなく私のリストにあります。

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

短い答え:Luminusを見て、すぐに始めましょう。おそらく、ニーズの変化に応じて、何か他のものに移ります(Yadaかもしれません)。

Compojure

  • 長所(1):

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

    • パフォーマンスが良くない(リクエストごとのスレッド)。レールよりもパフォーマンスがやや優れている
    • 単純ではない、ミドルウェアモデルには不便な点がある

ペデスタル

  • 長所(3):

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

    • (まだ)WebSocketサポートはありません、core.asyncチャネルを返すのはいいでしょう
    • スチュアートシエラのコンポーネントに配置すると、リロードが少し遅くなります(リロードインターセプターを使用するはずです)
    • 非同期インターセプターのテスト機能はありません
    • バイインが必要(?)

アレフ

プロ(3):

  • パフォーマンス
  • 背圧
  • マニホールドストリームを返すときのWebSocket / SSEサポート

短所(1):

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

矢田

プロ(3):

  • アレフの上に構築
  • コンテンツ交渉
  • Swagger統合
  • 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、security、ssl ...
  • 掘るユニークな機能:郵便

短所(2):

  • ct / routes構文がいかに快適であるか、およびリング仕様を破棄することについては完全にはわかりません(おそらく非同期の話のためですが、ペデスタルの人が修正したと思いました)
  • swaggerなどをどのように統合するかわかりません。
  • 試してみるとすぐに動かせませんでした

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


素晴らしい比較。nginxメタファーがどのように機能するかはわかりませんが:)
matanster

1
@matanster多くの組織にとって、apacheはデフォルトの頼りになるサーバーだと思います。シンプルで、多くの人に役立ちます。しかし、それもnginxより古く、別の内部モデルを使用しています。Yadaは非同期ですが、Compojureは同期(変更される可能性があります)です。私が言及しなかった矢田のもう1つの利点は、すべてがデータであることです。そのため、Compojureのようなマクロと比較して、構成/変換/検査/生成がはるかに簡単です。
nha 2017

14

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

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


11

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

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

この回答は、Webjure情報のプレースホルダーとして意図されています。


3
これも良い例だとは思いません。コードベースは浅い(良い)ように見えますが、Javaで十分に記述されているため、足りないようです。私は純粋なclojureフレームワークを期待していました。
リチャード

8

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

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

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



3

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

luminuswebと栗のテンプレートを組み合わせたレイニンゲンテンプレートを作成しました。したがって、フロントエンドとバックエンド用のclojurescriptコードとclojurescriptコードを作成できるものが得られます。
さらに、ユーザー管理に加えて、いくつかの単純なCRUD生成といくつかの小さな便利な機能を提供します:https : //github.com/sveri/closp


3

私はのための私の2セントでスローされますダクトからも、@weavejester、Compojureとリングのメンテナ。

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

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

主な機能:

  • 「エンドポイント」、つまりミニWebサーバーと見なすことができる小さなコンポーネント(またはHTTPルートの小さな断面)によってルートを編成します。
  • Reloadedワークフローのすぐに使えるサポート。
  • RingおよびCompojureとの完全な統合。
  • 開発および本番環境の構成(他の場所で目立って欠けているものが見つかりました)。
  • 例付きの優れたドキュメント。

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

別の個人的なメモとして、私は1年以上にわたっていくつかの製品アプリケーションでダクトを使用しており、非常に満足しています。



2

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

いじくり回すのは簡単です。


2

おそらくあなたが探しているものをリフレームし、om.nextします。


1

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

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

Railsに似た「入門」体験を提供すると主張する キックスターターキャンペーンがあります。Cognitectによって開発されました。

Luminus(yogthos)の作者との良い議論はここにあります。


1

私はしばらくの間、Liberatorを本番環境で正常に使用しています。RESTful Webサービスなどを構築している場合など、必要最小限の機能が必要な場合は、これは優れたフレームワークです。これは本質的にringとcompojureのラッパーであり、着信要求を検証するときに決定グラフを提供します。また、他のかさばるWebフレームワークに比べて非常に高速です。どこかで速くゆっくりと構築を始めたい場合は、Liberatorが最適です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.