web-dev-qa-db-fra.com

Comparaison des frameworks Web Clojure

Il existe quelques frameworks web pour Clojure

ainsi que certaines bibliothèques pour gérer certaines sous-tâches de développement Web, telles que

  • Enlive pour les modèles
  • Hiccup pour les modèles
  • Ring pour gérer les trucs de niveau inférieur avec les demandes/réponses
  • ClojureQL pour la persistance (il ne semble pas très actif, cependant)

Il existe également des centaines de bibliothèques Java à utiliser. Certains aspects ont déjà été abordés ici et deux d'entre eux se comparent un pe .

Je me demande comment ces frameworks/composants se comparent en termes de maturité, de portée, de facilité de développement, de sentiment Django/RoR, etc.

65
Adam Schmideg

Quand j'ai commencé avec le développement web, c'était avec Clojure. Je n'avais aucune expérience préalable en développement web du tout . Je n'ai pas pu, pour la vie de moi, comprendre Compojure. Je ne sais pas si la documentation pour débutants a été améliorée depuis (il n'y a pas si longtemps) ou non, mais à l'époque, je ne pouvais pas la gérer. Un ami m'a montré la moustache et après avoir lu le fichier README, j'ai pu rassembler ce qui est http://try-clojure.org dans son état actuel. Donc, en ce qui concerne la facilité d'utilisation, je pense que Moustache prend le gâteau pour moi.

Cependant, si this a existé à l'époque, je pourrais chanter un air différent.

Conjure a l'air très cool, bien que très différent des autres frameworks. Compte tenu de mon expérience très limitée avec le développement web en général, je n'ai pas grand-chose à dire à ce sujet, mais Conjure se sent un peu déboussolé pour moi. Il ne se sent tout simplement pas à droite. Il se peut que je ne sois pas habitué à la façon dont il fait les choses.

MISE À JOUR: Cela fait un moment que je n'ai pas écrit ceci. Beaucoup de choses ont changé. Peu de gens utilisent plus Moustache, et il n'est pas vraiment maintenu activement, bien qu'il soit suffisamment complet (et assez simple) pour que cela fonctionne toujours, je recommanderais maintenant d'aller avec Compojure ou Noir à la place. Ces deux cadres sont actuellement maintenus et tous deux sont excellents dans leur travail.

MISE À JOUR 2: Noir est obsolète depuis un certain temps et la plupart de ses fonctionnalités ont été déplacées vers une bibliothèque conçue pour être utilisée à partir de compojure/d'autres cadres Web basés sur des anneaux appelés lib-noir .

41
Rayne

Je sais que cette question est un peu datée ... mais je n'ai pas pu m'empêcher de suggérer Noir comme une option très agréable.

Noir utilise une combinaison de Ring, Compojure et Hiccup pour faire le travail. Vérifiez-le!

21
NickSuperb

Comme mentionné dans le commentaire de Bjorn Lindqvist ci-dessus , Noir est mort . Détails ici .

Envisagez plutôt d'utiliser Compojure et lib-noir .

11
overthink

Penser en termes de cadres est probablement une erreur. La meilleure approche consiste à penser en termes de composants de bibliothèque que vous assemblez afin d'avoir le "cadre" qui convient le mieux à vos besoins.

J'ai utilisé un certain nombre de cadres dans le passé. La plupart d'entre eux font assez bien pour vous permettre de démarrer rapidement avec une application de base. Cependant, sans exception, je les ai tous trouvés frustrants le plus souvent. Souvent, cela est dû à trop de passe-partout ou simplement à sauter à travers des cerceaux qui ne sont pas pertinents pour l'application que vous développez.

En arrivant pour la première fois à Clojure, j'ai commencé à chercher des frameworks, mais j'ai réalisé que ce n'était pas la bonne approche. Au lieu de cela, j'ai trouvé beaucoup mieux de simplement commencer avec une application en anneau de base, puis d'ajouter des bibliothèques selon mes besoins. Cela peut sembler être une courbe d'apprentissage plus longue pour commencer, mais en fait, cela s'avère tout aussi efficace car vous n'êtes pas obligé d'apprendre un tas d'échafaudages de framework dont vous n'avez souvent pas besoin.

Cependant, j'ai trouvé que la recherche de divers cadres était vraiment utile car elle me donne des idées sur la meilleure façon d'intégrer une bibliothèque et, plus important encore, sur l'OMI, comment structurer au mieux votre fichier lein project.clj pour l'adapter au mieux au flux de travail que vous souhaitez.

J'ai trouvé les modèles suivants vraiment utiles. Je n'en utilise aucun tel quel, mais j'ai adapté/volé des idées à bon nombre d'entre eux pour développer les cadres qui conviennent le mieux à l'application sur laquelle je travaille.

  • Luminus et modèles Luminus fournit un cadre très étendu. Je les trouve un peu "lourdes" pour de nombreuses applications, mais il existe de bons exemples d'intégration de diverses bibliothèques Clojure dans votre application. Le site Web principal contient également une documentation utile.

  • Reagent Project , qui inclut un modèle de réactif fournit un bon point de départ pour une application utilisant le support ClojureScript Reagent (react.js). J'ai trouvé que c'était l'une des bibliothèques ClojureScript les plus faciles pour créer une application avec une bonne intégration Javascript.

  • lein-figwheel est un modèle vraiment intéressant utilisant figwheel pour fournir un chargement dynamique de clojurescript afin que vous puissiez voir vos changements ClojureScript dans le navigateur lorsque vous modifiez votre code. De nombreux autres modèles ont désormais ajouté cette fonctionnalité à leurs propres modèles. Développés à l'origine avec Om en tête, les modèles Luminus et Reagent intègrent désormais également la fonctionnalité Figwheel dans leurs modèles. Montre vraiment certains des avantages de Clojure et ClojureScript pour le développement interactif.

  • Compojure Template est un excellent point de départ. Il met en place un projet basé sur compojure très basique avec tous les trucs de base ring et compojure. Excellent moyen de commencer le développement Web de Clojure car il est simple et vous permet de vous concentrer sur les bases avant de vous noyer sous toutes les autres options.

Il existe de nombreux autres modèles et cadres, dont beaucoup n'ont pas encore été examinés. Ces jours-ci, je commence souvent par un modèle de compojure ou un modèle de réactif, puis j'ajoute des bits supplémentaires si et quand cela est nécessaire. J'inclus généralement Selmar pour les modèles et j'utilise essentiellement la même configuration que Luminus utilise.

Peut-être que la partie la plus importante pour obtenir un bon "cadre" pour votre développement Web est d'expérimenter et de comprendre comment lein fonctionne et le fichier lein project.clj. Avoir un bon fichier project.clj déterminera votre flux de travail. Avoir les bons profils, la capacité de démarrer la réplique de différentes manières et de charger différentes bibliothèques qui vous permettent de lancer figwheel ou une réplique de navigateur ou de générer un bocal, etc. est tout à propos de votre fichier project.clj. Faites le bon choix et votre environnement vous fournira exactement le flux de travail dont vous avez besoin.

10
Tim X

Un nouveau joueur est apparu dans la scène comme une bonne alternative pour implémenter REST sont libérateur . Il facilite plus d'exposer vos données en tant que ressources tout en se conformant automatiquement à toutes les exigences de la spécification HTTP RFC-2616 et joue bien avec http-kit et Compojure.

Assez content avec http-kit btw, la fonction de rechargement de code en direct est pratique.

2
Jaime Agudo

essayez le framework road pour un 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}))
2
ainixian2004