ClojureでWebアプリケーションを作成するにはどうすればよいですか? [閉まっている]
-
03-07-2019 - |
質問
これは、Javaを日常的に使用する大多数のプログラマーにとって奇妙な質問だと思います。しません。私はJava言語を知っています。なぜなら、私はJavaプロジェクトに取り組んだからです。 JavaでゼロからWebアプリを作成したことはありません。 Python、Rubyでそれをしなければならない場合、どこに行くべきか(DjangoまたはRails)を知っていますが、ClojureでWebアプリケーションを作成したい場合は、Javaの世界に住むことを余儀なくされているためではなく、言語が好きで、試してみたいのですが、どのライブラリとフレームワークを使用すればよいですか?
解決
私がこれまでに遭遇した中で最も優れたClojure WebフレームワークはCompojureです: http:// github。 com / weavejester / compojure / tree / master
これは小さくても強力ですが、美しくエレガントな構文を持っています。 (フードの下でJettyを使用しますが、必要でない限りサーブレットAPIを隠します。これはあまり頻繁には行われません)。そのURLのREADMEを見て、スナップショットをダウンロードして再生を開始してください。
他のヒント
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の著者が現在作成しているいくつかのドキュメントの大まかなドラフトへのリンクです。 Compojureドキュメント
<!> quot; Noir <!> quot;もあります。 ( http://www.webnoir.org/ )、これは新しいClojure Webフレームワークです(新しいドキュメントはまだありません)。 Django / Railsから来た私は、シンプルで簡単な構文を掘り下げましたが、かなり無駄がありません。
Luminus Webフレームワークを検討してください。所属していませんが、尊敬する友人から良いことを聞いています。
現在利用しているWebライブラリは yada です。
開始したばかりの場合、導入サーバーは Compojure
です。 Clojureの世界では、Webサーバーのapache
と見なされます(この場合、yada / alephはnginxになります)。 Luminus
をテンプレートとして使用できます。 compojure-api
など、そのバリエーションがあります。
Pedestal
を試してみましたが、世界的に満足しています。私はそれを習得したと主張していませんが、心地よい構文を持ち、非常にまとまりがあり、素晴らしいパフォーマンスを持っているように見えます。また、Cognitect
(Rich Hickeyが働いているClojure / Datomic社)の支援を受けています。
Aleph
が興味深い抽象化を提示していることを発見し、組み込みのバックプレッシャーは興味深いようです。まだ使っていませんが、間違いなくリストに載っています。
さまざまなWebサーバーで少し遊んだ後、ここに私のクイックPro / Consリストを示します。
簡単な回答: Luminus をご覧になり、すぐに始めてください。進化する必要があります(矢田かもしれません)。
合成物
-
長所(1):
- 簡単、たくさんのテンプレート/例(例:Luminous)
-
短所(2):
- パフォーマンスが良くありません(リクエストごとのスレッド)。レールよりもわずかに優れたパフォーマンスが期待されます
- 単純ではない、ミドルウェアモデルには不都合があります
台座
-
長所(3):
- インターセプターモデル、ルートのサブセットにインターセプターを追加する快適な構文
- 高性能ルーター
- json / transit / multipartフォームは、何も要求せずに、そのまま使用できます。とてもクール!
-
短所(4):
- websocketのサポートは(まだ)ありません。core.asyncチャネルを返すといいでしょう
- Stuart Sierraのコンポーネントに配置すると、リロードが少し遅くなります(リロードインターセプターを使用することになっていると思います)
- 非同期インターセプターのテスト機能はありません
- バイインが必要(?)
アレフ
プロ(3):
- パフォーマンス
- 背圧
- 多様体ストリームを返すときのWebsocket / SSEサポート
短所(1):
- 低レベル、自分でスタイルを設定します(つまり、ハンドラーに何かをさせる方法を提供するだけです。ルーターも何もありません)。本当に短所ではありません、ただ注意してください。
矢田
プロ(3):
- Alephで構築
- コンテンツのネゴシエーション
- 盗品の統合
- bidiは大丈夫です(ペデスタルルーターの構文の方が好きですが)
短所(1):
- ドキュメント(nginx-clojureほど悪くはありませんが、すぐに改善されます)。
HttpKit
プロ(2):
- Clojureで書かれた! (およびJava ...)
- パフォーマンスは良好です(600Kの同時接続の投稿を参照)
短所(2):
- CORSサポートなし
- バグ?また、最近のコミットはそれほど多くありません
Nginx-Clojure
注:主にドキュメントがないため、私はそれで遊んでいません。面白くて、非常にパフォーマンスが良いようです。
長所(2):
- Nginx(パフォーマンス、SSLのオフロード、ワーカーの再起動...)
- このモデルはダウンタイムゼロの更新を許可しますか?それはとても素晴らしいでしょう!
短所(1):
- ドキュメント(改善)。また、それが唯一の方法である場合、nginx configファイルに埋め込まれた文字列でプログラミングしたくないです。
- おそらく最初の展開を少し複雑にします(?)
Immutant
注:私は遊んだことがありませんそれ。
長所:
- 統合(キャッシング、メッセージング、スケジューリング、ワイルドフライデプロイ)
短所:
- httpクライアントなし
カタカンバ
注:ドキュメントは素晴らしいように見えますが、私はそれで遊んでいません。おそらく次に試してみるつもりです。おもしろそうなチャットプロジェクトの例がありますが、プロトコルを多用していると、最初は初心者のClojure開発者として私を先送りにします。
長所(6):
- ドキュメント!すべてのfuncoolプロジェクトと同様に、このドキュメントは読むのがとても楽しい です。
- 台座のようなルーティング構文
- パフォーマンスが優れている(Ratpackの上)
- 背圧
- websockets、sse、cors、security、ssl ...
- 掘る固有の機能:郵便
短所(2):
- ct / routes構文の快適さや、Ring仕様の廃止については完全には定かではありません(非同期ストーリーの場合ですが、ペデスタルの人たちはそれを修正したと思います)
- どのようにswaggerなどを統合するかわからない
- 試してみたところ、すぐに動作させることができませんでした
注: Clojure Webサーバーのベンチマーク生のパフォーマンスだけが重要な場合は利用可能です。
Webjure 、Clojure用のWebプログラミングフレームワーク。
機能:ディスパッチサーブレットはClojure関数を呼び出します。ダイナミックHTML生成。 SQLクエリインターフェイス(JDBC経由)。
この回答は、Webjure情報のプレースホルダーとして意図されています。
Compojureは、小さなブログアプリケーションを作成するために使用したものです。これは、Ruby用の最小限の軽量WebフレームワークであるSinatraをモデルにしています。私は主にルーティングを使用しましたが、これはシナトラのようなものです。次のようになります。
(GET "/post/:id/:slug"
(some-function-that-returns-html :id :slug))
ORMやテンプレートライブラリはありませんが、ベクターをHTMLに変換する関数があります。
これらのフレームワークも見ることができます( disclojure / projects から取得):
スタックオーバーフローに関するもう1つの関連する質問があります: Mature Clojure Webフレームワーク
免責事項:私は著者です。
luminuswebと栗のテンプレートを組み合わせたleiningenテンプレートを作成しました。
そのため、clojureコードを使用してビルドできるものと、フロントエンドおよびバックエンド用のclojurescriptコードを取得できます。
さらに、ユーザー管理に加えて、いくつかの単純なCRUD生成といくつかの小さな便利な機能を提供します。 https://github.com/sveri / closp
Duct にも @ weavejester 、Compojure and Ringのメンテナー。
コア部分では、コンポーネントとリングルーターが1つの屋根の下にあります。ダクトを使用する理由:
- 優れた哲学的基盤:一連の小さなコンポーネントとしてアプリを構築することを奨励し、適切なデフォルトを提供しながら意見をほとんど保持しないというバランスが取れています。
- 安定した道:私は自分で言いますが、長年にわたって、Clojureコミュニティは次々と信頼できないWebフレームワークを提示してきたと感じてきました。カップルは単に<!> quot; getting things done !! quot;に対して実験的すぎると感じました(Omおよびクライアント側のPedestalでの私の経験)。 (将来的に優れていると証明されるわけではありません)。一方、@ weavejesterはCompojureとRingに対して行ったのと同じ安定性と測定された進捗をDuctにもたらしたように感じます。CompojureとRingはコミュニティで見事に生まれました。
- それは super 軽量で、私のコンポーネントの邪魔になりません。
主な機能:
- <!> quot; endpoints <!> quot;でルートを整理します。これは、ミニWebサーバー(またはHTTPルートの小さな断面)と考えることができる小さなコンポーネントです。
- リロードされたワークフローのすぐに使えるサポート。
- RingおよびCompojureとの完全な統合。
- 開発および本番構成(他の場所で顕著に見当たらないもの)
- サンプル付きの優れたドキュメント。
注:言うまでもありませんが、Web開発の新参者のために、Clojureyのほとんどの場合と同様に、Ductは言語のClojureをしっかりと把握する必要があります。最初にコンポーネントについて読むこともお勧めします。
別の個人的な注意として、私は1年以上にわたっていくつかの生産アプリケーションでDuctを使用してきましたが、非常に満足しています。
コイルでClojureを試すこともできます。 http://github.com/zubairq/coils -免責事項:私は著者です
もう1つの興味深いWebサーバーは、 Http-kit です。優れたパフォーマンスがあり、リングに準拠しており、WebSocketもサポートしています。ほとんどがclojureで作成されており、Jetty / Tomcatには奇妙なものがいくつかあります。
いじるのは簡単です。
リフレームとom.nextはおそらく探しているものです。
Arachne は、新しいWebフレームワークです。 サイトの説明を引用:
Arachneは、高度なモジュール式の完全なWeb開発フレームワークです。 クロージュア。使いやすさ、シンプルさ、堅実でスケーラブルであることを強調しています デザイン。
キックスターターキャンペーン <!> quot;始めましょう<!> quot; Railsと同様の経験。それは Cognitectによって開発されました。
ここは Luminus(yogthos)の作者とのそれについての良い議論。
私はしばらくの間、本番環境で Liberator を正常に使用しています。必要なものだけが必要な場合は、すばらしいフレームワークです。 RESTful Webサービスなどを構築している場合。これは本質的にリングとコンポジュアのラッパーであり、着信リクエストを検証するときに決定グラフを提供します。また、他のよりかさばるWebフレームワークに比べて非常に高速です。どこか高速でゆっくりとビルドを開始する場合は、Liberatorが最適です。