web-dev-qa-db-fra.com

Comment créer une application Web à Clojure?

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?

214
pupeno

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.

103
Meredydd

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

179
Ross Goddard

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.

48
elithrar

Considérez le cadre web Luminus . Je n'ai aucune affiliation, mais j'ai entendu de bonnes choses d'amis que je respecte.

24
Michael Easter

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

Compojure

  • Avantages (1):

    • facile, beaucoup de modèles/exemples (ex. Luminous)
  • Inconvénients (2):

    • Non performant (un thread par requête), attendez-vous à des performances légèrement meilleures que Rails
    • Pas simple, le modèle middleware a des inconvénients

Piédestal

  • Avantages (3):

    • modèle d'intercepteur, syntaxe agréable pour ajouter des intercepteurs à un sous-ensemble de routes
    • routeur performant
    • prend en charge les formulaires json/transit/multipart de manière transparente, sans rien demander. Très sympa !
  • Inconvénients (4):

    • pas encore de support websocket, retourner les canaux core.async serait bien
    • un peu lent à recharger si vous le mettez dans un composant de Stuart Sierra (je pense que vous êtes supposé utiliser l'intercepteur de rechargement)
    • aucune installation de test pour les intercepteurs asynchrones
    • nécessite un buy-in (?)

Aleph

Pro (3):

  • Performant
  • contrepression
  • Prise en charge de Websocket/SSE lors du retour d'un flux multiple

Inconvénients (1):

  • Faible niveau, faites-le vous-même (c’est-à-dire que cela vous donne simplement le moyen de faire faire quelque chose à vos gestionnaires. Pas de routeur, pas de rien). Pas vraiment un inconvénient, juste en être conscient.

Yada

Pro (3):

  • construit sur Aleph
  • négociation de contenu
  • intégration de fanfaronnade
  • bidi est assez correct (bien que j'aime mieux la syntaxe du routeur de piédestal)

Inconvénients (1):

  • documentation (bien que pas aussi mauvais que nginx-clojure, en amélioration rapide).

HttpKit

Pro (2):

  • Écrit en Clojure! (et Java ...)
  • les performances sont bonnes (voir les 600 000 connexions simultanées postées)

Inconvénients (2):

  • Pas de support CORS
  • Bogues ? En outre, pas beaucoup de commits récents

Nginx-Clojure

Note: Je n'ai pas joué avec, principalement à cause du manque de documentation. Cela semble intéressant et très performant.

Avantages (2):

  • Nginx (performant, décharger ssl, redémarrer des ouvriers ...)
  • Ce modèle pourrait-il autoriser les mises à jour sans interruption de service? Ce serait tellement génial!

Inconvénients (1):

  • Documentation (en amélioration). De plus, je ne souhaite pas programmer dans des chaînes incorporées dans un fichier de configuration nginx si c'est le seul moyen de le faire.
  • Cela complique probablement un peu le premier déploiement (?)

Immutant

Note: je n'ai pas joué avec.

Avantages :

  • intégré (mise en cache, messagerie, planification, déploiement de wildfly)

Les inconvénients :

  • pas de client http

Catacumba

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

  • documentation ! Comme tous les projets funcool, la doc est très agréable à lire.
  • syntaxe de routage de type piédestal
  • devrait être performant (au dessus de Ratpack)
  • contrepression
  • websockets, sse, cors, sécurité, ssl ...
  • caractéristiques uniques à Dig: postal

Inconvénients (2):

  • Je ne suis pas tout à fait sûr de l’agréable syntaxe de ct/routes, ni de l’abandon de la spécification Ring (supposément pour l’histoire asynchrone, mais j’ai pensé que les gars du piédestal avaient réglé le problème)
  • Je ne sais pas comment on intégrerait swagger etc.
  • quand je l'ai essayé, je n'ai pas réussi à le faire fonctionner immédiatement

Remarque : a référence des serveurs Web Clojure est disponible, si les performances brutes sont tout ce qui compte.

20
nha

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)

14
claj

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.

11
pupeno

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.

8
Joe W.

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?

5
mnicky

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

3
sveri

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:

  • Excellente base philosophique: elle vous encourage à construire votre application sous la forme d’une série de petits composants et vous permet de trouver un juste équilibre entre avoir peu d’opinions et fournir des valeurs saines par défaut.
  • Chemin stable: je parle pour moi-même, mais au fil des ans, j'ai eu le sentiment que la communauté Clojure a présenté un cadre Web peu crédible après l'autre. Un couple s'est simplement senti trop expérimental (mon expérience d'Om et de Pedestal côté client) pour "faire avancer les choses" (sans pour autant qu'ils ne se révèlent pas supérieur sur la route). D'autre part, je pense que @weavejester a apporté à Duct la même stabilité et les progrès mesurés qu'il a fait à Compojure et Ring, qui ont été superbement nés dans la communauté.
  • C'est super léger et éloigné de mes composants.

Principales caractéristiques:

  • Organise les itinéraires par "points de terminaison", de petits composants que vous pouvez considérer comme des mini-serveurs Web (ou de petites sections de vos itinéraires HTTP).
  • Prise en charge immédiate de flux de travail rechargé .
  • Intégration parfaite avec Ring et Compojure.
  • Configurations de développement et de production (quelque chose que j'ai trouvé remarquablement absent ailleurs).
  • Bonne documentation avec des exemples.

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.

3
KendallB

vous pouvez également essayer Clojure sur Coils, http://github.com/zubairq/coils - disclaimer: je suis l'auteur

2
Zubair

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.

2
claj

Recadrer et om.next probablement ce que vous recherchez.

2
ftravers

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

1
Micah Elliott

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.

1
dfbernal