Зрелые веб-рамки Clojure?

Каковы текущие варианты веб-фреймворков Clojure? Я ищу какую-то функциональную матрицу, рассказывающую мне, что поддерживают популярные фреймворки и в какой степени, в том числе:

  • Шаблоны ответов (ответ написан в Clojure или в некоторой другой разметке - например, как JSP с Tiles)
  • сеансы HTTP
  • REST с автоматическим отображением URL-адресов в действия-функции и параметры
  • HTML-формы (параметры доступны как карта, обработка ошибок, проверка)
  • Поток приложений (известный из фреймворков Java - обработчики запросов возвращают идентификаторы действий, которые в конечном итоге обрабатываются средствами визуализации)

Ответ 1

Возможно, мой ответ на Что является хорошей отправной точкой для разработки веб-службы RESTful в Clojure? вопрос о SO может помочь вам. В нем упоминаются некоторые важные веб-библиотеки для Clojure (со ссылками и краткими сводками). Ключевой момент, который я хотел бы повторить здесь, изложен в первом абзаце этого ответа:

Прежде всего, я думаю, что вы вряд ли найдете одно решение, разрешенное для сжатия, чтобы сделать все это в Clojure (за исключением формы библиотеки Java, которая будет использоваться через interop). То, что становится стандартным веб-стеком Clojure, содержит ряд библиотек, которые люди смешивают и сопоставляют разными способами (поскольку они с удовольствием, как правило, полностью совместимы).

К тому я бы добавил, что вы, вероятно, не должны обрабатывать вещи с помощью своего рода "потока приложений", который, возможно, знаете из Java (или, если вы считаете, что вам это действительно нужно, вам, вероятно, придется сворачивать свою собственную библиотеку чтобы поддержать это!). Это хорошо, однако, поскольку люди, похоже, очень довольны технологией Ring handler-a-function, более высокого порядка и промежуточного уровня.


Чтобы обратиться к своим пулям:

  • Шаблоны ответов:
    Существует ряд Clojure -специфических решений, в том числе Enlive и Hiccup (Enlive - очень мощный механизм очистки/шаблонирования/преобразования HTML, Hiccup - это DSL для написания HTML в Clojure с хорошим свойством, которое он делает быстро). Кроме того, это, вероятно, одно место, где имеет смысл сбрасываться на Java и использовать что-то вроде StringTemplate. У этого даже есть хорошая сторона, препятствующая смешиванию шаблонов и логики! (Я считаю, что Стюарт Хэллоуэй упомянул, что Релевантность - его компания - использует эту стратегию в своей работе и имеет большой успех с ней.)

  • HTTP-сессии
    Это будет Sandbar, я полагаю. Автор начал серию blogposts об этом, что выглядит очень многообещающим.

  • REST с автоматическим отображением URL-адресов в action-functions и params
    Это Ring и Compojure и/или Moustache. См. Ниже.

  • HTML-формы (параметры доступны как карта, обработка ошибок, проверка)
    Как указано выше.

  • Прикладной поток (известный из фреймворков Java - обработчики запросов возвращают идентификаторы действий, которые в конечном итоге обрабатываются средствами визуализации)
    Как упоминалось выше, на самом деле это не то, что люди обычно делают в Clojure.


В качестве отправной точки в изучении веб-стека Clojure this Ring tutorial от Ring автор Марк Макгранаган очень полезен. Compojure автор Джеймс Ривз некоторая документация на Compojure. Возможно, мой недавний ответ в "Что представляет собой" большая идея" по сравнению со схемами? вопрос тоже может помочь. Источники звонков также содержат большой документ SPEC.

Ответ 2

Поскольку этот вопрос был первоначально задан/ответил, веб-инфраструктура Noir стала многообещающим решением.

Он использует икоту для шаблонирующей части, но предлагает более полную структуру вокруг этого.

Пример базового кода с главной страницы Noir:

(ns my-app
  (:use noir.core)
  (:require [noir.server :as server]))

(defpage "/welcome" []
    "Welcome to Noir!")

(server/start 8080)

Ответ 3

Я рекомендую вам использовать Luminus, а не из-за его удивительного имени, но также и его функции.

И поскольку Noir больше не поддерживается, я не буду рекомендовать вам его использовать. Это также хороший выбор, чтобы начать с кольца и Compojure с самого начала, чтобы создать свою собственную инфраструктуру.

Ответ 4

Возможно, вы задаете неправильный вопрос. Что я вижу в вашем вопросе: "Какая структура Clojure больше похожа на объектно-ориентированные рамки Java, к которым я привык?". На это нет хорошего ответа; если вы чувствуете себя комфортно с помощью полноценного подхода на стороне сервера (например, Grails или Tapestry), то, возможно, вам стоит остаться там и найти способ реализовать часть вашего бэкэнда в Clojure.

С другой стороны, если вы хотите построить что-то более верное для Clojure, вы можете захотеть найти свой собственный микс. У меня был хороший успех, используя AngularJS и CoffeeScript на клиенте, и Clojure (используя Ring и Bishop) на сервере (хотя мы переходим от Bishop к Liberator). В любом случае, как только вы примете подход веб-приложений "одна страница" и начнете рассматривать серверную сторону как источник и приемник данных, вы обнаружите, что Clojure работает исключительно хорошо.

Ответ 5

попробуйте дорожную основу для быстрого веб-разработчика 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}))