Je suppose que cette question est étrange pour la grande majorité des programmeurs travaillant quotidiennement avec Java. Je ne. Je connais le langage Java, car j’ai travaillé sur des projets Java, mais pas Java-le-monde. Je n’ai jamais créé une application Web à partir de rien en Java. Si je devais le faire avec Python, Ruby, je sais où aller (Django ou Rails), mais si je veux créer une application Web dans Clojure, ce n'est pas parce que je suis obligé de vivre dans un monde Java, mais parce que j'aime le langage et que je veux l'essayer, quelles bibliothèques et quels frameworks dois-je utiliser?
Le meilleur framework web Clojure que j'ai rencontré à ce jour est Compojure: http://github.com/weavejester/compojure/tree/master
Il est petit mais puissant et sa syntaxe est élégante et élégante. (Il utilise Jetty sous le capot, mais il cache l’API Servlet à moins que vous ne le souhaitiez, ce qui ne sera pas souvent le cas). Allez regarder le README à cette URL, puis téléchargez un instantané et commencez à jouer.
Compojure n'est plus un cadre complet pour le développement d'applications Web. Depuis la publication de la version 0.4, la composition a été divisée en plusieurs projets.
Ring fournit les bases en résumant le processus de requête et de réponse HTTP. Ring analysera la requête entrante et générera une carte contenant toutes les parties de la requête, telles que l'URI, le nom du serveur et la méthode de la requête. L'application traitera ensuite la demande et générera une réponse sur la base de la demande. Une réponse est représentée sous forme de carte contenant les clés suivantes: statut, en-têtes et corps. Donc, une application simple ressemblerait à ceci:
(def app [req]
(if (= "/home" (:uri req))
{:status 200
:body "<h3>Welcome Home</h3>"}
{:status 200
:body "<a href='/home'>Go Home!</a>"}))
Un autre aspect de Ring est le concept de middle-ware. Ce code se situe entre le gestionnaire et la demande entrante et/ou la réponse sortante. Certains middle-ware intégrés incluent des sessions et stacktrace. L'intermédiaire de session ajoutera une clé: session à la mappe de requête contenant toutes les informations de session de l'utilisateur à l'origine de la requête. Si la clé: session est présente dans la mappe de réponse, elle sera stockée pour la prochaine requête de l'utilisateur actuel. Tandis que le middleware de trace de pile capturera toutes les exceptions qui se produisent lors du traitement de la demande et générera une trace de pile qui sera renvoyée comme réponse si des exceptions se produisent.
Travailler directement avec Ring peut être fastidieux, donc Compojure est construit sur le dessus de Ring pour en extraire les détails. L'application peut maintenant être exprimée en termes de routage afin que vous puissiez avoir quelque chose comme ceci:
(defroutes my-routes
(GET "/" [] "<h1>Hello all!</h1>")
(GET "/user/:id" [id] (str "<h1>Hello " id "</h1>")))
Compojure fonctionne toujours avec les cartes demande/réponse afin que vous puissiez toujours y accéder si nécessaire:
(defroutes my-routes
(GET "*" {uri :uri}
{:staus 200 :body (str "The uri of the current page is: " uri)}))
Dans ce cas, la partie {uri: uri} accède à la clé: uri dans la mappe de demande et définit uri sur cette valeur.
Le dernier composant est Hiccup , ce qui facilite la génération du code HTML. Les différentes balises html sont représentées sous forme de vecteurs, le premier élément représentant le nom de la balise et le reste étant le corps de la balise. "<h2>A header</h2>"
devient [:h2 "A Header"]
. Les attributs d'une balise sont dans une carte facultative. "<a href='/login'>Log In Page</a>"
devient [:a {:href "/login"} "Log In Page"]
. Voici un petit exemple d'utilisation d'un modèle pour générer le code 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)))
Voici un lien vers un brouillon de la documentation en cours de rédaction par l'auteur de compojure qui pourrait vous être utile: Compojure Doc
Il y a aussi "Noir" ( http://www.webnoir.org/ ), qui est un nouveau framework Web Clojure (les nouveaux documents ne sont donc pas encore disponibles). Venant de Django/Rails, je creuse la syntaxe simple et directe et elle est plutôt maigre.
Considérez le cadre web Luminus . Je n'ai aucune affiliation, mais j'ai entendu de bonnes choses d'amis que je respecte.
Ma bibliothèque Web actuelle est maintenant yada .
Si vous débutez, le serveur d’introduction est Compojure
. Je le vois comme le Apache
des serveurs Web du monde Clojure (auquel cas yada/aleph serait nginx). Vous pouvez utiliser Luminus
comme modèle. Il en existe des variantes, comme compojure-api
.
J'ai essayé ou Pedestal
et j'en ai été globalement satisfait. Je ne prétends pas le maîtriser, mais sa syntaxe est agréable, il semble très cohérent et semble avoir d'excellentes performances. Il est également soutenu par Cognitect
(la société Clojure/Datomic où travaille Rich Hickey).
J'ai trouvé Aleph
pour présenter une abstraction intéressante, et la contre-pression intégrée semble intéressante. Je n'ai pas encore joué avec, mais c'est définitivement sur ma liste.
Après avoir joué un peu avec différents serveurs Web, voici ma liste rapide de Pro/Cont:
Réponse courte: jetez un œil à Luminus pour commencer rapidement, passez peut-être à autre chose au fur et à mesure de l'évolution de vos besoins (peut-être Yada).
Avantages (1):
Inconvénients (2):
Avantages (3):
Inconvénients (4):
Pro (3):
Inconvénients (1):
Pro (3):
Inconvénients (1):
Pro (2):
Inconvénients (2):
Note: Je n'ai pas joué avec, principalement à cause du manque de documentation. Cela semble intéressant et très performant.
Avantages (2):
Inconvénients (1):
Note: je n'ai pas joué avec.
Avantages :
Les inconvénients :
Remarque: je n'ai pas joué avec, même si la documentation est excellente. Je vais probablement l'essayer ensuite. Il existe des exemples de projets de discussion en ligne qui semblent intéressants, leur utilisation intensive de protocoles me rebute au début en tant que novice Clojure dev.
Avantages (6):
Inconvénients (2):
Remarque : a référence des serveurs Web Clojure est disponible, si les performances brutes sont tout ce qui compte.
De nos jours Pedestal est un cadre qui vaut le détour. Il s’agit d’un framework côté serveur qui repose sur Ring , mais libère également la requête entrante du thread initial en pouvant suspendre et reprendre cette requête particulière (sinon, une requête lente bloque en fait ce disque vert). . Peut-être un peu comme un JavaBean.
Les autres frameworks sympas sont hoplon.io et ceux de David Nolen Om (basés sur React)
Webjure , un framework de programmation web pour Clojure.
Caractéristiques: Le servlet de répartition appelle les fonctions Clojure. Génération HTML dynamique. Interface de requête SQL (via JDBC).
Cette réponse est conçue comme un espace réservé pour les informations Webjure.
Compojure est ce que j'ai utilisé pour construire une application de blogging minuscule. Il est calqué sur Sinatra, qui est un framework web minimal et léger pour Ruby. J'ai surtout utilisé le routage, qui ressemble à celui de Sinatra. Ça ressemble à:
(GET "/post/:id/:slug"
(some-function-that-returns-html :id :slug))
Il n'y a pas de bibliothèque ORM ni de bibliothèque de modèles, mais elle possède des fonctions qui transforment les vecteurs en HTML.
Vous pouvez également consulter ces cadres (pris de disclojure/projects ):
Il existe également une autre question connexe sur le dépassement de capacité: cadres web Clojure matures?
Disclaimer: je suis l'auteur.
J'ai assemblé un modèle Leiningen qui combine des modèles Luminusweb et Châtaignier. Vous obtenez donc quelque chose avec lequel vous pouvez construire du code clojure avec et du code clojurescript pour front et backend.
En outre, il offre une gestion des utilisateurs ainsi qu’une génération de CRUD simple et d’autres plus petites. Nice to nves: https://github.com/sveri/closp
Je vais donner mes deux sous pour Duct , également de @ weavejester , le mainteneur de Compojure et Ring.
À la base, il apporte Composant et le routeur Ring sous un même toit. Raisons pour lesquelles j'utilise Duct:
Principales caractéristiques:
Remarque: Cela va sans dire, mais pour le bénéfice des nouveaux arrivants en développement Web, comme la plupart des choses Clojurey, Duct requiert une solide connaissance de la langue. Je vous recommande également de lire d'abord sur Component.
Sur une autre note personnelle, j'utilise Duct dans plusieurs applications de production depuis plus d'un an et j'en suis extrêmement heureux.
vous pouvez également essayer Clojure sur Coils, http://github.com/zubairq/coils - disclaimer: je suis l'auteur
Un autre serveur Web intéressant est Http-kit . Il offre de bonnes performances, est conforme à la bague et prend également en charge WebSockets. Il est fait principalement en clojure, et manque certaines des choses étranges dans Jetty/Tomcat.
C'est facile de bricoler.
Recadrer et om.next probablement ce que vous recherchez.
Arachne est un framework web pour nouveaux venus. En citant la description du site:
Arachne est un cadre de développement Web complet et hautement modulaire pour Clojure. Il met l'accent sur la facilité, la simplicité et une conception solide et évolutive.
Il a une campagne kickstarter prétendant offrir une expérience de "démarrage" similaire à Rails. Il est développé par un Cognitect.
Here est une bonne discussion à ce sujet avec l’auteur de Luminus (Yogthos).
J'utilise Liberator avec succès en production depuis un certain temps maintenant. C’est un excellent cadre si vous voulez seulement le strict minimum, par exemple. si vous créez un service Web RESTful ou quelque chose de similaire. C'est essentiellement un wrapper pour ring et compojure et fournit un graphe de décision lors de la validation des requêtes entrantes. C'est aussi extrêmement rapide par rapport à d'autres frameworks Web plus volumineux. Si vous souhaitez commencer quelque part rapidement et progressivement, Liberator est un excellent choix.