Des frameworks web Clojure matures?

Quels sont les choix actuels des frameworks Web Clojure matures? Je cherche une sorte de masortingce de fonctionnalités pour me dire ce que les frameworks populaires supportent et dans quelle mesure, y compris:

  • Réponse aux modèles (réponse écrite en Clojure ou dans un autre balisage – par exemple, JSP avec Tiles)
  • Sessions HTTP
  • REST avec mappage automatique des URL en fonctions et parameters
  • Formulaires HTML (parameters disponibles sous forme de carte, traitement des erreurs, validation)
  • Flux d’application (connu depuis les frameworks Java – les gestionnaires de requêtes renvoient des identifiants d’action qui sont éventuellement traités par les moteurs de rendu)

Peut – être ma réponse à la question Quel est le bon sharepoint départ pour développer le service Web RESTful à Clojure? question sur SO pourrait vous être utile. Il mentionne des bibliothèques Web importantes pour Clojure (avec des liens et de courts résumés). Le point clé que je voudrais réitérer ici est exposé dans le premier paragraphe de cette réponse:

Tout d’abord, je pense qu’il est peu probable que vous trouviez une seule solution rétractable pour faire tout cela dans Clojure (sauf sous la forme d’une bibliothèque Java à utiliser via l’interopérabilité). Ce qui est en train de devenir la stack Web standard de Clojure comprend un certain nombre de bibliothèques que les gens mélangent et correspondent de toutes sortes de manières (car ils ont tendance à être parfaitement compatibles).

À cela, j’appendais que vous ne devriez probablement pas vous attendre à manipuler les choses avec le type de “stream d’application” que vous pourriez connaître de Java (ou si vous en avez vraiment besoin, vous devrez probablement déployer votre propre librairie pour le prendre en charge) !). Cela va, cependant, car les gens semblent être très satisfaits de l’approche du gestionnaire, c’est-à-dire une fonction, un middleware d’ordre supérieur.


Pour répondre à vos questions:

  • Réponse aux modèles:
    Il existe un certain nombre de solutions spécifiques à Clojure, y compris Enlive et Hiccup (Enlive est un moteur de grattage / modélisation / transformation HTML très puissant; Hiccup est un DSL pour écrire du HTML dans Clojure avec la propriété intéressante qu’il rend rapidement ). En outre, il s’agit probablement d’un endroit où il est parfaitement logique de passer à Java et d’utiliser quelque chose comme, par exemple, SsortingngTemplate . Cela a même le bon côté de décourager le mélange de modèles et de logique! (Je crois que Stuart Halloway a mentionné que Relevance – son entreprise – utilise cette stratégie dans son travail et en tire un grand succès.)

  • Sessions HTTP
    Ce serait Sandbar , je suppose. L’auteur a lancé une série d’articles sur le blog qui semblent très prometteurs.

  • REST avec mappage automatique des URL en fonctions et parameters
    C’est Ring & Compojure et / ou Moustache . Voir ci-dessous.

  • Formulaires HTML (parameters disponibles sous forme de carte, traitement des erreurs, validation)
    Comme ci-dessus

  • Flux d’application (connu depuis les frameworks Java – les gestionnaires de requêtes renvoient des identifiants d’action qui sont éventuellement traités par les moteurs de rendu)
    Comme mentionné ci-dessus, pas vraiment quelque chose que les gens ont tendance à faire dans Clojure.


Comme sharepoint départ pour apprendre la stack web de Clojure, ce tutoriel de Ring par Mark McGranaghan, auteur de Ring, est très utile. L’auteur de Compojure , James Reeves, a de la documentation sur Compojure. Peut – être ma réponse récente à la question de savoir quelle est la «grande idée» derrière les itinéraires de compojure? question pourrait être utile aussi. Les sources de Ring comprennent également un excellent document SPEC.

Depuis que cette question a été posée / répondue à l’origine, le framework Web Noir est apparu comme une solution prometteuse.

Il utilise le hoquet pour la partie modèle, mais offre un cadre plus complet autour de cela.

Exemple de code de base de la page principale de Noir:

 (ns my-app (:use noir.core) (:require [noir.server :as server])) (defpage "/welcome" [] "Welcome to Noir!") (server/start 8080) 

Je vous recommanderai d’utiliser Luminus , non pas à cause de son nom génial, mais aussi de sa fonctionnalité.

Et comme Noir n’est plus maintenu, je ne vous recommanderai pas de l’utiliser. C’est aussi un bon choix de commencer par ring & Compojure dès le début pour construire votre propre framework.

Vous posez peut-être la mauvaise question. Ce que je vois dans votre question est “quel framework Clojure ressemble le plus aux frameworks orientés object Java auxquels je suis habitué?”. Il n’y a pas de bonne réponse à cela; Si vous vous sentez à l’aise avec une approche côté serveur (telle que Grails ou Tapestry), vous devriez peut-être restr là et trouver un moyen de mettre en œuvre certains de vos backend dans Clojure.

D’un autre côté, si vous voulez construire quelque chose de plus fidèle à Clojure, vous voudrez peut-être trouver votre propre mix. J’ai eu un certain succès en utilisant AngularJS et CoffeeScript sur le client, et Clojure (en utilisant Ring et Bishop) sur le serveur (bien que nous passions de Bishop à Liberator). Dans tous les cas, une fois que vous avez adopté l’approche de l’application Web «une seule page» et que vous commencez à traiter le serveur en tant que source et source de données, vous constaterez que Clojure fonctionne de manière exceptionnelle.

essayez le cadre routier pour le développement web rapide https://github.com/zhujinxian/road

 (defn render-test [ret tmt] (-> (resp/response "------render----test------") (#(resp/content-type %1 "text/plain")))) (defn foo "I don't do a whole lot." [x] (str "来自源码目录的参数:" x)) (defn handler [^Integer x] {:$r render-test :text (str "hello world, road goes sucess!" (foo x))}) (defn home [req content ^Integer num] {:hiccup "home.clj" :content (str "home" content) :num num}) (defroad road (GET "/web-test-0.1.0-SNAPSHOT-standalone/main" handler) (GET "/web-test-0.1.0-SNAPSHOT-standalone/home/:num{\\d+}" home)) (defn -main [& args] (log/info "---------log4j test-------") (jetty/run-jetty road {:port 3000}))