Полагаю, это странный вопрос для огромного большинства программистов, работающих ежедневно с Java. Я не. Я знаю Java-язык, потому что я работал над Java-проектами, но не с Java-the-world. Я никогда не делал веб-приложение с нуля на Java. Если мне нужно это сделать с Python, Ruby, я знаю, куда идти (Django или Rails), но если я хочу сделать веб-приложение в Clojure, не потому, что я вынужден жить в мире Java, но потому что мне нравится язык, и я хочу попробовать, какие библиотеки и фреймворки следует использовать?
Как сделать веб-приложение в Clojure?
Ответ 1
На сегодняшний день лучшей веб-картой Clojure, с которой я столкнулся, является Compojure: http://github.com/weavejester/compojure/tree/master
Он маленький, но мощный, и имеет красиво элегантный синтаксис. (Он использует Jetty под капотом, но он скрывает API сервлета от вас, если вы этого не хотите, что не будет часто). Перейдите к README по этому URL-адресу, затем загрузите снимок и начните воспроизведение.
Ответ 2
Compojure больше не является полной основой для разработки веб-приложений. Начиная с выпуска 0,4, compojure был разорван на несколько проектов.
Ring обеспечивает основу, абстрагируя процесс HTTP-запроса и ответа. Ring будет анализировать входящий запрос и создать карту, содержащую все части запроса, такие как uri, имя сервера и метод запроса. Затем приложение обработает запрос и на основе запроса генерирует ответ. Ответ представлен как карта, содержащая следующие ключи: статус, заголовки и тело. Таким образом, простое приложение будет выглядеть так:
(def app [req]
(if (= "/home" (:uri req))
{:status 200
:body "<h3>Welcome Home</h3>"}
{:status 200
:body "<a href='/home'>Go Home!</a>"}))
Еще одна часть Кольца - это концепция среднего класса. Это код, который находится между обработчиком и входящим запросом и/или исходящим ответом. Некоторые встроенные средние предметы включают сеансы и стек. Средство сеанса добавит: ключ сеанса к карте запроса, содержащий всю информацию о сеансе для пользователя, делающего запрос. Если ключ сеанса присутствует на карте ответа, он будет сохранен для следующего запроса, сделанного текущим пользователем. В то время как промежуточное средство трассировки стека будет захватывать любые исключения, возникающие при обработке запроса, и генерировать трассировку стека, которая отправляется обратно в качестве ответа, если происходят какие-либо исключения.
Работа непосредственно с Ring может быть утомительной, поэтому Compojure построена поверх Ring, абстрагируя детали. Теперь приложение можно выразить в терминах маршрутизации, чтобы вы могли иметь что-то вроде этого:
(defroutes my-routes
(GET "/" [] "<h1>Hello all!</h1>")
(GET "/user/:id" [id] (str "<h1>Hello " id "</h1>")))
Compojure все еще работает с картами запроса/ответа, поэтому вы всегда можете получить к ним доступ, если необходимо:
(defroutes my-routes
(GET "*" {uri :uri}
{:staus 200 :body (str "The uri of the current page is: " uri)}))
В этом случае часть {uri: uri} обращается к ключу: uri в карте запроса и устанавливает uri для этого значения.
Последний компонент Hiccup, который упрощает создание html. Различные теги html представлены в виде векторов с первым элементом, представляющим имя тега, а остальное - телом тега. "<h2>A header</h2>"
становится [:h2 "A Header"]
. Атрибуты тега находятся в дополнительной карте. "<a href='/login'>Log In Page</a>"
становится [:a {:href "/login"} "Log In Page"]
. Вот небольшой пример использования шаблона для генерации 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)))
Вот ссылка на черновик какой-либо документации, написанной автором compojure, которая может вам пригодиться: Compojure Doc
Ответ 3
Там также "Noir" (http://www.webnoir.org/), который представляет собой новую веб-инфраструктуру Clojure (так что новые документы не там еще). Исходя из Django/Rails, я копаю простой, простой синтаксис, и он довольно скудный.
Ответ 4
Рассмотрим веб-инфраструктуру Luminus. У меня нет привязанности, но я слышал хорошие вещи от друзей, которых я уважаю.
Ответ 5
Моя текущая веб-библиотека теперь yada.
Если вы только начинаете, вводный сервер Compojure
. Я рассматриваю его как apache
веб-серверов в мире Clojure (в этом случае yada/aleph будет nginx). Вы можете использовать Luminus
в качестве шаблона. Существуют варианты, такие как compojure-api
.
Я попробовал ou Pedestal
и был в целом удовлетворен этим. Я не претендую на то, чтобы овладеть им, но он имеет приятный синтаксис, чувствует себя очень сплоченным и выглядит так, как будто у него отличная производительность. Он также поддерживается Cognitect
(компанией Clojure/Datomic, где работает Rich Hickey).
Я нашел Aleph
, чтобы представить интересную абстракцию, и встроенное противодавление кажется интересным. Мне еще предстоит сыграть с ним, но это определенно в моем списке.
После небольшого разговора с различными веб-серверами, вот мой быстрый список Pro/Cons:
Краткий ответ: посмотрите Luminus, чтобы быстро начать работу, возможно, перейти к чему-то еще по мере того, как ваши потребности эволюционируют (возможно, Yada).
Compojure
-
Плюсы (1):
- легко, множество шаблонов/примеров (например, светящиеся)
-
Минусы (2):
- Не работает (поток за запрос), ожидайте, что показатели немного лучше, чем рельсы.
- Непростая модель промежуточного программного обеспечения имеет неудобства
Пьедестал
-
Плюсы (3):
- модель перехватчика, приятный синтаксис для добавления перехватчиков в подмножество маршрутов.
- маршрутизатор производительности
- поддерживает json/transit/multipart формы прозрачно из коробки, не спрашивая ничего. Очень круто!
-
Минусы (4):
- поддержка websocket (пока), возвращение каналов core.async было бы приятным
- немного медленнее перезагружать, если поместить его в компонент Stuart Sierra (я думаю, вы должны использовать перехватчик перезагрузки)
- нет средств тестирования для асинхронных перехватчиков
- требует бай-ин (?)
Алеф
Pro (3):
- производительным
- противодавление
- Поддержка Websocket/SSE при возврате потока коллектора
Минусы (1):
- Низкий уровень, сделай сам стиль (т.е. он просто дает вам способ заставить обработчиков что-то сделать. Нет маршрутизатора, ничего нет). Не совсем минусы, просто имейте это в виду.
Яд
Pro (3):
- построено на Алефе
- Конфликт контента
- интеграция трюков
- bidi вполне нормально (хотя мне лучше нравится синтаксис маршрутизатора пьедестала)
Минусы (1):
- (хотя и не так плохо, как nginx- clojure, быстро улучшается).
HttpKit
Pro (2):
- Написано в Clojure! (и Java...)
- производительность выглядит неплохо (см. столбец параллельных соединений 600 КБ)
Минусы (2):
- Поддержка CORS
- Ошибки? Кроме того, не так много недавних коммитов
Nginx- Clojure
Примечание. Я не играл с ним, главным образом из-за отсутствия документации. Он выглядит интересным, хотя и очень впечатляющим.
Плюсы (2):
- Nginx (исполнитель, offload ssl, перезапуск рабочих...)
- Может ли эта модель разрешить обновления с нулевым временем простоя? Это было бы так здорово!
Минусы (1):
- Документация (улучшение). Кроме того, я не хочу программировать строки, встроенные в конфигурационный файл nginx, если это единственный способ сделать это.
- Вероятно, немного усложняет первое развертывание (?)
Immutant
Примечание. Я не играл с ним.
Плюсы:
- интегрированный (кэширование, обмен сообщениями, планирование, развертывание wildfly)
Минусы:
- нет http-клиента
Catacumba
Примечание. Я не играл с ним, хотя документация выглядит превосходно. Вероятно, я попытаюсь это сделать дальше. Есть примеры чат-проектов, которые выглядят интересными, их интенсивное использование протоколов сначала отключает меня как новичка Clojure dev.
Плюсы (6):
- документация! Как и все проекты funcool, документ очень приятно читать.
- синтаксис маршрутизации, подобный пьедесталу
- должен быть исполнен (поверх Ratpack)
- противодавление
- websockets, sse, cors, security, ssl...
- уникальные возможности для копания: почтовый
Минусы (2):
- Не совсем уверен в том, насколько приятен синтаксис ct/routes, и о том, чтобы отбросить спецификацию Ring (предположительно для асинхронной истории, но я думал, что ребята из пьедестала исправили это)
- Не уверен, как можно интегрировать swagger и т.д.
- Когда я попробовал, я не смог заставить его работать сразу.
Примечание: ориентир веб-серверов Clojure доступен, если важна сырая производительность.
Ответ 6
В наши дни Pedestal - это рамка, заслуживающая внимания. Это серверная структура, которая строится поверх Ring, но также освобождает входящий запрос из начального потока, будучи в состоянии приостановить и возобновить этот конкретный запрос (в противном случае медленный запрос фактически блокирует этот серверный файл). Может быть, вроде JavaBean.
Другие классные рамки hoplon.io и David Nolen Om (на основе Реагирования)
Ответ 7
Webjure, структура веб-программирования для Clojure.
Особенности: диспетчер сервлета вызывает функции Clojure. Динамическое генерирование HTML. Интерфейс запросов SQL (через JDBC).
Этот ответ подразумевается как заполнитель для информации Webjure.
Ответ 8
Сопоставьте, что я использовал для создания крошечного приложения для ведения блога. Он смоделирован на Sinatra, который представляет собой минимальную, легкую веб-структуру для Ruby. В основном я использовал маршрутизацию, которая, как и Синатра. Это выглядит так:
(GET "/post/:id/:slug"
(some-function-that-returns-html :id :slug))
Там нет библиотеки ORM или templating, но у нее есть функции, которые превращают векторы в HTML.
Ответ 9
Вы также можете посмотреть эти рамки (взятые из disclojure/projects):
Есть еще один связанный с этим вопрос о переполнении стека: зрелые Clojure веб-фреймворки?
Ответ 10
Отказ от ответственности: я автор.
Я собрал шаблон leiningen, в котором сочетаются шаблоны luminusweb и каштановые.
Таким образом, вы получаете что-то, что вы можете построить код clojure с кодом и clojurescript для front и backend.
Кроме того, он обеспечивает управление пользователями, а также некоторое простое создание CRUD и еще несколько небольших приятных возможностей: https://github.com/sveri/closp
Ответ 11
вы также можете попробовать Clojure on Coils, http://github.com/zubairq/coils - отказ от ответственности: я автор
Ответ 12
Другим интересным веб-сервером является Http-kit. Он имеет хорошую производительность и совместим с кольцом, а также поддерживает WebSockets. Он сделан главным образом в clojure, и ему не хватает некоторых странных вещей в Jetty/Tomcat.
Легко возиться с.
Ответ 13
Я запишу два цента за Duct, также из @weavejester, сопровождающий Compojure и Ring.
В этом ядре он приносит Component и кольцевой маршрутизатор под одной крышей. Причины, по которым я использую Канал:
- Отличная философская основа: она побуждает вас создавать свое приложение в виде серии небольших компонентов, и оно поражает хороший баланс между тем, чтобы придерживаться нескольких мнений, обеспечивая при этом разумные значения по умолчанию.
- Стабильный путь: я говорю сам за себя, но на протяжении многих лет я чувствовал, что сообщество Clojure представило одну менее чем заслуживающую доверия веб-структуру за другим. Пара просто чувствовала себя слишком экспериментально (мой опыт работы с Om и клиентским пьедесталом) для "выполнения дела" (не то, чтобы они не оказались выше по дороге). С другой стороны, я чувствую, что @weavejester принес такую же стабильность и измеренный прогресс в Канал, что он сделал с Compojure и Ring, которые были великолепно рождены в сообществе.
- Это суперлегкий вес и из-за моих компонентов.
Основные возможности:
- Организует маршруты по "конечным точкам", небольшим компонентам, которые можно рассматривать как мини-веб-серверы (или небольшие поперечные сечения ваших HTTP-маршрутов).
- Встроенная поддержка Перезагруженный рабочий процесс.
- Идеальная интеграция с Ring и Compojure.
- Конфигурации разработки и производства (что-то, что я обнаружил, пропавших без вести в другом месте).
- Хорошая документация с примерами.
Примечание.. Само собой разумеется, но в интересах новичков веб-разработки, таких как большинство вещей Clojurey. Duct требует четкого понимания языка Clojure. Я также рекомендую сначала прочитать о компоненте.
В другой личной заметке я уже более года использую канал в нескольких производственных приложениях и очень доволен им.
Ответ 14
Reframe и om.next, вероятно, то, что вы ищете.
Ответ 15
Arachne - это новая веб-среда. Цитирование описания сайта:
Arachne - это полная, высоко модульная структура веб-разработки для Clojure. Он подчеркивает легкость, простоту и прочную, масштабируемую дизайн.
Он имеет кампания kickstarter заявив, что предложит "начальный" опыт, похожий на Rails. это разработанный Cognitect.
Здесь хорошее обсуждение об этом с автором Luminus (yogthos).
Ответ 16
Я уже давно использовал Liberator в производстве. Это отличная структура, если вы хотите только голые кости, например. если вы создаете веб-службу RESTful или что-то подобное. Это, по сути, обертка для кольца и компоновки и предоставляет граф решений при проверке входящих запросов. Это также очень быстро по сравнению с другими более громоздкими веб-фреймами. Если вы хотите начать где-то быстро и медленно строить, то Liberator - отличный выбор.