Comment créer une application web dans Clojure? [fermé]

216

Je suppose que c'est une étrange question pour la grande majorité des programmeurs qui travaillent quotidiennement avec Java. Je ne. Je connais Java-the-language, car j'ai travaillé sur des projets Java, mais pas Java-the-world. Je n'ai jamais créé une application Web à partir de zéro en Java. Si je dois le faire avec Python, Ruby, je sais où aller (Django ou Rails), mais si je veux faire une application web dans Clojure, non pas parce que je suis obligé de vivre dans un monde Java, mais parce que je comme le langage et je veux l'essayer, quelles bibliothèques et frameworks dois-je utiliser?

pupeno
la source
1
Je me demandais si vous souhaitiez utiliser Java Native API ou Clojure Native celles?
Ande Turner
Ande: Je ne suis vraiment pas sûr, car je connais si peu le monde Java à cet égard (mais j'utilise déjà Java, le langage, depuis un certain temps déjà au travail).
pupeno
Je pense que ce serait bien si cette question se terminait par une liste de frameworks Web Clojure, une réponse chacun, et n'importe qui pourrait voter pour leur favori. Je pense que Meredydd est certainement la réponse de Compojure. J'en ajouterai un pour Webjure et ce serait bien d'avoir une comparaison.
pupeno
Pupeno! Je suis arrivé ici à la recherche de "applications web avec clojure". Cette page était le premier résultat dans Google.
Sebastián Grignoli
2
Regardez aussi la question connexe stackoverflow.com/questions/3325033/…
Petr Gladkikh

Réponses:

104

De loin, le meilleur framework web Clojure que j'ai rencontré est Compojure: http://github.com/weavejester/compojure/tree/master

Il est petit mais puissant et possède une syntaxe magnifiquement élégante. (Il utilise Jetty sous le capot, mais il vous cache l'API Servlet à moins que vous ne le vouliez, ce qui ne sera pas souvent). Allez voir le fichier README à cette URL, puis téléchargez un instantané et commencez à jouer.


la source
16
Le commentaire de Richard était-il destiné à cette réponse? Je ne le comprends pas.
John Cromartie
26
@Richard Votre argument est assez stupide. Oui, si vous décidez d'utiliser des bibliothèques java, vous renoncez à être fonctionnel dans de nombreux cas. Mais le but de ces bibliothèques est que vous n'ayez plus jamais à le refaire . Par exemple, Ring est un wrapper Clojury autour des servlets, vous n'avez donc pas à utiliser directement les servlets. Souhaitez-vous proposer de réinventer la roue de développement Web à partir de zéro plutôt que de rendre les outils Java parfaitement bons agréables à utiliser à partir de Clojure? Où est la logique dans ceci. De plus, en quoi la possibilité d'utiliser ces bibliothèques est-elle une mauvaise chose? ...
Rayne
15
@Richard Tout votre argument implique que le code non fonctionnel non Clojure est intrinsèquement si mauvais que même sa présence cachée sous une bibliothèque est une contamination. Je ne comprends pas ce raisonnement. De nombreuses bibliothèques Java sont des morceaux de code utiles et puissants. Pourquoi les réécrire à partir de zéro alors que nous pouvons simplement fournir nos propres bibliothèques de wrappers qui permettent de les utiliser de manière élégante et fonctionnelle à partir de Clojure?
Rayne
10
@Richard, n'hésitez pas à créer un serveur http pur-clojure.
gtrak
5
En termes Lisp / Clojure, une fonction n'a pas d'effets secondaires. (voir gigamonkeys.com/book/… ). Cependant, comme indiqué dans le Land of Lisp ( landoflisp.com/trade_func.png ), un programme purement fonctionnel n'est généralement pas très utile car des effets secondaires sont nécessaires pour réellement faire des choses, comme écrire des enregistrements de base de données, télécharger des fichiers, publier sur un Serveur REST, générer des images, etc ...
lfalin
179

Compojure n'est plus un framework complet pour développer des applications web. Depuis la version 0.4, compojure a été décomposé en plusieurs projets.

Ring fournit la base en faisant abstraction du processus de demande et de réponse HTTP. Ring analysera la demande entrante et générera une carte contenant toutes les parties de la demande telles que l'URI, le nom du serveur et la méthode de la demande. L'application traitera alors la demande et, sur la base de la demande, générera une réponse. Une réponse est représentée sous la forme d'une carte contenant les clés suivantes: état, en-têtes et corps. Une application simple ressemblerait donc à:

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

Une autre partie de Ring est le concept de middleware. Il s'agit d'un code situé entre le gestionnaire et la demande entrante et / ou la réponse sortante. Certains middlewares intégrés incluent des sessions et stacktrace. Le middleware de session ajoutera une clé: session à la mappe de requête qui contient toutes les informations de session pour l'utilisateur effectuant la requête. Si la clé: session est présente dans la mappe de réponse, elle sera stockée pour la prochaine demande faite par l'utilisateur actuel. Alors 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 au-dessus de Ring en abstraction des 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 travaille toujours avec les cartes de 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 qui facilite la génération du HTML. Les différentes balises html sont représentées comme des 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 utilisant un modèle pour générer le 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 certains documents en cours de rédaction par l'auteur de compojure qui pourraient vous être utiles: Compojure Doc

Ross Goddard
la source
48

Il y a aussi "Noir" ( http://www.webnoir.org/ ), qui est un nouveau framework web Clojure (donc les nouveaux documents ne sont pas encore là). Venant de Django / Rails, je creuse la syntaxe simple et directe et c'est assez maigre.

elithrar
la source
Webnoir est vraiment très utile! Il est très facile de commencer - vous pouvez le développer un peu comme on semble développer du php - il suffit de démarrer un serveur (cette fois avec leiningen), d'éditer vos fichiers et de recharger votre navigateur pour voir ce que vous avez.
claj
Depuis que @elithrar a répondu, Noir a maintenant les documents disponibles: webnoir.org/docs
Alistair Collins
18
Juste pour mémoire, il semble que Noir a été déprécié et n'est plus maintenu ....
SolarBear
25

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

Michael Easter
la source
20

Ma bibliothèque Web actuelle est désormais yada .

Si vous débutez, le serveur d'introduction est Compojure. Je le vois comme celui apachedes serveurs Web dans le monde Clojure (auquel cas yada / aleph serait nginx). Vous pouvez utiliser Luminuscomme modèle. Il en existe des variantes, comme compojure-api.

J'ai essayé ou j'en étais Pedestalglobalement satisfait. Je ne prétends pas le maîtriser, mais il a une syntaxe agréable, se sent très cohérent et semble avoir de bonnes performances. Il est également soutenu par Cognitect(la société Clojure / Datomic où travaille Rich Hickey).

J'ai trouvé Alephà 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 divers serveurs Web, voici ma liste rapide des avantages et inconvénients:

Réponse courte: jetez un œil à Luminus pour commencer rapidement, peut-être passer à autre chose à mesure que vos besoins évoluent (Yada peut-être).

Compojure

  • Avantages (1):

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

    • Pas performant (un fil par demande), attendez-vous à des performances légèrement meilleures que les 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 en toute transparence hors de la boîte, sans rien demander. Très cool !
  • Contre (4):

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

Aleph

Pro (3):

  • Performant
  • contre-pression
  • Prise en charge de Websocket / SSE lors du retour d'un flux collecteur

Contre (1):

  • Faible niveau, faites-le vous-même (c'est-à-dire qu'il vous donne juste un moyen de faire faire quelque chose à vos gestionnaires. Pas de routeur, rien). Pas vraiment un inconvénient, sachez-le.

Yada

Pro (3):

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

Contre (1):

  • documentation (bien que moins mauvaise que nginx-clojure, en amélioration rapide).

HttpKit

Pro (2):

  • Écrit en Clojure! (et Java ...)
  • les performances semblent bonnes (voir le post sur les connexions simultanées 600K)

Contre (2):

  • Pas de support CORS
  • Bugs ? Aussi, pas beaucoup de commits récents

Nginx-Clojure

Remarque: je n'ai pas joué avec, principalement en raison du manque de documentation. Cela semble intéressant et très performant.

Avantages (2):

  • Nginx (performant, déchargement ssl, redémarrage des travailleurs ...)
  • Ce modèle pourrait-il autoriser des mises à jour sans interruption? Ce serait tellement génial!

Contre (1):

  • Documentation (en amélioration). De plus, je ne veux pas programmer de chaînes intégrées dans un fichier de configuration nginx si c'est la seule façon de le faire.
  • Complique probablement un peu le premier déploiement (?)

Immutant

Remarque: je n'ai pas joué avec.

Avantages :

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

Les inconvénients :

  • pas de client http

Catacumba

Remarque: je n'ai pas joué avec, bien que la documentation soit excellente. Je vais probablement l'essayer ensuite. Il existe des exemples de projets de chat qui semblent intéressants, leur utilisation intensive des protocoles m'a découragé au début en tant que développeur novice de Clojure.

Avantages (6):

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

Contre (2):

  • Je ne sais pas trop à quel point la syntaxe ct / routes est agréable et abandonner la spécification Ring (supposément pour l'histoire asynchrone, mais je pensais que les gars du piédestal avaient corrigé cela)
  • Je ne sais pas comment on intégrerait la fanfaronnade, etc.
  • quand je l'ai essayé, je n'ai pas pu le faire fonctionner tout de suite

Remarque : une référence des serveurs Web Clojure est disponible, si la performance brute est tout ce qui compte.

nha
la source
Grande comparaison.
je
1
@matanster Je vois apache comme le serveur go-to par défaut pour de nombreuses organisations. Simple, fonctionne pour beaucoup. Mais il est également plus ancien que nginx et utilise un modèle interne différent. Compojure est synchrone (qui peut changer) tandis que Yada est asynchrone. Un autre avantage de Yada que je n'ai pas mentionné est que tout est des données, il est donc beaucoup plus facile de composer / transformer / inspecter / générer par rapport aux macros comme dans Compojure.
nha
14

De nos jours, le piédestal est un cadre qui mérite le détour. Il s'agit d'un framework côté serveur qui s'appuie sur Ring , mais libère également la demande entrante du thread initial en pouvant mettre en pause et reprendre cette demande particulière (sinon une demande lente bloque en fait ce serverthread). Peut-être un peu comme un JavaBean.

D'autres cadres sympas sont hoplon.io et Om de David Nolen (basé sur React)

claj
la source
11

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.

pupeno
la source
3
Je ne suis pas sûr que ce soit un bon exemple non plus. Bien que la base de code semble peu profonde (bonne), il y a suffisamment d'écrit en java pour qu'il semble manquer la marque. Je m'attendais à un cadre de clôture pur.
Richard
8

Compojure est ce que j'ai utilisé pour créer une petite application de blog. Il est calqué sur Sinatra, qui est un cadre Web minimal et léger pour Ruby. J'ai surtout utilisé le routage, qui est exactement comme celui de Sinatra. On dirait:

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

Il n'y a pas d'ORM ou de bibliothèque de modèles, mais il a des fonctions qui transforment les vecteurs en HTML.

Joe W.
la source
3

Avertissement: je suis l'auteur.

J'ai mis en place un modèle leiningen qui combine des modèles luminusweb et marron. Vous obtenez donc quelque chose avec lequel vous pouvez créer du code clojure et du code clojurescript pour le front et le backend.
En outre, il fournit une gestion des utilisateurs ainsi qu'une génération de CRUD simple et d'autres fonctionnalités plus intéressantes: https://github.com/sveri/closp

sveri
la source
3

Je mettrai mes deux cents pour Duct , également de @weavejester , le mainteneur de Compojure et Ring.

À la base, il rassemble Component et le routeur Ring sous un même toit. Raisons pour lesquelles j'utilise Duct:

  • Excellente base philosophique: elle vous encourage à créer votre application comme une série de petits composants, et elle établit un bon équilibre entre avoir peu d'opinions tout en fournissant des valeurs par défaut raisonnables.
  • Chemin stable: je parle pour moi-même, mais au fil des ans, j'ai senti que la communauté Clojure a présenté un cadre Web peu crédible après l'autre. Un couple se sentait tout simplement trop expérimental (mon expérience avec Om et le piédestal côté client) pour "faire avancer les choses" (pas qu'ils ne se révéleront pas supérieurs sur la route). D'un autre côté, j'ai l'impression que @weavejester a apporté à Duct la même stabilité et les mêmes progrès mesurés qu'à Compojure et Ring, qui sont superbement nés dans la communauté.
  • Il est super léger et hors de portée 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 transversales de vos itinéraires HTTP).
  • Prise en charge prête à l'emploi pour le workflow rechargé .
  • Intégration parfaite avec Ring et Compojure.
  • Configurations de développement et de production (quelque chose que j'ai trouvé manifestement manquant 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 nécessite une solide compréhension de Clojure la langue. Je recommande également de lire d'abord le composant.

Sur une autre note personnelle, j'utilise Duct dans plusieurs applications de production depuis plus d'un an maintenant et j'en suis extrêmement satisfait.

KendallB
la source
2

vous pouvez également essayer Clojure on Coils, http://github.com/zubairq/coils - avis de non-responsabilité: je suis l'auteur

Yazz.com
la source
2

Un autre serveur Web intéressant est Http-kit . Il a de bonnes performances et est compatible avec l'anneau, et prend également en charge les WebSockets. Il est fabriqué principalement en clojure et manque de certaines choses étranges dans Jetty / Tomcat.

Il est facile de bricoler.

claj
la source
2

Recadrez et om.next probablement ce que vous recherchez.

ftravers
la source
1

Arachne est un framework web pour les nouveaux arrivants. Citant la description du site:

Arachne est un framework 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.

Voici une bonne discussion à ce sujet avec l'auteur de Luminus (yogthos).

Micah Elliott
la source
1

J'utilise Liberator avec succès en production depuis un certain temps maintenant. C'est un excellent cadre si vous voulez juste les os nus, par exemple si vous créez un service Web RESTful ou quelque chose de similaire. Il s'agit essentiellement d'un wrapper pour ring et compojure et fournit un graphique de décision lors de la validation des demandes entrantes. Il est également extrêmement rapide par rapport à d'autres cadres Web plus volumineux. Si vous voulez commencer quelque part rapidement et lentement, alors Liberator est un excellent choix.

dfbernal
la source