Frage

Ich nehme an, das eine seltsame Frage der großen Mehrheit des Programmierers ist, die mit Java täglich arbeiten. Ich nicht. Ich weiß, dass Java-the-Sprache, weil ich auf Java-Projekten gearbeitet, aber nicht Java-the-world. Ich habe nie eine Web-App von Grund auf neu in Java gemacht. Wenn ich es mit Python zu tun habe, Ruby, ich weiß, wo es lang geht (Django oder Rails), aber wenn ich möchte eine Web-Anwendung in Clojure machen, nicht, weil ich in einer Java-Welt zu leben gezwungen bin, sondern weil ich wie die Sprache und ich will ihm einen Versuch geben, welche Bibliotheken und Frameworks soll ich verwenden?

War es hilfreich?

Lösung

Mit Abstand der beste Clojure Web-Framework mir noch begegnet ist Compojure: http: // GitHub. com / weavejester / compojure / Baum / Master

Es ist klein aber leistungsstark und hat schön elegante Syntax. (Es verwendet Anlegestelle unter der Haube, aber es verbirgt das Servlet-API von Ihnen, wenn Sie es wollen, die nicht oft werden). suchen gehe in der Readme zu dieser URL, dann einen Snapshot herunterladen und spielen.

Andere Tipps

Compojure ist nicht mehr ein komplettes Framework Web-Anwendungen zu entwickeln. Da die 0,4-Release hat compojure in mehrere Projekte abgebrochen.
Ring die Grundlage der HTTP-Anforderung durch Abstrahieren entfernt bietet und Antwortprozess. Ring wird die eingehende Anforderung analysieren und eine Karte generieren, alle Teile des Antrags wie uri, Servernamen und Anfrage-Methode enthält. Die Anwendung wird dann die Anforderung verarbeiten und auf der Grundlage der Anforderung eine Antwort generieren. Eine Antwort wird als Karte dargestellt die folgenden Schlüssel enthält: Status, Kopf- und Körper. So ist eine einfache Anwendung würde wie folgt aussehen:

(def app [req]
  (if (= "/home" (:uri req))
    {:status 200
     :body "<h3>Welcome Home</h3>"}
    {:status 200 
     :body "<a href='/home'>Go Home!</a>"}))

Ein weiterer Teil des Rings ist das Konzept der Middleware. Dies ist Code, der zwischen dem Handler und der eingehenden Anfrage und / oder der ausgehenden Antwort sitzt. Einige in Middleware gebaut sind Sitzungen und Stacktrace. Sitzungsschlüssel auf die Anfrage Karte, die alle von der Sitzung Informationen für den Benutzer enthält, den die Anforderung: Die Sitzung Middleware ein hinzuzufügen. Wenn die: Sitzungsschlüssel in der Antwortkarte ist, wird es für die nächste Anforderung durch die aktuellen Benutzer gemacht gespeichert werden. Während die Stack-Trace Middle-Ware werden alle Ausnahmen erfassen, die während der Verarbeitung der Anforderung auftreten und einen Stack-Trace erzeugen, die als Antwort zurück, wenn Ausnahmen auftreten gesendet wird.

mit Ring direkt arbeiten kann langwierig sein, so Compojure auf der Ring aufgebaut ist die abstrahierende entfernt Einzelheiten. Die Anwendung kann nun in Bezug auf Routing ausgedrückt werden, so dass Sie etwas davon haben können:

(defroutes my-routes
  (GET "/" [] "<h1>Hello all!</h1>")
  (GET "/user/:id" [id] (str "<h1>Hello " id "</h1>")))

Compojure ist nach wie vor mit der Bitte Arbeits / Antwort-Karten, so dass Sie immer auf sie zugreifen, wenn nötig:

(defroutes my-routes
  (GET "*" {uri :uri} 
           {:staus 200 :body (str "The uri of the current page is: " uri)}))

In diesem Fall ist die {uri: uri} Teil greift auf die. Uri Schlüssel in der Anfrage Karte und setzt uri auf diesen Wert

Die letzte Komponente ist Hiccup , die die HTML einfacher macht zu erzeugen. Die verschiedenen HTML-Tags werden als Vektoren mit dem ersten Elemente, die den Tag-Namen und den Rest ist der Körper des Tags dargestellt. "<h2>A header</h2>" wird [:h2 "A Header"]. Die Attribute eines Tags sind in einer optionalen Karte. "<a href='/login'>Log In Page</a>" wird [:a {:href "/login"} "Log In Page"]. Hier ist ein kleines Beispiel einer Vorlage mit dem HTML zu erzeugen.

(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)))

Hier ist ein Link zu einem groben Entwurf einiger Dokumentation zur Zeit vom Autor compojure geschrieben, die Sie nützlich finden könnten: Compojure Doc

Es gibt auch "Noir" ( http://www.webnoir.org/ ), die a neuer Clojure Web-Framework (so neu die docs sind noch nicht da). Von Django / Rails, grabe ich die einfache, unkomplizierte Syntax und es ist ziemlich mager.

Betrachten Sie die Luminus Web-Framework . Ich habe keine Verbindung haben aber gute Dinge von Freunden gehört respektiere ich.

Meine aktuelle go-to Web-Bibliothek ist jetzt yada .

Wenn Sie gerade erst anfangen, der einleitende Server Compojure . Ich sehe es als apache von Web-Servern in der Clojure Welt (in diesem Fall yada / Aleph wäre nginx). Sie könnten verwenden Luminus als Vorlage. Es gibt Varianten davon, wie compojure-api .

Ich habe versucht, ou Pedestal und war damit global zufrieden. Ich behaupte nicht, es zu meistern, aber es hat eine angenehme Syntax, fühlt sich sehr zusammenhängend, und sieht aus wie es große Leistung hat. Es wird auch von Cognitect (die Clojure / Datomic Unternehmen, in dem Rich-Hickey arbeitet) gesichert.

Ich fand Aleph eine interessante Abstraktion zu präsentieren, und die sich im internen Gegendruck scheint interessant. Ich habe noch mit ihm zu spielen, aber es ist auf jeden Fall auf meiner Liste.

Nach einem wenig mit verschiedenen Web-Servern zu spielen, hier ist meine schnelle Pro / Contra-Liste:

Kurze Antwort: einen Blick auf Luminus , um schnell zu beginnen, vielleicht bewegen auf etwas anderes als Ihr Bedürfnisse entwickeln (Yada vielleicht).

Compojure

  • Pros (1):

    • leicht, viele Vorlagen / Beispiele (ex. Luminous)
  • Cons (2):

    • Nicht performant (ein Thread pro Anfrage), Leistungen etwas besser als Schienen erwartet
    • Nicht einfach, das Middleware-Modell hat Unbequemlichkeiten

Pedestal

  • Pros (3):

    • Interceptor Modell, angenehme Syntax Abfangjäger auf eine Teilmenge von Routen
    • hinzufügen
    • performant Router
    • unterstützt json / transit / mehrteiliger Formulare transparent aus dem Kasten heraus, ohne etwas dafür zu verlangen. Sehr cool!
  • Cons (4):

    • keine websocket Unterstützung (noch) nicht, wäre schön core.async Kanäle Rückkehr
    • ein bisschen langsam zu laden, wenn es in einer Stuart Sierra Komponente setzen (ich glaube, Sie sollen den Reload-Abfangjäger verwenden)
    • keine Prüfanlage für async Abfangjäger
    • erfordert Buy-in (?)

Aleph

Pro (3):

  • Performante
  • Rückstau
  • Websocket / SSE-Unterstützung, wenn ein Verteilerstrom
  • Rückkehr

Cons (1):

  • Low Level, do it yourself Art (zB. Es gibt dir nur einen Weg, um Ihre Handler zu tun, etwas zu machen. Keinen Router, gar nichts). Nicht wirklich ein Nachteil, nur bewusst sein, es.

Yada

Pro (3):

  • gebaut auf Aleph
  • Inhalt negociation
  • Prahlerei Integration
  • bidi ist ganz in Ordnung (obwohl Ich mag Sockel Router Syntax besser)

Cons (1):

  • Dokumentation (wenn auch nicht so schlecht, wie nginx-clojure, schnell zu verbessern).

HttpKit

Pro (2):

  • Geschrieben in Clojure! (Und Java ...)
  • Leistung sieht gut aus (siehe 600K gleichzeitige Verbindungen post)

Cons (2):

  • Keine CORS Unterstützung
  • Bugs? Auch nicht viel letzten Commits

Nginx-Clojure

Hinweis: Ich habe nicht mit ihm gespielt, vor allem wegen des fehlenden Dokumentation. Es sieht interessant aber, und sehr performant.

Pros (2):

  • Nginx (performant, Offload ssl, starten Arbeiter ...)
  • Könnte dieses Modell Null-Ausfallzeit-Updates zulassen? Das wäre so genial!

Cons (1):

  • Dokumentation (Verbesserung). Auch ich möchte nicht in einer nginx Konfigurationsdatei in Strings programmieren eingebettet, wenn das der einzige Weg ist, es zu tun.
  • ProBably kompliziert ein bisschen den ersten Einsatz (?)

Immutant

. Hinweis: Ich habe nicht mit ihm gespielt

Vorteile:

  • integriert (Caching, Messaging, Scheduling, Wildfly deploy)

Nachteile:

  • kein http-Client

Catacumba

Hinweis: Ich habe nicht mit ihm gespielt, obwohl die Dokumentation ausgezeichnet aussieht. Ich werde es wahrscheinlich, zunächst versuchen. Es Beispiel Chat-Projekte sind die interessant aussehen, ihr schwerer Einsatz der Protokolle hat mich zunächst als Neuling Clojure Entwickler aus.

Pros (6):

  • Dokumentation! Wie alle funcool Projekte, die doc ist sehr angenehm zu lesen.
  • sockelartigen Routing-Syntax
  • sollte performant sein (oben Ratpack)
  • Rückstau
  • WebSockets, sse, cors, Sicherheit, ssl ...
  • einzigartige Eigenschaften zu graben: Post

Cons (2):

  • Nicht ganz sicher, wie angenehm die ct / Routen Syntax ist, und über den Ring spec Notwasserung (angeblich für die Asynchron-Geschichte, aber ich dachte, dass die Sockel Jungs festgelegt, dass)
  • Nicht sicher, wie man integrieren würde Prahlerei etc.
  • , wenn ich es versuchte, war ich nicht in der Lage, um es sofort funktioniert

Hinweis : ein Benchmark von Clojure Web-Server zur Verfügung steht, wenn rohe Leistung ist alles, was zählt.

In diesen Tagen Pedestal ein Rahmen einen Blick wert ist. Es ist eine serverseitige Framework, das auf Builds von Ring , sondern befreit auch die eingehende Anforderung von die Anfangsfäden durch die Möglichkeit, dass die bestimmte Anforderung zu unterbrechen und wieder aufzunehmen (sonst ein langsamer Anforderungsblock tatsächlich diesen Serverthread). Vielleicht wie eine Art JavaBean.

Weitere kühle Frameworks ist hoplon.io und David Nolen des Om (basierend auf React)

Webjure , eine Web-Programmierung Rahmen für Clojure.

Eigenschaften: Versand Servlet Clojure-Funktionen aufruft. Dynamic HTML-Generation. SQL-Abfrage-Schnittstelle (über JDBC).

Diese Antwort wird als Platzhalter gedacht für Webjure Informationen.

Compojure ist, was ich verwenden, um eine kleine Blogging-Anwendung zu erstellen. Es ist das Vorbild Sinatra, die eine minimale, leichtgewichtige Web-Framework Ruby ist. Ich meist verwendet nur das Routing, die wie Sinatras ist. Es sieht aus wie:

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

Es gibt keine ORM oder Templating-Bibliothek, aber es hat Funktionen, die Vektoren in HTML verwandeln.

Sie können auch Blick auf diese Rahmenbedingungen haben (aus disclojure / Projekte ):

Es gibt auch noch eine weitere Frage auf Stack Overflow: Mature Clojure Web-Frameworks

Disclaimer: Ich bin der Autor

.

Ich habe eine Leiningen Vorlage, die Vorlagen luminusweb und Kastanien kombiniert. So erhalten Sie etwas, das Sie Clojure Code mit und clojurescript Code für Front- und Backend aufbauen können.
Zusätzlich bietet es die Benutzerverwaltung sowie einige einfache CRUD Generation und einige weitere kleine schön zu haves: https://github.com/sveri / closp

ich in meinen zwei Cent werfen werde für Duct , auch von @ weavejester , der Maintainer von Compojure und Ring.

Bei ihrem Kern ist, bringt es Component und die Ring-Router unter einem Dach. Gründe, warum ich Duct verwenden:

  • Hervorragende philosophische Grundlage. Es wird Sie Ihre App als eine Reihe von kleinen Komponenten zu bauen, und es trifft auf eine gute Balance zwischen einigen Meinungen zu halten, während vernünftige Default Bereitstellung
  • Stable Weg: Ich spreche für mich selbst, aber im Laufe der Jahre habe ich das Gefühl, dass die Clojure Gemeinschaft nach dem anderen, weniger als glaubwürdige Web-Framework vorgestellt hat. Ein Paar fühlte sich einfach zu experimentell (meine Erfahrung mit Om und clientseitige Sockel) für „Getting Things Done“ (nicht, dass sie nicht überlegen beweisen die Straße hinunter). Auf der anderen Seite, ich fühle mich wie @weavejester die gleiche Stabilität und gemessenen Fortschritt Duct gebracht hat, dass er zu Compojure und Ring hat, die hervorragend waren in der Gemeinschaft geboren werden.
  • Es ist Super leicht und aus dem Weg meiner Komponenten.

Die wichtigsten Features:

  • Veranstaltet Routen durch „Endpunkte“, kleine Komponenten, die Sie als Mini-Web-Servers (oder kleine Querschnitte von HTTP-Routen) denken.
  • Out-of-the-box-Unterstützung für die Reloaded Workflow-.
  • Perfekte Integration mit Ring und Compojure.
  • Entwicklung und Produktion Konfigurationen (etwas, das ich gefunden habe, auffallend fehlt an anderer Stelle).
  • Gute Dokumentation mit Beispielen.

Hinweis: Es versteht sich von selbst, sondern zum Nutzen der Web-Entwicklung Neulinge, wie die meisten Clojurey Dinge Duct erfordert ein solides Verständnis der Clojure die Sprache. Ich empfehle auch zuerst über Component zu lesen.

Bei einer anderen persönlichen Anmerkung, ich habe jetzt seit über ein Jahr in mehreren Produktionsanwendungen mit Duct gewesen und bin sehr zufrieden damit.

Sie können auch Clojure auf Spulen versuchen, http://github.com/zubairq/coils - Disclaimer: ich bin der Autor

Ein weiterer interessanter Webserver ist Http-kit . Es hat eine gute Leistung und ist Ring-konform und hat die Unterstützung für WebSockets auch. Es ist vor allem in clojure gemacht, und es fehlt einige der seltsamen Dinge in Jetty / Tomcat.

Es ist einfach zu basteln.

Reframe und om.next wahrscheinlich das, was Sie suchen.

Arachne ist ein Neuling Web-Framework. Unter Angabe der Beschreibung der Website:

  

Arachne ist ein vollständiger, hochmodulare Web-Entwicklungs-Framework für   Clojure. Er betont Leichtigkeit, Einfachheit und eine solide, skalierbare   Design.

Es hat eine Kickstarter-Kampagne behauptet, eine „getting started“ Erfahrung ähnlich wie Rails zu bieten. Es ist entwickelt von einem Cognitect.

Hier ist eine gute Diskussion darüber mit dem Autor von Luminus (yogthos).

Ich habe mit Liberator für eine Weile jetzt erfolgreich in der Produktion. Es ist ein großer Rahmen, wenn man nur die nackten Knochen wollen z.B. wenn Sie bauen einen RESTful Web-Service oder etwas ähnliches. Es ist im Wesentlichen ein Wrapper für Ring und compojure und stellt einen Entscheidungsgraphen, wenn eingehende Anforderungen zu validieren. Es ist auch extrem schnell im Vergleich zu anderen sperrigen Web-Frameworks. Wenn Sie irgendwo schnell starten wollen und langsam aufbauen heraus dann Liberator ist eine gute Wahl.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top